From a5cc102d0ec53b4235687078c9d5b6da28029638 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 29 Oct 2025 16:20:10 +0700 Subject: [PATCH] TF-4053 Add E2E test for test case move folder content --- .../robots/mailbox_menu_robot.dart | 8 ++ .../mailbox/move_folder_content_scenario.dart | 83 +++++++++++++++++++ .../mailbox/move_folder_content_test.dart | 9 ++ .../base/base_mailbox_controller.dart | 4 +- .../mixin/mailbox_action_handler_mixin.dart | 7 +- .../presentation_mailbox_extension.dart | 27 ++++++ 6 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 integration_test/scenarios/mailbox/move_folder_content_scenario.dart create mode 100644 integration_test/tests/mailbox/move_folder_content_test.dart diff --git a/integration_test/robots/mailbox_menu_robot.dart b/integration_test/robots/mailbox_menu_robot.dart index 4f2e2d9da..2a1330dde 100644 --- a/integration_test/robots/mailbox_menu_robot.dart +++ b/integration_test/robots/mailbox_menu_robot.dart @@ -180,4 +180,12 @@ class MailboxMenuRobot extends CoreRobot { await $(AppLocalizations().mark_as_read).tap(); await $.pumpAndSettle(); } + + Future tapMoveFolderContentAction(String mailboxName) async { + await $(AppLocalizations().moveFolderContent).tap(); + await $.pumpAndTrySettle(); + + await $(mailboxName).tap(); + await $.pumpAndTrySettle(); + } } \ No newline at end of file diff --git a/integration_test/scenarios/mailbox/move_folder_content_scenario.dart b/integration_test/scenarios/mailbox/move_folder_content_scenario.dart new file mode 100644 index 000000000..64b41a15c --- /dev/null +++ b/integration_test/scenarios/mailbox/move_folder_content_scenario.dart @@ -0,0 +1,83 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:model/extensions/presentation_mailbox_extension.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../models/provisioning_email.dart'; +import '../../robots/mailbox_menu_robot.dart'; +import '../../robots/thread_robot.dart'; + +class MoveFolderContentScenario extends BaseTestScenario { + const MoveFolderContentScenario(super.$); + + @override + Future runTestLogic() async { + const email = String.fromEnvironment('BASIC_AUTH_EMAIL'); + const emailSubject = 'Move folder content'; + + final threadRobot = ThreadRobot($); + final mailboxMenuRobot = MailboxMenuRobot($); + final appLocalizations = AppLocalizations(); + + final listEmails = List.generate( + 40, + (_) => ProvisioningEmail( + toEmail: email, + subject: emailSubject, + content: '', + ), + ); + + await provisionEmail(listEmails); + await $.pumpAndTrySettle(duration: const Duration(seconds: 2)); + + await threadRobot.openMailbox(); + await $.pumpAndTrySettle(); + _expectInboxUnreadCountVisible(); + + await mailboxMenuRobot.longPressMailboxWithName( + appLocalizations.inboxMailboxDisplayName, + ); + await mailboxMenuRobot.tapMoveFolderContentAction( + appLocalizations.templatesMailboxDisplayName, + ); + await $.pumpAndTrySettle(duration: const Duration(seconds: 3)); + + await threadRobot.openMailbox(); + await $.pumpAndTrySettle(); + await mailboxMenuRobot.openFolderByName( + appLocalizations.templatesMailboxDisplayName, + ); + await $.pumpAndTrySettle(); + await _expectEmailWithSubjectVisible(emailSubject); + + await threadRobot.openMailbox(); + await $.pumpAndTrySettle(); + await mailboxMenuRobot.openFolderByName( + appLocalizations.inboxMailboxDisplayName, + ); + await $.pumpAndTrySettle(); + await _expectEmailWithSubjectInVisible(emailSubject); + } + + Future _expectEmailWithSubjectVisible(String subject) async { + await expectViewVisible($(subject)); + } + + Future _expectEmailWithSubjectInVisible(String subject) async { + await expectViewInvisible($(subject)); + } + + void _expectInboxUnreadCountVisible() { + expect( + $(TrailingMailboxItemWidget).which((widget) { + final mailbox = widget.mailboxNode.item; + return mailbox.role == PresentationMailbox.roleInbox && + mailbox.countUnreadEmails > 0; + }), + findsOneWidget, + ); + } +} diff --git a/integration_test/tests/mailbox/move_folder_content_test.dart b/integration_test/tests/mailbox/move_folder_content_test.dart new file mode 100644 index 000000000..a6e7fe903 --- /dev/null +++ b/integration_test/tests/mailbox/move_folder_content_test.dart @@ -0,0 +1,9 @@ +import '../../base/test_base.dart'; +import '../../scenarios/mailbox/move_folder_content_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should see all Inbox emails in the Templates folder when perform move folder content action successfully', + scenarioBuilder: ($) => MoveFolderContentScenario($), + ); +} diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index 570eaeca9..6b108457c 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -56,6 +56,7 @@ typedef MovingMailboxActionCallback = void Function(PresentationMailbox mailboxS typedef OnMoveFolderContentActionCallback = void Function( PresentationMailbox currentMailbox, PresentationMailbox destinationMailbox, + String destinationMailboxName, ); typedef DeleteMailboxActionCallback = void Function(PresentationMailbox mailbox); typedef AllowSubaddressingActionCallback = void Function(MailboxId, Map?>?, MailboxActions); @@ -643,7 +644,7 @@ abstract class BaseMailboxController extends BaseController } void moveFolderContentAction({ - required BuildContext context, + required AppLocalizations appLocalizations, required AccountId accountId, required Session session, required PresentationMailbox mailboxSelected, @@ -667,6 +668,7 @@ abstract class BaseMailboxController extends BaseController onMoveFolderContentAction( mailboxSelected, destinationMailbox, + destinationMailbox.getDisplayNameWithoutContext(appLocalizations), ); } } diff --git a/lib/features/base/mixin/mailbox_action_handler_mixin.dart b/lib/features/base/mixin/mailbox_action_handler_mixin.dart index 523b2367d..92b5dfd43 100644 --- a/lib/features/base/mixin/mailbox_action_handler_mixin.dart +++ b/lib/features/base/mixin/mailbox_action_handler_mixin.dart @@ -179,11 +179,11 @@ mixin MailboxActionHandlerMixin { } baseMailboxController.moveFolderContentAction( - context: context, + appLocalizations: AppLocalizations.of(context), accountId: accountId, session: session, mailboxSelected: mailboxSelected, - onMoveFolderContentAction: (currentMailbox, destinationMailbox) { + onMoveFolderContentAction: (currentMailbox, destinationMailbox, appLocalizations) { baseMailboxController.consumeState( mailboxActionReactor.moveFolderContent( session: session, @@ -192,8 +192,7 @@ mixin MailboxActionHandlerMixin { moveAction: MoveAction.moving, mailboxId: currentMailbox.id, destinationMailboxId: destinationMailbox.id, - destinationMailboxDisplayName: - destinationMailbox.getDisplayName(context), + destinationMailboxDisplayName: appLocalizations, markAsRead: destinationMailbox.isSpam, totalEmails: currentMailbox.countTotalEmails, ), diff --git a/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart b/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart index 01f7b45cc..cd7260b5a 100644 --- a/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart +++ b/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart @@ -37,6 +37,33 @@ extension PresentationMailboxExtension on PresentationMailbox { return name?.name ?? ''; } + String getDisplayNameWithoutContext(AppLocalizations appLocalizations) { + if (isDefault) { + switch(role!.value.toLowerCase()) { + case PresentationMailbox.inboxRole: + return appLocalizations.inboxMailboxDisplayName; + case PresentationMailbox.archiveRole: + return appLocalizations.archiveMailboxDisplayName; + case PresentationMailbox.draftsRole: + return appLocalizations.draftsMailboxDisplayName; + case PresentationMailbox.sentRole: + return appLocalizations.sentMailboxDisplayName; + case PresentationMailbox.outboxRole: + return appLocalizations.outboxMailboxDisplayName; + case PresentationMailbox.trashRole: + return appLocalizations.trashMailboxDisplayName; + case PresentationMailbox.spamRole: + case PresentationMailbox.junkRole: + return appLocalizations.spamMailboxDisplayName; + case PresentationMailbox.templatesRole: + return appLocalizations.templatesMailboxDisplayName; + case PresentationMailbox.recoveredRole: + return appLocalizations.recoveredMailboxDisplayName; + } + } + return name?.name ?? ''; + } + String getMailboxIcon(ImagePaths imagePaths) { if (hasRole()) { switch(role!.value) {