@@ -11,6 +11,7 @@ import '../api/model/model_checks.dart';
11
11
import '../example_data.dart' as eg;
12
12
import '../stdlib_checks.dart' ;
13
13
import 'message_list_test.dart' ;
14
+ import 'store_checks.dart' ;
14
15
import 'test_store.dart' ;
15
16
16
17
void main () {
@@ -153,6 +154,88 @@ void main() {
153
154
});
154
155
});
155
156
157
+ group ('handleUpdateMessageEvent' , () {
158
+ test ('update a message' , () async {
159
+ final originalMessage = eg.streamMessage (
160
+ content: "<p>Hello, world</p>" );
161
+ final updateEvent = eg.updateMessageEditEvent (originalMessage,
162
+ flags: [MessageFlag .starred],
163
+ renderedContent: "<p>Hello, edited</p>" ,
164
+ editTimestamp: 99999 ,
165
+ isMeMessage: true ,
166
+ );
167
+ prepare ();
168
+ await prepareMessages ([originalMessage]);
169
+
170
+ final message = store.messages.values.single;
171
+ check (message)
172
+ ..content.not ((it) => it.equals (updateEvent.renderedContent! ))
173
+ ..lastEditTimestamp.isNull ()
174
+ ..flags.not ((it) => it.deepEquals (updateEvent.flags))
175
+ ..isMeMessage.not ((it) => it.equals (updateEvent.isMeMessage! ));
176
+
177
+ await store.handleEvent (updateEvent);
178
+ checkNotifiedOnce ();
179
+ check (store).messages.values.single
180
+ ..identicalTo (message)
181
+ ..content.equals (updateEvent.renderedContent! )
182
+ ..lastEditTimestamp.equals (updateEvent.editTimestamp)
183
+ ..flags.equals (updateEvent.flags)
184
+ ..isMeMessage.equals (updateEvent.isMeMessage! );
185
+ });
186
+
187
+ test ('ignore when message unknown' , () async {
188
+ final originalMessage = eg.streamMessage (
189
+ content: "<p>Hello, world</p>" );
190
+ final updateEvent = eg.updateMessageEditEvent (originalMessage,
191
+ messageId: originalMessage.id + 1 ,
192
+ renderedContent: "<p>Hello, edited</p>" ,
193
+ );
194
+ prepare ();
195
+ await prepareMessages ([originalMessage]);
196
+
197
+ await store.handleEvent (updateEvent);
198
+ checkNotNotified ();
199
+ check (store).messages.values.single
200
+ ..content.equals (originalMessage.content)
201
+ ..content.not ((it) => it.equals (updateEvent.renderedContent! ));
202
+ });
203
+
204
+ // TODO(server-5): Cut legacy case for rendering-only message update
205
+ Future <void > checkRenderingOnly ({required bool legacy}) async {
206
+ final originalMessage = eg.streamMessage (
207
+ lastEditTimestamp: 78492 ,
208
+ content: "<p>Hello, world</p>" );
209
+ final updateEvent = eg.updateMessageEditEvent (originalMessage,
210
+ renderedContent: "<p>Hello, world</p> <div>Some link preview</div>" ,
211
+ editTimestamp: 99999 ,
212
+ renderingOnly: legacy ? null : true ,
213
+ userId: null ,
214
+ );
215
+ prepare ();
216
+ await prepareMessages ([originalMessage]);
217
+ final message = store.messages.values.single;
218
+
219
+ await store.handleEvent (updateEvent);
220
+ checkNotifiedOnce ();
221
+ check (store).messages.values.single
222
+ ..identicalTo (message)
223
+ // Content is updated...
224
+ ..content.equals (updateEvent.renderedContent! )
225
+ // ... edit timestamp is not.
226
+ ..lastEditTimestamp.equals (originalMessage.lastEditTimestamp)
227
+ ..lastEditTimestamp.not ((it) => it.equals (updateEvent.editTimestamp));
228
+ }
229
+
230
+ test ('rendering-only update does not change timestamp' , () async {
231
+ await checkRenderingOnly (legacy: false );
232
+ });
233
+
234
+ test ('rendering-only update does not change timestamp (for old server versions)' , () async {
235
+ await checkRenderingOnly (legacy: true );
236
+ });
237
+ });
238
+
156
239
group ('handleReactionEvent' , () {
157
240
ReactionEvent mkEvent (Reaction reaction, ReactionOp op, int messageId) {
158
241
return ReactionEvent (
0 commit comments