Skip to content

Commit 2272e77

Browse files
committed
autocomplete test: Include all the cases which cause results to be recomputed
1 parent a2aa1d4 commit 2272e77

File tree

1 file changed

+102
-25
lines changed

1 file changed

+102
-25
lines changed

test/model/autocomplete_test.dart

Lines changed: 102 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:test/scaffolding.dart';
88
import 'package:zulip/api/model/model.dart';
99
import 'package:zulip/model/autocomplete.dart';
1010
import 'package:zulip/model/narrow.dart';
11+
import 'package:zulip/model/store.dart';
1112
import 'package:zulip/widgets/compose_box.dart';
1213

1314
import '../example_data.dart' as eg;
@@ -274,35 +275,111 @@ void main() {
274275
}
275276
});
276277

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 does retry', () {
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);
284289

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);
288293

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
301294
await Future(() {});
302-
check(view.results).single
303-
.isA<UserMentionAutocompleteResult>()
304-
.userId.equals(10000);
295+
check(done).equals(false);
296+
297+
await act(store);
298+
299+
await Future(() {});
300+
check(done).equals(false);
301+
await Future(() {});
302+
check(done).equals(true);
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'));
305318
}
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
332+
.isA<UserMentionAutocompleteResult>()
333+
.userId.equals(10000);
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+
});
306383
});
307384

308385
group('MentionAutocompleteQuery.testUser', () {

0 commit comments

Comments
 (0)