diff --git a/integration_test/robots/mailbox_menu_robot.dart b/integration_test/robots/mailbox_menu_robot.dart index 0cad82b56..c6846f1bb 100644 --- a/integration_test/robots/mailbox_menu_robot.dart +++ b/integration_test/robots/mailbox_menu_robot.dart @@ -125,4 +125,16 @@ class MailboxMenuRobot extends CoreRobot { getBinding()?.reloadQuota(); await $.pumpAndSettle(duration: const Duration(seconds: 2)); } + + Future tapRecoverDeletedMessages() async { + await $(AppLocalizations().recoverDeletedMessages).tap(); + } + + Future tapConfirmRecoverDeletedMessages() async { + if (await $.native.isPermissionDialogVisible(timeout: const Duration(seconds: 2))) { + await $.native.grantPermissionWhenInUse(); + } + await $(AppLocalizations().restore).tap(); + await $.pumpAndSettle(); + } } \ No newline at end of file diff --git a/integration_test/robots/thread_robot.dart b/integration_test/robots/thread_robot.dart index 9e15cf98f..96e04f743 100644 --- a/integration_test/robots/thread_robot.dart +++ b/integration_test/robots/thread_robot.dart @@ -82,4 +82,8 @@ class ThreadRobot extends CoreRobot { await $(name).tap(); await $.pumpAndSettle(); } + + Future confirmEmptyTrash() async { + await $(AppLocalizations().delete_all).tap(); + } } \ No newline at end of file diff --git a/integration_test/scenarios/mailbox/empty_and_recover_trash_scenario.dart b/integration_test/scenarios/mailbox/empty_and_recover_trash_scenario.dart new file mode 100644 index 000000000..303579a31 --- /dev/null +++ b/integration_test/scenarios/mailbox/empty_and_recover_trash_scenario.dart @@ -0,0 +1,61 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/base/widget/clean_messages_banner.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 EmptyAndRecoverTrashScenario extends BaseTestScenario { + const EmptyAndRecoverTrashScenario(super.$); + + @override + Future runTestLogic() async { + const toEmail = String.fromEnvironment('BASIC_AUTH_EMAIL'); + const subject = 'trash and recover'; + + final threadRobot = ThreadRobot($); + final mailboxMenuRobot = MailboxMenuRobot($); + final appLocalizations = AppLocalizations(); + + await provisionEmail( + [ProvisioningEmail( + toEmail: toEmail, + subject: subject, + content: '', + )], + folderLocationRole: PresentationMailbox.roleTrash, + ); + + await threadRobot.openMailbox(); + await mailboxMenuRobot.openFolderByName( + appLocalizations.trashMailboxDisplayName, + ); + await threadRobot.tapEmptyTrashBanner(); + await threadRobot.confirmEmptyTrash(); + await _expectTrashBannerInvisible(); + + await threadRobot.openMailbox(); + await mailboxMenuRobot.longPressMailboxWithName( + appLocalizations.trashMailboxDisplayName, + ); + await mailboxMenuRobot.tapRecoverDeletedMessages(); + await mailboxMenuRobot.tapConfirmRecoverDeletedMessages(); + await threadRobot.openMailbox(); + await mailboxMenuRobot.openFolderByName( + appLocalizations.recoveredMailboxDisplayName, + ); + await _expectEmailWithSubjectVisible(subject); + } + + Future _expectTrashBannerInvisible() async { + await $(#clean_message_banner_not_visible).waitUntilExists(); + expect($(CleanMessagesBanner).visible, false); + } + + Future _expectEmailWithSubjectVisible(String subject) async { + await expectViewVisible($(subject)); + } +} \ No newline at end of file diff --git a/integration_test/tests/mailbox/empty_and_recover_trash_test.dart b/integration_test/tests/mailbox/empty_and_recover_trash_test.dart new file mode 100644 index 000000000..861c97eac --- /dev/null +++ b/integration_test/tests/mailbox/empty_and_recover_trash_test.dart @@ -0,0 +1,9 @@ +import '../../base/test_base.dart'; +import '../../scenarios/mailbox/empty_and_recover_trash_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should empty and recover trash successfully', + scenarioBuilder: ($) => EmptyAndRecoverTrashScenario($), + ); +} \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 250a503aa..84953464c 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -237,7 +237,9 @@ class ThreadView extends GetWidget ), ); } else { - return const SizedBox.shrink(); + return const SizedBox.shrink( + key: Key('clean_message_banner_not_visible'), + ); } }), if (!controller.responsiveUtils.isDesktop(context))