From 5c4329ba2ab9ace30dd61ba3fe1db2cd3972976c Mon Sep 17 00:00:00 2001 From: DatDang Date: Tue, 1 Apr 2025 17:26:02 +0700 Subject: [PATCH] TF-3605 E2E Mailbox create, rename, move and delete sub folder --- .../robots/mailbox_menu_robot.dart | 68 ++++++++++++---- .../create_and_hide_sub_folder_scenario.dart | 4 +- .../create_personal_folder_scenario.dart | 27 +++++++ ...name_move_and_delete_mailbox_scenario.dart | 77 +++++++++++++++++++ .../mailbox/create_personal_folder_test.dart | 9 +++ ...e_rename_move_and_delete_mailbox_test.dart | 9 +++ .../widgets/folders_bar_widget.dart | 1 + .../widgets/mailbox_expand_button.dart | 1 + pubspec.lock | 4 +- pubspec.yaml | 2 +- 10 files changed, 182 insertions(+), 20 deletions(-) create mode 100644 integration_test/scenarios/mailbox/create_personal_folder_scenario.dart create mode 100644 integration_test/scenarios/mailbox/create_rename_move_and_delete_mailbox_scenario.dart create mode 100644 integration_test/tests/mailbox/create_personal_folder_test.dart create mode 100644 integration_test/tests/mailbox/create_rename_move_and_delete_mailbox_test.dart diff --git a/integration_test/robots/mailbox_menu_robot.dart b/integration_test/robots/mailbox_menu_robot.dart index c6846f1bb..fe962f58f 100644 --- a/integration_test/robots/mailbox_menu_robot.dart +++ b/integration_test/robots/mailbox_menu_robot.dart @@ -1,6 +1,8 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart'; + import 'package:core/presentation/views/text/text_field_builder.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/label_mailbox_item_widget.dart'; @@ -42,29 +44,26 @@ class MailboxMenuRobot extends CoreRobot { await $(AppLocalizations().newSubfolder).tap(); } - Future enterNewSubFolderName(String name) async { + Future enterNewFolderName(String name) async { await $(MailboxCreatorView) - .$(TextFieldBuilder) - .enterText(name); + .$(TextFieldBuilder) + .enterText(name); } - Future confirmCreateNewSubFolder() async { + Future confirmCreateNewFolder() async { await $(MailboxCreatorView) - .$(AppLocalizations().done) - .tap(); + .$(AppLocalizations().createFolder) + .tap(); } Future expandMailboxWithName(String name) async { await $(MailboxItemWidget) - .which((widget) { - return widget.mailboxNode.item.name?.name.toLowerCase() == - name.toLowerCase(); - }) - .$(TMailButtonWidget) - .which((widget) { - return widget.icon == ImagePaths().icArrowRight; - }) - .tap(); + .which((widget) { + return widget.mailboxNode.item.name?.name.toLowerCase() == + name.toLowerCase(); + }) + .$(#expand_mailbox_button) + .tap(); } Future openMailboxSearch() async { @@ -137,4 +136,43 @@ class MailboxMenuRobot extends CoreRobot { await $(AppLocalizations().restore).tap(); await $.pumpAndSettle(); } + + Future tapRenameMailbox() async { + await $(AppLocalizations().renameFolder).tap(); + } + + Future enterRenameSubFolderName(String name) async { + await $(#rename_mailbox_dialog) + .$(TextField) + .enterText(name); + await $.pumpAndSettle(duration: const Duration(seconds: 1)); + } + + Future confirmRenameSubFolder() async { + await $(#rename_mailbox_dialog) + .$(AppLocalizations().rename.toUpperCase()) + .tap(); + } + + Future tapMoveMailbox() async { + await $(AppLocalizations().moveFolder).tap(); + } + + Future tapMailboxWithName(String name) async { + await $(name).tap(); + await $.pumpAndSettle(duration: const Duration(seconds: 2)); + } + + Future tapDeleteMailbox() async { + await $(AppLocalizations().deleteFolder).tap(); + } + + Future confirmDeleteMailbox() async { + await $(AppLocalizations().delete).tap(); + await $.pumpAndSettle(duration: const Duration(seconds: 2)); + } + + Future tapAddNewFolderButton() async { + await $(#add_new_folder_button).tap(); + } } \ No newline at end of file diff --git a/integration_test/scenarios/mailbox/create_and_hide_sub_folder_scenario.dart b/integration_test/scenarios/mailbox/create_and_hide_sub_folder_scenario.dart index c1e48d2c9..1a8d8c7d8 100644 --- a/integration_test/scenarios/mailbox/create_and_hide_sub_folder_scenario.dart +++ b/integration_test/scenarios/mailbox/create_and_hide_sub_folder_scenario.dart @@ -22,8 +22,8 @@ class CreateAndHideSubFolderScenario extends BaseTestScenario { appLocalizations.inboxMailboxDisplayName, ); await mailboxMenuRobot.tapCreateNewSubFolder(); - await mailboxMenuRobot.enterNewSubFolderName(subFolderName); - await mailboxMenuRobot.confirmCreateNewSubFolder(); + await mailboxMenuRobot.enterNewFolderName(subFolderName); + await mailboxMenuRobot.confirmCreateNewFolder(); await _expectMailboxWithNameVisible(subFolderName); await threadRobot.openMailbox(); diff --git a/integration_test/scenarios/mailbox/create_personal_folder_scenario.dart b/integration_test/scenarios/mailbox/create_personal_folder_scenario.dart new file mode 100644 index 000000000..ce314e538 --- /dev/null +++ b/integration_test/scenarios/mailbox/create_personal_folder_scenario.dart @@ -0,0 +1,27 @@ +import 'package:flutter_test/flutter_test.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../robots/mailbox_menu_robot.dart'; +import '../../robots/thread_robot.dart'; + +class CreatePersonalFolderScenario extends BaseTestScenario { + const CreatePersonalFolderScenario(super.$); + + @override + Future runTestLogic() async { + const folderName = 'crud personal folder'; + + final threadRobot = ThreadRobot($); + final mailboxMenuRobot = MailboxMenuRobot($); + + await threadRobot.openMailbox(); + await mailboxMenuRobot.tapAddNewFolderButton(); + await mailboxMenuRobot.enterNewFolderName(folderName); + await mailboxMenuRobot.confirmCreateNewFolder(); + await _expectMailboxWithNameVisible(folderName); + } + + Future _expectMailboxWithNameVisible(String name) async { + await expectViewVisible($(name)); + } +} \ No newline at end of file diff --git a/integration_test/scenarios/mailbox/create_rename_move_and_delete_mailbox_scenario.dart b/integration_test/scenarios/mailbox/create_rename_move_and_delete_mailbox_scenario.dart new file mode 100644 index 000000000..37ef81adb --- /dev/null +++ b/integration_test/scenarios/mailbox/create_rename_move_and_delete_mailbox_scenario.dart @@ -0,0 +1,77 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_item_widget.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../robots/mailbox_menu_robot.dart'; +import '../../robots/thread_robot.dart'; + +class CreateRenameMoveAndDeleteMailboxScenario extends BaseTestScenario { + const CreateRenameMoveAndDeleteMailboxScenario(super.$); + + @override + Future runTestLogic() async { + const subFolderName = 'crud sub folder'; + const subFolderRenamedName = 'renamed sub folder'; + + final threadRobot = ThreadRobot($); + final mailboxMenuRobot = MailboxMenuRobot($); + final appLocalizations = AppLocalizations(); + + // Create sub folder + await threadRobot.openMailbox(); + await mailboxMenuRobot.longPressMailboxWithName( + appLocalizations.inboxMailboxDisplayName, + ); + await mailboxMenuRobot.tapCreateNewSubFolder(); + await mailboxMenuRobot.enterNewFolderName(subFolderName); + await mailboxMenuRobot.confirmCreateNewFolder(); + await _expectMailboxWithNameVisible(subFolderName); + + // Rename sub folder + await threadRobot.openMailbox(); + await mailboxMenuRobot.expandMailboxWithName( + appLocalizations.inboxMailboxDisplayName + ); + await mailboxMenuRobot.longPressMailboxWithName(subFolderName); + await mailboxMenuRobot.tapRenameMailbox(); + await mailboxMenuRobot.enterRenameSubFolderName(subFolderRenamedName); + await mailboxMenuRobot.confirmRenameSubFolder(); + await _expectMailboxWithNameVisible(subFolderRenamedName); + + // Move sub folder to archive mailbox + await mailboxMenuRobot.longPressMailboxWithName(subFolderRenamedName); + await mailboxMenuRobot.tapMoveMailbox(); + await mailboxMenuRobot.tapMailboxWithName(appLocalizations.archiveMailboxDisplayName); + await _expectMailboxWithNameHaveSubFolder(appLocalizations.archiveMailboxDisplayName); + + // Delete sub folder + await mailboxMenuRobot.expandMailboxWithName(appLocalizations.archiveMailboxDisplayName); + await mailboxMenuRobot.longPressMailboxWithName(subFolderRenamedName); + await mailboxMenuRobot.tapDeleteMailbox(); + await mailboxMenuRobot.confirmDeleteMailbox(); + await _expectMailboxWithNameNotHaveSubFolder(appLocalizations.archiveMailboxDisplayName); + } + + Future _expectMailboxWithNameVisible(String name) async { + await expectViewVisible($(name)); + } + + Future _expectMailboxWithNameHaveSubFolder(String name) async { + await expectViewVisible( + $(MailboxItemWidget).which((widget) { + return widget.mailboxNode.item.name?.name.toLowerCase() == name.toLowerCase() + && widget.mailboxNode.hasChildren(); + }) + ); + } + + Future _expectMailboxWithNameNotHaveSubFolder(String name) async { + await expectViewVisible( + $(MailboxItemWidget).which((widget) { + return widget.mailboxNode.item.name?.name.toLowerCase() == name.toLowerCase() + && !widget.mailboxNode.hasChildren(); + }) + ); + } +} \ No newline at end of file diff --git a/integration_test/tests/mailbox/create_personal_folder_test.dart b/integration_test/tests/mailbox/create_personal_folder_test.dart new file mode 100644 index 000000000..40a0895e5 --- /dev/null +++ b/integration_test/tests/mailbox/create_personal_folder_test.dart @@ -0,0 +1,9 @@ +import '../../base/test_base.dart'; +import '../../scenarios/mailbox/create_personal_folder_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should create personal mailbox successfully', + scenarioBuilder: ($) => CreatePersonalFolderScenario($), + ); +} \ No newline at end of file diff --git a/integration_test/tests/mailbox/create_rename_move_and_delete_mailbox_test.dart b/integration_test/tests/mailbox/create_rename_move_and_delete_mailbox_test.dart new file mode 100644 index 000000000..d675d17ca --- /dev/null +++ b/integration_test/tests/mailbox/create_rename_move_and_delete_mailbox_test.dart @@ -0,0 +1,9 @@ +import '../../base/test_base.dart'; +import '../../scenarios/mailbox/create_rename_move_and_delete_mailbox_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should create, rename, move and delete mailbox successfully', + scenarioBuilder: ($) => CreateRenameMoveAndDeleteMailboxScenario($), + ); +} \ No newline at end of file diff --git a/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart b/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart index 1f25d5011..6a71959d4 100644 --- a/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart +++ b/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart @@ -55,6 +55,7 @@ class FoldersBarWidget extends StatelessWidget { } Widget newFolderIcon = TMailButtonWidget.fromIcon( + key: const Key('add_new_folder_button'), icon: imagePaths.icAddNewFolder, backgroundColor: Colors.transparent, iconColor: AppColor.steelGrayA540, diff --git a/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart b/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart index 408954296..cd29ea1bf 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart @@ -28,6 +28,7 @@ class MailboxExpandButton extends StatelessWidget { @override Widget build(BuildContext context) { return TMailButtonWidget.fromIcon( + key: const Key('expand_mailbox_button'), icon: mailboxNode.expandMode.getIcon( imagePaths, DirectionUtils.isDirectionRTLByLanguage(context), diff --git a/pubspec.lock b/pubspec.lock index 293c4ac16..7e06994d3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1637,10 +1637,10 @@ packages: dependency: "direct dev" description: name: patrol_finders - sha256: "4c6d78e00362fd15d7c21cfac110e501d08ada7d77000bad139b0c3c2e27ccaf" + sha256: "8787f9d5c3417b72e8959a55ad51c024cc0594d15e5db85bc179c4d8faa0c493" url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.7.2" patrol_log: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 8f23a7754..ad2224332 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -293,7 +293,7 @@ dev_dependencies: patrol_log: 0.3.0 - patrol_finders: 2.7.0 + patrol_finders: 2.7.2 plugin_platform_interface: 2.1.8