Skip to content

Commit 778b82d

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 eff631b commit 778b82d

File tree

1 file changed

+51
-45
lines changed

1 file changed

+51
-45
lines changed

test/widgets/compose_box_test.dart

Lines changed: 51 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -45,27 +45,14 @@ void main() {
4545
(widget) => widget is TextField && widget.controller is ComposeContentController);
4646

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

68+
Future<void> prepare(WidgetTester tester, {
69+
required Narrow narrow,
70+
User? selfUser,
71+
List<User> users = const [],
72+
List<ZulipStream> streams = const [],
73+
}) async {
74+
addTearDown(testBinding.reset);
75+
selfUser ??= eg.selfUser;
76+
final selfAccount = eg.account(user: selfUser);
77+
await testBinding.globalStore.add(selfAccount, eg.initialSnapshot());
78+
79+
store = await testBinding.globalStore.perAccount(selfAccount.id);
80+
81+
await store.addUsers([selfUser, ...users]);
82+
await store.addStreams(streams);
83+
connection = store.connection as FakeApiConnection;
84+
await prepareComposeBox(tester, account: selfAccount, narrow: narrow);
85+
}
86+
8187
Future<void> enterTopic(WidgetTester tester, {
8288
required ChannelNarrow narrow,
8389
required String topic,
@@ -220,14 +226,14 @@ void main() {
220226

221227
testWidgets('_StreamComposeBox', (tester) async {
222228
final channel = eg.stream();
223-
await prepareComposeBox(tester,
229+
await prepare(tester,
224230
narrow: ChannelNarrow(channel.streamId), streams: [channel]);
225231
checkComposeBoxTextFields(tester, expectTopicTextField: true);
226232
});
227233

228234
testWidgets('_FixedDestinationComposeBox', (tester) async {
229235
final channel = eg.stream();
230-
await prepareComposeBox(tester,
236+
await prepare(tester,
231237
narrow: eg.topicNarrow(channel.streamId, 'topic'), streams: [channel]);
232238
checkComposeBoxTextFields(tester, expectTopicTextField: false);
233239
});
@@ -247,7 +253,7 @@ void main() {
247253
}
248254

249255
testWidgets('smoke TopicNarrow', (tester) async {
250-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
256+
await prepare(tester, narrow: narrow, streams: [channel]);
251257

252258
await checkStartTyping(tester, narrow);
253259

@@ -259,7 +265,7 @@ void main() {
259265
testWidgets('smoke DmNarrow', (tester) async {
260266
final narrow = DmNarrow.withUsers(
261267
[eg.otherUser.userId], selfUserId: eg.selfUser.userId);
262-
await prepareComposeBox(tester, narrow: narrow);
268+
await prepare(tester, narrow: narrow);
263269

264270
await checkStartTyping(tester, narrow);
265271

@@ -271,7 +277,7 @@ void main() {
271277
testWidgets('smoke ChannelNarrow', (tester) async {
272278
final narrow = ChannelNarrow(channel.streamId);
273279
final destinationNarrow = eg.topicNarrow(narrow.streamId, 'test topic');
274-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
280+
await prepare(tester, narrow: narrow, streams: [channel]);
275281
await enterTopic(tester, narrow: narrow, topic: 'test topic');
276282

277283
await checkStartTyping(tester, destinationNarrow);
@@ -282,7 +288,7 @@ void main() {
282288
});
283289

284290
testWidgets('clearing text sends a "typing stopped" notice', (tester) async {
285-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
291+
await prepare(tester, narrow: narrow, streams: [channel]);
286292

287293
await checkStartTyping(tester, narrow);
288294

@@ -292,7 +298,7 @@ void main() {
292298
});
293299

294300
testWidgets('hitting send button sends a "typing stopped" notice', (tester) async {
295-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
301+
await prepare(tester, narrow: narrow, streams: [channel]);
296302

297303
await checkStartTyping(tester, narrow);
298304

@@ -338,7 +344,7 @@ void main() {
338344
testWidgets('for content input, unfocusing sends a "typing stopped" notice', (tester) async {
339345
final narrow = ChannelNarrow(channel.streamId);
340346
final destinationNarrow = eg.topicNarrow(narrow.streamId, 'test topic');
341-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
347+
await prepare(tester, narrow: narrow, streams: [channel]);
342348
await enterTopic(tester, narrow: narrow, topic: 'test topic');
343349

344350
await checkStartTyping(tester, destinationNarrow);
@@ -350,7 +356,7 @@ void main() {
350356
});
351357

352358
testWidgets('selection change sends a "typing started" notice', (tester) async {
353-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
359+
await prepare(tester, narrow: narrow, streams: [channel]);
354360

355361
await checkStartTyping(tester, narrow);
356362

@@ -370,7 +376,7 @@ void main() {
370376
});
371377

372378
testWidgets('unfocusing app sends a "typing stopped" notice', (tester) async {
373-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
379+
await prepare(tester, narrow: narrow, streams: [channel]);
374380

375381
await checkStartTyping(tester, narrow);
376382

@@ -400,7 +406,7 @@ void main() {
400406
addTearDown(TypingNotifier.debugReset);
401407

402408
final zulipLocalizations = GlobalLocalizations.zulipLocalizations;
403-
await prepareComposeBox(tester, narrow: eg.topicNarrow(123, 'some topic'),
409+
await prepare(tester, narrow: eg.topicNarrow(123, 'some topic'),
404410
streams: [eg.stream(streamId: 123)]);
405411

406412
await tester.enterText(contentInputFinder, 'hello world');
@@ -469,7 +475,7 @@ void main() {
469475

470476
final channel = eg.stream();
471477
final narrow = ChannelNarrow(channel.streamId);
472-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
478+
await prepare(tester, narrow: narrow, streams: [channel]);
473479

474480
// (When we check that the send button looks disabled, it should be because
475481
// the file is uploading, not a pre-existing reason.)
@@ -529,7 +535,7 @@ void main() {
529535

530536
final channel = eg.stream();
531537
final narrow = ChannelNarrow(channel.streamId);
532-
await prepareComposeBox(tester, narrow: narrow, streams: [channel]);
538+
await prepare(tester, narrow: narrow, streams: [channel]);
533539

534540
// (When we check that the send button looks disabled, it should be because
535541
// the file is uploading, not a pre-existing reason.)
@@ -637,15 +643,15 @@ void main() {
637643
group('1:1 DMs', () {
638644
testWidgets('compose box replaced with a banner', (tester) async {
639645
final deactivatedUser = eg.user(isActive: false);
640-
await prepareComposeBox(tester, narrow: dmNarrowWith(deactivatedUser),
646+
await prepare(tester, narrow: dmNarrowWith(deactivatedUser),
641647
users: [deactivatedUser]);
642648
checkComposeBox(isShown: false);
643649
});
644650

645651
testWidgets('active user becomes deactivated -> '
646652
'compose box is replaced with a banner', (tester) async {
647653
final activeUser = eg.user(isActive: true);
648-
await prepareComposeBox(tester, narrow: dmNarrowWith(activeUser),
654+
await prepare(tester, narrow: dmNarrowWith(activeUser),
649655
users: [activeUser]);
650656
checkComposeBox(isShown: true);
651657

@@ -656,7 +662,7 @@ void main() {
656662
testWidgets('deactivated user becomes active -> '
657663
'banner is replaced with the compose box', (tester) async {
658664
final deactivatedUser = eg.user(isActive: false);
659-
await prepareComposeBox(tester, narrow: dmNarrowWith(deactivatedUser),
665+
await prepare(tester, narrow: dmNarrowWith(deactivatedUser),
660666
users: [deactivatedUser]);
661667
checkComposeBox(isShown: false);
662668

@@ -668,15 +674,15 @@ void main() {
668674
group('group DMs', () {
669675
testWidgets('compose box replaced with a banner', (tester) async {
670676
final deactivatedUsers = [eg.user(isActive: false), eg.user(isActive: false)];
671-
await prepareComposeBox(tester, narrow: groupDmNarrowWith(deactivatedUsers),
677+
await prepare(tester, narrow: groupDmNarrowWith(deactivatedUsers),
672678
users: deactivatedUsers);
673679
checkComposeBox(isShown: false);
674680
});
675681

676682
testWidgets('at least one user becomes deactivated -> '
677683
'compose box is replaced with a banner', (tester) async {
678684
final activeUsers = [eg.user(isActive: true), eg.user(isActive: true)];
679-
await prepareComposeBox(tester, narrow: groupDmNarrowWith(activeUsers),
685+
await prepare(tester, narrow: groupDmNarrowWith(activeUsers),
680686
users: activeUsers);
681687
checkComposeBox(isShown: true);
682688

@@ -687,7 +693,7 @@ void main() {
687693
testWidgets('all deactivated users become active -> '
688694
'banner is replaced with the compose box', (tester) async {
689695
final deactivatedUsers = [eg.user(isActive: false), eg.user(isActive: false)];
690-
await prepareComposeBox(tester, narrow: groupDmNarrowWith(deactivatedUsers),
696+
await prepare(tester, narrow: groupDmNarrowWith(deactivatedUsers),
691697
users: deactivatedUsers);
692698
checkComposeBox(isShown: false);
693699

@@ -711,7 +717,7 @@ void main() {
711717

712718
for (final (String narrowType, Narrow narrow) in narrowTestCases) {
713719
testWidgets('compose box is shown in $narrowType narrow', (tester) async {
714-
await prepareComposeBox(tester,
720+
await prepare(tester,
715721
narrow: narrow,
716722
selfUser: eg.user(role: UserRole.administrator),
717723
streams: [eg.stream(streamId: 1,
@@ -720,7 +726,7 @@ void main() {
720726
});
721727

722728
testWidgets('error banner is shown in $narrowType narrow', (tester) async {
723-
await prepareComposeBox(tester,
729+
await prepare(tester,
724730
narrow: narrow,
725731
selfUser: eg.user(role: UserRole.moderator),
726732
streams: [eg.stream(streamId: 1,
@@ -731,7 +737,7 @@ void main() {
731737

732738
testWidgets('user loses privilege -> compose box is replaced with the banner', (tester) async {
733739
final selfUser = eg.user(role: UserRole.administrator);
734-
await prepareComposeBox(tester,
740+
await prepare(tester,
735741
narrow: const ChannelNarrow(1),
736742
selfUser: selfUser,
737743
streams: [eg.stream(streamId: 1,
@@ -746,7 +752,7 @@ void main() {
746752

747753
testWidgets('user gains privilege -> banner is replaced with the compose box', (tester) async {
748754
final selfUser = eg.user(role: UserRole.guest);
749-
await prepareComposeBox(tester,
755+
await prepare(tester,
750756
narrow: const ChannelNarrow(1),
751757
selfUser: selfUser,
752758
streams: [eg.stream(streamId: 1,
@@ -764,7 +770,7 @@ void main() {
764770
final channel = eg.stream(streamId: 1,
765771
channelPostPolicy: ChannelPostPolicy.any);
766772

767-
await prepareComposeBox(tester,
773+
await prepare(tester,
768774
narrow: const ChannelNarrow(1),
769775
selfUser: selfUser,
770776
streams: [channel]);
@@ -782,7 +788,7 @@ void main() {
782788
final channel = eg.stream(streamId: 1,
783789
channelPostPolicy: ChannelPostPolicy.administrators);
784790

785-
await prepareComposeBox(tester,
791+
await prepare(tester,
786792
narrow: const ChannelNarrow(1),
787793
selfUser: selfUser,
788794
streams: [channel]);
@@ -829,7 +835,7 @@ void main() {
829835
}
830836

831837
testWidgets('normal text scale factor', (tester) async {
832-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
838+
await prepare(tester, narrow: narrow, streams: [stream]);
833839

834840
await checkContentInputMaxHeight(tester,
835841
maxHeight: verticalPadding + 170, maxVisibleLines: 8);
@@ -838,23 +844,23 @@ void main() {
838844
testWidgets('lower text scale factor', (tester) async {
839845
tester.platformDispatcher.textScaleFactorTestValue = 0.8;
840846
addTearDown(tester.platformDispatcher.clearTextScaleFactorTestValue);
841-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
847+
await prepare(tester, narrow: narrow, streams: [stream]);
842848
await checkContentInputMaxHeight(tester,
843849
maxHeight: verticalPadding + 170 * 0.8, maxVisibleLines: 8);
844850
});
845851

846852
testWidgets('higher text scale factor', (tester) async {
847853
tester.platformDispatcher.textScaleFactorTestValue = 1.5;
848854
addTearDown(tester.platformDispatcher.clearTextScaleFactorTestValue);
849-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
855+
await prepare(tester, narrow: narrow, streams: [stream]);
850856
await checkContentInputMaxHeight(tester,
851857
maxHeight: verticalPadding + 170 * 1.5, maxVisibleLines: 8);
852858
});
853859

854860
testWidgets('higher text scale factor exceeding threshold', (tester) async {
855861
tester.platformDispatcher.textScaleFactorTestValue = 2;
856862
addTearDown(tester.platformDispatcher.clearTextScaleFactorTestValue);
857-
await prepareComposeBox(tester, narrow: narrow, streams: [stream]);
863+
await prepare(tester, narrow: narrow, streams: [stream]);
858864
await checkContentInputMaxHeight(tester,
859865
maxHeight: verticalPadding + 170 * 1.5, maxVisibleLines: 6);
860866
});

0 commit comments

Comments
 (0)