Skip to content

Commit 95de3d0

Browse files
committed
compose test [nfc]: Extract prepareComposeBox
Later, tests can reuse this helper and set up the store freely while still getting the invariant check for the narrow. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 4569f5e commit 95de3d0

File tree

1 file changed

+53
-47
lines changed

1 file changed

+53
-47
lines changed

test/widgets/compose_box_test.dart

Lines changed: 53 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,14 @@ void main() {
4242
late ComposeBoxController? controller;
4343

4444
Future<void> prepareComposeBox(WidgetTester tester, {
45+
required Account account,
4546
required Narrow narrow,
46-
User? selfUser,
47-
List<User> users = const [],
48-
List<ZulipStream> streams = const [],
4947
}) async {
5048
if (narrow case ChannelNarrow(:var streamId) || TopicNarrow(: var streamId)) {
51-
assert(streams.any((stream) => stream.streamId == streamId),
49+
assert(store.streams.values.any((stream) => stream.streamId == streamId),
5250
'Add a channel with "streamId" the same as of $narrow.streamId to the store.');
5351
}
54-
addTearDown(testBinding.reset);
55-
selfUser ??= eg.selfUser;
56-
final selfAccount = eg.account(user: selfUser);
57-
await testBinding.globalStore.add(selfAccount, eg.initialSnapshot());
58-
59-
store = await testBinding.globalStore.perAccount(selfAccount.id);
60-
61-
await store.addUsers([selfUser, ...users]);
62-
await store.addStreams(streams);
63-
connection = store.connection as FakeApiConnection;
64-
65-
await tester.pumpWidget(TestZulipApp(accountId: selfAccount.id,
52+
await tester.pumpWidget(TestZulipApp(accountId: account.id,
6653
child: Column(
6754
// This positions the compose box at the bottom of the screen,
6855
// simulating the layout of the message list page.
@@ -75,6 +62,25 @@ void main() {
7562
controller = tester.state<ComposeBoxState>(find.byType(ComposeBox)).controller;
7663
}
7764

65+
Future<void> prepare(WidgetTester tester, {
66+
required Narrow narrow,
67+
User? selfUser,
68+
List<User> users = const [],
69+
List<ZulipStream> streams = const [],
70+
}) async {
71+
addTearDown(testBinding.reset);
72+
selfUser ??= eg.selfUser;
73+
final selfAccount = eg.account(user: selfUser);
74+
await testBinding.globalStore.add(selfAccount, eg.initialSnapshot());
75+
76+
store = await testBinding.globalStore.perAccount(selfAccount.id);
77+
78+
await store.addUsers([selfUser, ...users]);
79+
await store.addStreams(streams);
80+
connection = store.connection as FakeApiConnection;
81+
await prepareComposeBox(tester, account: selfAccount, narrow: narrow);
82+
}
83+
7884
/// Set the topic input's text to [topic], using [WidgetTester.enterText].
7985
Future<void> enterTopic(WidgetTester tester, {
8086
required ChannelNarrow narrow,
@@ -236,7 +242,7 @@ void main() {
236242
addTearDown(TypingNotifier.debugReset);
237243

238244
final narrow = ChannelNarrow(channel.streamId);
239-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
245+
await prepare(tester, narrow: narrow, streams: [channel]);
240246
await enterTopic(tester, narrow: narrow, topic: 'some topic');
241247
await enterContent(tester, content);
242248
}
@@ -273,7 +279,7 @@ void main() {
273279
addTearDown(TypingNotifier.debugReset);
274280

275281
final narrow = ChannelNarrow(channel.streamId);
276-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
282+
await prepare(tester, narrow: narrow, streams: [channel]);
277283
await enterTopic(tester, narrow: narrow, topic: topic);
278284
await enterContent(tester, 'some content');
279285
}
@@ -331,14 +337,14 @@ void main() {
331337

332338
testWidgets('_StreamComposeBox', (tester) async {
333339
final channel = eg.stream();
334-
await prepareComposeBox(tester,
340+
await prepare(tester,
335341
narrow: ChannelNarrow(channel.streamId), streams: [channel]);
336342
checkComposeBoxTextFields(tester, expectTopicTextField: true);
337343
});
338344

339345
testWidgets('_FixedDestinationComposeBox', (tester) async {
340346
final channel = eg.stream();
341-
await prepareComposeBox(tester,
347+
await prepare(tester,
342348
narrow: eg.topicNarrow(channel.streamId, 'topic'), streams: [channel]);
343349
checkComposeBoxTextFields(tester, expectTopicTextField: false);
344350
});
@@ -358,7 +364,7 @@ void main() {
358364
}
359365

360366
testWidgets('smoke TopicNarrow', (tester) async {
361-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
367+
await prepare(tester, narrow: narrow, streams: [channel]);
362368

363369
await checkStartTyping(tester, narrow);
364370

@@ -370,7 +376,7 @@ void main() {
370376
testWidgets('smoke DmNarrow', (tester) async {
371377
final narrow = DmNarrow.withUsers(
372378
[eg.otherUser.userId], selfUserId: eg.selfUser.userId);
373-
await prepareComposeBox(tester, narrow: narrow);
379+
await prepare(tester, narrow: narrow);
374380

375381
await checkStartTyping(tester, narrow);
376382

@@ -382,7 +388,7 @@ void main() {
382388
testWidgets('smoke ChannelNarrow', (tester) async {
383389
final narrow = ChannelNarrow(channel.streamId);
384390
final destinationNarrow = eg.topicNarrow(narrow.streamId, 'test topic');
385-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
391+
await prepare(tester, narrow: narrow, streams: [channel]);
386392
await enterTopic(tester, narrow: narrow, topic: 'test topic');
387393

388394
await checkStartTyping(tester, destinationNarrow);
@@ -393,7 +399,7 @@ void main() {
393399
});
394400

395401
testWidgets('clearing text sends a "typing stopped" notice', (tester) async {
396-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
402+
await prepare(tester, narrow: narrow, streams: [channel]);
397403

398404
await checkStartTyping(tester, narrow);
399405

@@ -403,7 +409,7 @@ void main() {
403409
});
404410

405411
testWidgets('hitting send button sends a "typing stopped" notice', (tester) async {
406-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
412+
await prepare(tester, narrow: narrow, streams: [channel]);
407413

408414
await checkStartTyping(tester, narrow);
409415

@@ -449,7 +455,7 @@ void main() {
449455
testWidgets('for content input, unfocusing sends a "typing stopped" notice', (tester) async {
450456
final narrow = ChannelNarrow(channel.streamId);
451457
final destinationNarrow = eg.topicNarrow(narrow.streamId, 'test topic');
452-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
458+
await prepare(tester, narrow: narrow, streams: [channel]);
453459
await enterTopic(tester, narrow: narrow, topic: 'test topic');
454460

455461
await checkStartTyping(tester, destinationNarrow);
@@ -461,7 +467,7 @@ void main() {
461467
});
462468

463469
testWidgets('selection change sends a "typing started" notice', (tester) async {
464-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
470+
await prepare(tester, narrow: narrow, streams: [channel]);
465471

466472
await checkStartTyping(tester, narrow);
467473

@@ -481,7 +487,7 @@ void main() {
481487
});
482488

483489
testWidgets('unfocusing app sends a "typing stopped" notice', (tester) async {
484-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
490+
await prepare(tester, narrow: narrow, streams: [channel]);
485491

486492
await checkStartTyping(tester, narrow);
487493

@@ -511,7 +517,7 @@ void main() {
511517
addTearDown(TypingNotifier.debugReset);
512518

513519
final zulipLocalizations = GlobalLocalizations.zulipLocalizations;
514-
await prepareComposeBox(tester, narrow: eg.topicNarrow(123, 'some topic'),
520+
await prepare(tester, narrow: eg.topicNarrow(123, 'some topic'),
515521
streams: [eg.stream(streamId: 123)]);
516522

517523
await enterContent(tester, 'hello world');
@@ -579,7 +585,7 @@ void main() {
579585

580586
final channel = eg.stream();
581587
final narrow = ChannelNarrow(channel.streamId);
582-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
588+
await prepare(tester, narrow: narrow, streams: [channel]);
583589

584590
// (When we check that the send button looks disabled, it should be because
585591
// the file is uploading, not a pre-existing reason.)
@@ -638,7 +644,7 @@ void main() {
638644

639645
final channel = eg.stream();
640646
final narrow = ChannelNarrow(channel.streamId);
641-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
647+
await prepare(tester, narrow: narrow, streams: [channel]);
642648

643649
// (When we check that the send button looks disabled, it should be because
644650
// the file is uploading, not a pre-existing reason.)
@@ -745,15 +751,15 @@ void main() {
745751
group('1:1 DMs', () {
746752
testWidgets('compose box replaced with a banner', (tester) async {
747753
final deactivatedUser = eg.user(isActive: false);
748-
await prepareComposeBox(tester, narrow: dmNarrowWith(deactivatedUser),
754+
await prepare(tester, narrow: dmNarrowWith(deactivatedUser),
749755
users: [deactivatedUser]);
750756
checkComposeBox(isShown: false);
751757
});
752758

753759
testWidgets('active user becomes deactivated -> '
754760
'compose box is replaced with a banner', (tester) async {
755761
final activeUser = eg.user(isActive: true);
756-
await prepareComposeBox(tester, narrow: dmNarrowWith(activeUser),
762+
await prepare(tester, narrow: dmNarrowWith(activeUser),
757763
users: [activeUser]);
758764
checkComposeBox(isShown: true);
759765

@@ -764,7 +770,7 @@ void main() {
764770
testWidgets('deactivated user becomes active -> '
765771
'banner is replaced with the compose box', (tester) async {
766772
final deactivatedUser = eg.user(isActive: false);
767-
await prepareComposeBox(tester, narrow: dmNarrowWith(deactivatedUser),
773+
await prepare(tester, narrow: dmNarrowWith(deactivatedUser),
768774
users: [deactivatedUser]);
769775
checkComposeBox(isShown: false);
770776

@@ -776,15 +782,15 @@ void main() {
776782
group('group DMs', () {
777783
testWidgets('compose box replaced with a banner', (tester) async {
778784
final deactivatedUsers = [eg.user(isActive: false), eg.user(isActive: false)];
779-
await prepareComposeBox(tester, narrow: groupDmNarrowWith(deactivatedUsers),
785+
await prepare(tester, narrow: groupDmNarrowWith(deactivatedUsers),
780786
users: deactivatedUsers);
781787
checkComposeBox(isShown: false);
782788
});
783789

784790
testWidgets('at least one user becomes deactivated -> '
785791
'compose box is replaced with a banner', (tester) async {
786792
final activeUsers = [eg.user(isActive: true), eg.user(isActive: true)];
787-
await prepareComposeBox(tester, narrow: groupDmNarrowWith(activeUsers),
793+
await prepare(tester, narrow: groupDmNarrowWith(activeUsers),
788794
users: activeUsers);
789795
checkComposeBox(isShown: true);
790796

@@ -795,7 +801,7 @@ void main() {
795801
testWidgets('all deactivated users become active -> '
796802
'banner is replaced with the compose box', (tester) async {
797803
final deactivatedUsers = [eg.user(isActive: false), eg.user(isActive: false)];
798-
await prepareComposeBox(tester, narrow: groupDmNarrowWith(deactivatedUsers),
804+
await prepare(tester, narrow: groupDmNarrowWith(deactivatedUsers),
799805
users: deactivatedUsers);
800806
checkComposeBox(isShown: false);
801807

@@ -819,7 +825,7 @@ void main() {
819825

820826
for (final (String narrowType, Narrow narrow) in narrowTestCases) {
821827
testWidgets('compose box is shown in $narrowType narrow', (tester) async {
822-
await prepareComposeBox(tester,
828+
await prepare(tester,
823829
narrow: narrow,
824830
selfUser: eg.user(role: UserRole.administrator),
825831
streams: [eg.stream(streamId: 1,
@@ -828,7 +834,7 @@ void main() {
828834
});
829835

830836
testWidgets('error banner is shown in $narrowType narrow', (tester) async {
831-
await prepareComposeBox(tester,
837+
await prepare(tester,
832838
narrow: narrow,
833839
selfUser: eg.user(role: UserRole.moderator),
834840
streams: [eg.stream(streamId: 1,
@@ -839,7 +845,7 @@ void main() {
839845

840846
testWidgets('user loses privilege -> compose box is replaced with the banner', (tester) async {
841847
final selfUser = eg.user(role: UserRole.administrator);
842-
await prepareComposeBox(tester,
848+
await prepare(tester,
843849
narrow: const ChannelNarrow(1),
844850
selfUser: selfUser,
845851
streams: [eg.stream(streamId: 1,
@@ -854,7 +860,7 @@ void main() {
854860

855861
testWidgets('user gains privilege -> banner is replaced with the compose box', (tester) async {
856862
final selfUser = eg.user(role: UserRole.guest);
857-
await prepareComposeBox(tester,
863+
await prepare(tester,
858864
narrow: const ChannelNarrow(1),
859865
selfUser: selfUser,
860866
streams: [eg.stream(streamId: 1,
@@ -872,7 +878,7 @@ void main() {
872878
final channel = eg.stream(streamId: 1,
873879
channelPostPolicy: ChannelPostPolicy.any);
874880

875-
await prepareComposeBox(tester,
881+
await prepare(tester,
876882
narrow: const ChannelNarrow(1),
877883
selfUser: selfUser,
878884
streams: [channel]);
@@ -890,7 +896,7 @@ void main() {
890896
final channel = eg.stream(streamId: 1,
891897
channelPostPolicy: ChannelPostPolicy.administrators);
892898

893-
await prepareComposeBox(tester,
899+
await prepare(tester,
894900
narrow: const ChannelNarrow(1),
895901
selfUser: selfUser,
896902
streams: [channel]);
@@ -937,7 +943,7 @@ void main() {
937943
}
938944

939945
testWidgets('normal text scale factor', (tester) async {
940-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
946+
await prepare(tester, narrow: narrow, streams: [stream]);
941947

942948
await checkContentInputMaxHeight(tester,
943949
maxHeight: verticalPadding + 170, maxVisibleLines: 8);
@@ -946,23 +952,23 @@ void main() {
946952
testWidgets('lower text scale factor', (tester) async {
947953
tester.platformDispatcher.textScaleFactorTestValue = 0.8;
948954
addTearDown(tester.platformDispatcher.clearTextScaleFactorTestValue);
949-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
955+
await prepare(tester, narrow: narrow, streams: [stream]);
950956
await checkContentInputMaxHeight(tester,
951957
maxHeight: verticalPadding + 170 * 0.8, maxVisibleLines: 8);
952958
});
953959

954960
testWidgets('higher text scale factor', (tester) async {
955961
tester.platformDispatcher.textScaleFactorTestValue = 1.5;
956962
addTearDown(tester.platformDispatcher.clearTextScaleFactorTestValue);
957-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
963+
await prepare(tester, narrow: narrow, streams: [stream]);
958964
await checkContentInputMaxHeight(tester,
959965
maxHeight: verticalPadding + 170 * 1.5, maxVisibleLines: 8);
960966
});
961967

962968
testWidgets('higher text scale factor exceeding threshold', (tester) async {
963969
tester.platformDispatcher.textScaleFactorTestValue = 2;
964970
addTearDown(tester.platformDispatcher.clearTextScaleFactorTestValue);
965-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
971+
await prepare(tester, narrow: narrow, streams: [stream]);
966972
await checkContentInputMaxHeight(tester,
967973
maxHeight: verticalPadding + 170 * 1.5, maxVisibleLines: 6);
968974
});

0 commit comments

Comments
 (0)