@@ -8,6 +8,7 @@ import 'package:test/scaffolding.dart';
8
8
import 'package:zulip/api/model/model.dart' ;
9
9
import 'package:zulip/model/autocomplete.dart' ;
10
10
import 'package:zulip/model/narrow.dart' ;
11
+ import 'package:zulip/model/store.dart' ;
11
12
import 'package:zulip/widgets/compose_box.dart' ;
12
13
13
14
import '../example_data.dart' as eg;
@@ -274,35 +275,111 @@ void main() {
274
275
}
275
276
});
276
277
277
- test ('MentionAutocompleteView mutating store.users while in progress causes retry' , () async {
278
- const narrow = CombinedFeedNarrow ();
279
- final store = eg.store ();
280
- for (int i = 0 ; i < 1500 ; i++ ) {
281
- await store.addUser (eg.user (userId: i, email: 'user$i @example.com' , fullName: 'User $i ' ));
282
- }
283
- final view = MentionAutocompleteView .init (store: store, narrow: narrow);
278
+ group ('MentionAutocompleteView recomputes results' , () {
279
+ Future <void > doCheck ({
280
+ required List <User > users,
281
+ required String rawQuery,
282
+ required Future <void > Function (PerAccountStore store) act,
283
+ required void Function (Iterable <MentionAutocompleteResult >) expect,
284
+ }) async {
285
+ const narrow = CombinedFeedNarrow ();
286
+ final store = eg.store ();
287
+ await store.addUsers (users);
288
+ final view = MentionAutocompleteView .init (store: store, narrow: narrow);
284
289
285
- bool done = false ;
286
- view.addListener (() { done = true ; });
287
- view.query = MentionAutocompleteQuery ('User 10000' );
290
+ bool done = false ;
291
+ view.addListener (() { done = true ; });
292
+ view.query = MentionAutocompleteQuery (rawQuery );
288
293
289
- await Future (() {});
290
- check (done).isFalse ();
291
- await store.
addUser (eg.
user (userId
: 10000 , email
: '[email protected] ' , fullName
: 'User 10000' ));
292
- await Future (() {});
293
- check (done).isFalse ();
294
- await Future (() {});
295
- check (done).isTrue ();
296
- check (view.results).single
297
- .isA <UserMentionAutocompleteResult >()
298
- .userId.equals (10000 );
299
- // new result sticks; no "zombie" result from `store.users` pre-mutation
300
- for (int i = 0 ; i < 10 ; i++ ) { // for good measure
301
294
await Future (() {});
302
- check (view.results).single
295
+ check (done).isFalse ();
296
+
297
+ await act (store);
298
+
299
+ await Future (() {});
300
+ check (done).isFalse ();
301
+ await Future (() {});
302
+ check (done).isTrue ();
303
+ expect (view.results);
304
+ // new result sticks; no "zombie" result
305
+ for (int i = 0 ; i < 10 ; i++ ) { // for good measure
306
+ await Future (() {});
307
+ expect (view.results);
308
+ }
309
+ }
310
+
311
+ List <User > generateUsers ({required int count}) {
312
+ return List .generate (
313
+ count,
314
+ (i) => eg.user (
315
+ userId: i,
316
+ email: 'user$i @example.com' ,
317
+ fullName: 'User $i ' ));
318
+ }
319
+
320
+ test ('RealmUserAddEvent' , () async {
321
+ final users = generateUsers (count: 1500 );
322
+
323
+ Future <void > act (PerAccountStore store) async {
324
+ await store.addUser (eg.user (
325
+ userId: 10000 ,
326
+
327
+ fullName: 'User 10000' ));
328
+ }
329
+
330
+ void expect (Iterable <MentionAutocompleteResult > results) {
331
+ check (results).single
303
332
.isA <UserMentionAutocompleteResult >()
304
333
.userId.equals (10000 );
305
- }
334
+ }
335
+
336
+ await doCheck (
337
+ users: users,
338
+ rawQuery: 'User 10000' ,
339
+ act: act,
340
+ expect: expect,
341
+ );
342
+ });
343
+
344
+ test ('RealmUserRemoveEvent' , () async {
345
+ final users = generateUsers (count: 1500 );
346
+
347
+ Future <void > act (PerAccountStore store) async {
348
+ await store.removeUser (1495 );
349
+ }
350
+
351
+ void expect (Iterable <MentionAutocompleteResult > results) {
352
+ check (results).isEmpty ();
353
+ }
354
+
355
+ await doCheck (
356
+ users: users,
357
+ rawQuery: 'User 1495' ,
358
+ act: act,
359
+ expect: expect,
360
+ );
361
+ });
362
+
363
+ test ('RealmUserUpdateEvent' , () async {
364
+ final users = generateUsers (count: 1500 );
365
+
366
+ Future <void > act (PerAccountStore store) async {
367
+ await store.updateUser (1 , fullName: 'Updated User 1' );
368
+ }
369
+
370
+ void expect (Iterable <MentionAutocompleteResult > results) {
371
+ check (results).single
372
+ .isA <UserMentionAutocompleteResult >()
373
+ .userId.equals (1 );
374
+ }
375
+
376
+ await doCheck (
377
+ users: users,
378
+ rawQuery: 'Updated User 1' ,
379
+ act: act,
380
+ expect: expect,
381
+ );
382
+ });
306
383
});
307
384
308
385
group ('MentionAutocompleteQuery.testUser' , () {
0 commit comments