diff --git a/test/widgets/action_sheet_test.dart b/test/widgets/action_sheet_test.dart index 621f759f28..e99f904c0a 100644 --- a/test/widgets/action_sheet_test.dart +++ b/test/widgets/action_sheet_test.dart @@ -140,7 +140,7 @@ Future setupToMessageActionSheet(WidgetTester tester, { // like if it's in padding around a Paragraph. await tester.longPress(find.byType(MessageContent), warnIfMissed: false); // sheet appears onscreen; default duration of bottom-sheet enter animation - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); // Check the action sheet did in fact open, so we don't defeat any tests that // use simple `find.byIcon`-style checks to test presence/absence of a button. check(find.byType(BottomSheet)).findsOne(); @@ -199,11 +199,14 @@ void main() { check(find.byType(InboxPageBody)).findsOne(); await tester.longPress(find.text(someChannel.name).hitTestable()); - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); } Future showFromSubscriptionList(WidgetTester tester) async { + final transitionDurationObserver = TransitionDurationObserver(); + await tester.pumpWidget(TestZulipApp(accountId: eg.selfAccount.id, + navigatorObservers: [transitionDurationObserver], child: const HomePage())); await tester.pump(); await tester.tap(find.byIcon(ZulipIcons.hash_italic)); @@ -211,7 +214,7 @@ void main() { check(find.byType(SubscriptionListPageBody)).findsOne(); await tester.longPress(find.text(someChannel.name).hitTestable()); - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); } Future showFromMsglistAppBar(WidgetTester tester, { @@ -220,6 +223,8 @@ void main() { }) async { channel ??= someChannel; + final transitionDurationObserver = TransitionDurationObserver(); + connection.prepare(json: eg.newestGetMessagesResult( foundOldest: true, messages: []).toJson()); if (narrow case ChannelNarrow()) { @@ -229,6 +234,7 @@ void main() { } await tester.pumpWidget(TestZulipApp( accountId: eg.selfAccount.id, + navigatorObservers: [transitionDurationObserver], child: MessageListPage( initNarrow: narrow))); await tester.pumpAndSettle(); @@ -236,7 +242,7 @@ void main() { await tester.longPress(find.descendant( of: find.byType(ZulipAppBar), matching: find.text(channel.name))); - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); } Future showFromRecipientHeader(WidgetTester tester, { @@ -244,16 +250,19 @@ void main() { }) async { message ??= someMessage; + final transitionDurationObserver = TransitionDurationObserver(); + connection.prepare(json: eg.newestGetMessagesResult( foundOldest: true, messages: [message]).toJson()); await tester.pumpWidget(TestZulipApp(accountId: eg.selfAccount.id, + navigatorObservers: [transitionDurationObserver], child: const MessageListPage(initNarrow: CombinedFeedNarrow()))); await tester.pumpAndSettle(); await tester.longPress(find.descendant( of: find.byType(RecipientHeader), matching: find.text(message.displayRecipient ?? ''))); - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); } Future showFromTopicListAppBar(WidgetTester tester, {int? streamId}) async { @@ -739,7 +748,7 @@ void main() { await tester.longPress(find.text(topic)); // sheet appears onscreen; default duration of bottom-sheet enter animation - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); } Future showFromAppBar(WidgetTester tester, { @@ -766,7 +775,7 @@ void main() { effectiveTopic.displayName ?? eg.defaultRealmEmptyTopicDisplayName)); await tester.longPress(topicRow); // sheet appears onscreen; default duration of bottom-sheet enter animation - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); } Future showFromRecipientHeader(WidgetTester tester, { @@ -785,7 +794,7 @@ void main() { of: find.byType(RecipientHeader), matching: find.text(effectiveMessage.topic.displayName!))); // sheet appears onscreen; default duration of bottom-sheet enter animation - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); } final actionSheetFinder = find.byType(BottomSheet); @@ -2037,21 +2046,28 @@ void main() { check(await Clipboard.getData('text/plain')).isNotNull().text.equals('Hello world'); }); - testWidgets('can show snackbar on success', (tester) async { + testWidgets('can show snackbar on success', (WidgetTester tester) async { // Regression test for: https://github.com/zulip/zulip-flutter/issues/732 - testBinding.deviceInfoResult = const IosDeviceInfo(systemVersion: '16.0'); - + final TransitionDurationObserver transitionDurationObserver = TransitionDurationObserver(); + await tester.pumpWidget( + MaterialApp( + navigatorObservers: [transitionDurationObserver], + home: Scaffold( + body: Builder(builder: (context) { + testBinding.deviceInfoResult = const IosDeviceInfo(systemVersion: '16.0'); + final message = eg.streamMessage(); + setupToMessageActionSheet(tester,message: message,narrow: TopicNarrow.ofMessage(message)); + return const SizedBox.shrink();} + )))); final message = eg.streamMessage(); - await setupToMessageActionSheet(tester, message: message, narrow: TopicNarrow.ofMessage(message)); - // Make the request take a bit of time to complete… prepareRawContentResponseSuccess(message: message, rawContent: 'Hello world', delay: const Duration(milliseconds: 500)); await tapCopyMessageTextButton(tester); // … and pump a frame to finish the NavigationState.pop animation… - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); // … before the request finishes. This is the repro condition for #732. - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); final snackbar = tester.widget(find.byType(SnackBar)); check(snackbar.behavior).equals(SnackBarBehavior.floating); @@ -2283,7 +2299,7 @@ void main() { // See comment in setupToMessageActionSheet about warnIfMissed: false await tester.longPress(find.byType(MessageContent), warnIfMissed: false); // sheet appears onscreen; default duration of bottom-sheet enter animation - await tester.pump(const Duration(milliseconds: 250)); + await transitionDurationObserver.pumpPastTransition(tester); check(find.byType(BottomSheet)).findsOne(); checkButtonIsPresent(expected); diff --git a/test/widgets/compose_box_test.dart b/test/widgets/compose_box_test.dart index 15a0a7f81e..1428316140 100644 --- a/test/widgets/compose_box_test.dart +++ b/test/widgets/compose_box_test.dart @@ -1719,7 +1719,7 @@ void main() { await tester.longPress(find.byWidgetPredicate((widget) => widget is MessageWithPossibleSender && widget.item.message.id == messageId)); // sheet appears onscreen; default duration of bottom-sheet enter animation - await tester.pump(const Duration(milliseconds: 250)); + await tester.pumpAndSettle(); final findEditButton = find.descendant( of: find.byType(BottomSheet), matching: find.byIcon(ZulipIcons.edit, skipOffstage: false)); @@ -1862,10 +1862,17 @@ void main() { await tester.pump(); check(state).controller.content.text.equals('composing something'); }); - - testWidgets('interrupting message edit: proceed through confirmation dialog', (tester) async { - await prepareMessageNotSent(tester, narrow: topicNarrow); - + testWidgets('interrupting message edit: proceed through confirmation dialog', (WidgetTester tester) async { + final TransitionDurationObserver transitionDurationObserver = TransitionDurationObserver(); + + await tester.pumpWidget( + MaterialApp( + navigatorObservers: [transitionDurationObserver], + home: Scaffold( + body: Builder(builder: (context) { + prepareMessageNotSent(tester, narrow: topicNarrow); + return const SizedBox.shrink();}, + )))); final messageToEdit = eg.streamMessage( sender: eg.selfUser, stream: channel, topic: topic, content: 'message to edit'); @@ -1875,21 +1882,28 @@ void main() { await startEditInteractionFromActionSheet(tester, messageId: messageToEdit.id, originalRawContent: 'message to edit', delay: Duration.zero); - await tester.pump(const Duration(milliseconds: 250)); // bottom-sheet animation + await transitionDurationObserver.pumpPastTransition(tester);// bottom-sheet animation await tester.tap(failedMessageFinder); await tester.pump(); check(state).controller.content.text.equals('message to edit'); - await expectAndHandleDiscardForMessageNotSentConfirmation(tester, - shouldContinue: true); + await expectAndHandleDiscardForMessageNotSentConfirmation(tester, shouldContinue: true); await tester.pump(); check(state).controller.content.text.equals(failedMessageContent); }); - testWidgets('interrupting message edit: cancel confirmation dialog', (tester) async { - await prepareMessageNotSent(tester, narrow: topicNarrow); - + testWidgets('interrupting message edit: cancel confirmation dialog', (WidgetTester tester) async { + final TransitionDurationObserver transitionDurationObserver = TransitionDurationObserver(); + + await tester.pumpWidget( + MaterialApp( + navigatorObservers: [transitionDurationObserver], + home: Scaffold( + body: Builder(builder: (context) { + prepareMessageNotSent(tester, narrow: topicNarrow); + return const SizedBox.shrink();}, + )))); final messageToEdit = eg.streamMessage( sender: eg.selfUser, stream: channel, topic: topic, content: 'message to edit'); @@ -1899,7 +1913,7 @@ void main() { await startEditInteractionFromActionSheet(tester, messageId: messageToEdit.id, originalRawContent: 'message to edit', delay: Duration.zero); - await tester.pump(const Duration(milliseconds: 250)); // bottom-sheet animation + await transitionDurationObserver.pumpPastTransition(tester); // bottom-sheet animation await tester.tap(failedMessageFinder); await tester.pump(); @@ -2352,4 +2366,4 @@ enum _EditInteractionStart { _EditInteractionStart.restoreFailedEdit => 'from restoring a failed edit', }; } -} +} \ No newline at end of file diff --git a/test/widgets/emoji_reaction_test.dart b/test/widgets/emoji_reaction_test.dart index d50b7c8d7b..0baf86dae8 100644 --- a/test/widgets/emoji_reaction_test.dart +++ b/test/widgets/emoji_reaction_test.dart @@ -434,8 +434,7 @@ void main() { // request the message action sheet await tester.longPress(find.byType(MessageContent)); // sheet appears onscreen; default duration of bottom-sheet enter animation - await tester.pump(const Duration(milliseconds: 250)); - + await transitionDurationObserver.pumpPastTransition(tester); await store.handleEvent(RealmEmojiUpdateEvent(id: 1, realmEmoji: { '1': eg.realmEmojiItem(emojiCode: '1', emojiName: 'buzzing'), }));