Skip to content

Commit da38b63

Browse files
committed
compose_box test: Set topic and content through a helper
This ensures that the `GetStreamTopicsResult` is self-contained, so that the caller does not rely on the assumption that a response has been prepared through `prepareComposeBox`. This also elevates contentInputFinder for reuse throughout the test. This changes the way the tests work, because now we use tester.enterText to set the topic and content, instead of accessing the controllers. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 6252608 commit da38b63

File tree

1 file changed

+33
-19
lines changed

1 file changed

+33
-19
lines changed

test/widgets/compose_box_test.dart

+33-19
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,18 @@ void main() {
3232
late PerAccountStore store;
3333
late FakeApiConnection connection;
3434

35-
Future<GlobalKey<ComposeBoxController>> prepareComposeBox(WidgetTester tester,
36-
{required Narrow narrow, List<User> users = const []}) async {
35+
final topicInputFinder = find.byWidgetPredicate(
36+
(widget) => widget is TextField && widget.controller is ComposeTopicController);
37+
final contentInputFinder = find.byWidgetPredicate(
38+
(widget) => widget is TextField && widget.controller is ComposeContentController);
39+
40+
Future<GlobalKey<ComposeBoxController>> prepareComposeBox(
41+
WidgetTester tester, {
42+
required Narrow narrow,
43+
String? topic,
44+
String? content,
45+
List<User> users = const [],
46+
}) async {
3747
addTearDown(testBinding.reset);
3848
await testBinding.globalStore.add(eg.selfAccount, eg.initialSnapshot());
3949

@@ -42,16 +52,26 @@ void main() {
4252
await store.addUsers([eg.selfUser, ...users]);
4353
connection = store.connection as FakeApiConnection;
4454

45-
if (narrow is ChannelNarrow) {
46-
// Ensure topics are loaded before testing actual logic.
47-
connection.prepare(body:
48-
jsonEncode(GetStreamTopicsResult(topics: [eg.getStreamTopicsEntry()]).toJson()));
49-
}
5055
final controllerKey = GlobalKey<ComposeBoxController>();
5156
await tester.pumpWidget(TestZulipApp(accountId: eg.selfAccount.id,
5257
child: ComposeBox(controllerKey: controllerKey, narrow: narrow)));
5358
await tester.pumpAndSettle();
5459

60+
if (topic != null) {
61+
// The topic input is currently only available to ChannelNarrow.
62+
narrow as ChannelNarrow;
63+
connection.prepare(body:
64+
jsonEncode(GetStreamTopicsResult(topics: [eg.getStreamTopicsEntry()]).toJson()));
65+
await tester.enterText(topicInputFinder, topic);
66+
check(connection.takeRequests()).single
67+
..method.equals('GET')
68+
..url.path.equals('/api/v1/users/me/${narrow.streamId}/topics');
69+
}
70+
if (content != null) {
71+
await tester.enterText(contentInputFinder, content);
72+
}
73+
await tester.pump();
74+
5575
return controllerKey;
5676
}
5777

@@ -206,8 +226,6 @@ void main() {
206226
final zulipLocalizations = GlobalLocalizations.zulipLocalizations;
207227
await prepareComposeBox(tester, narrow: const TopicNarrow(123, 'some topic'));
208228

209-
final contentInputFinder = find.byWidgetPredicate(
210-
(widget) => widget is TextField && widget.controller is ComposeContentController);
211229
await tester.enterText(contentInputFinder, 'hello world');
212230

213231
prepareResponse(456);
@@ -271,14 +289,12 @@ void main() {
271289
TypingNotifier.debugEnable = false;
272290
addTearDown(TypingNotifier.debugReset);
273291

274-
final controllerKey = await prepareComposeBox(tester, narrow: ChannelNarrow(eg.stream().streamId));
292+
final controllerKey = await prepareComposeBox(tester,
293+
narrow: ChannelNarrow(eg.stream().streamId),
294+
topic: 'some topic', content: 'see image: ');
275295
final composeBoxController = controllerKey.currentState!;
276-
277296
// (When we check that the send button looks disabled, it should be because
278297
// the file is uploading, not a pre-existing reason.)
279-
composeBoxController.topicController!.value = const TextEditingValue(text: 'some topic');
280-
composeBoxController.contentController.value = const TextEditingValue(text: 'see image: ');
281-
await tester.pump();
282298
checkAppearsLoading(tester, false);
283299

284300
testBinding.pickFilesResult = FilePickerResult([PlatformFile(
@@ -330,14 +346,12 @@ void main() {
330346
TypingNotifier.debugEnable = false;
331347
addTearDown(TypingNotifier.debugReset);
332348

333-
final controllerKey = await prepareComposeBox(tester, narrow: ChannelNarrow(eg.stream().streamId));
349+
final controllerKey = await prepareComposeBox(tester,
350+
narrow: ChannelNarrow(eg.stream().streamId),
351+
topic: 'some topic', content: 'see image: ');
334352
final composeBoxController = controllerKey.currentState!;
335-
336353
// (When we check that the send button looks disabled, it should be because
337354
// the file is uploading, not a pre-existing reason.)
338-
composeBoxController.topicController!.value = const TextEditingValue(text: 'some topic');
339-
composeBoxController.contentController.value = const TextEditingValue(text: 'see image: ');
340-
await tester.pump();
341355
checkAppearsLoading(tester, false);
342356

343357
testBinding.pickImageResult = XFile.fromData(

0 commit comments

Comments
 (0)