diff --git a/integration_test/mixin/setting_scenario_mixin.dart b/integration_test/mixin/setting_scenario_mixin.dart index 29dc03e7f..09695bcb2 100644 --- a/integration_test/mixin/setting_scenario_mixin.dart +++ b/integration_test/mixin/setting_scenario_mixin.dart @@ -42,4 +42,17 @@ mixin SettingScenarioMixin on BaseScenario { ) async { await expectViewVisible($(find.text(appLocalizations.language))); } + + Future goToSettingToEnableThread({ + required ThreadRobot threadRobot, + required SettingRobot settingRobot, + required MailboxMenuRobot mailboxMenuRobot, + }) async { + await threadRobot.openMailbox(); + await mailboxMenuRobot.openSetting(); + await settingRobot.openPreferencesMenuItem(); + await settingRobot.switchOnThreadSetting(); + await settingRobot.backToSettingsFromFirstLevel(); + await settingRobot.closeSettings(); + } } diff --git a/integration_test/robots/email_robot.dart b/integration_test/robots/email_robot.dart index be6871481..af9731591 100644 --- a/integration_test/robots/email_robot.dart +++ b/integration_test/robots/email_robot.dart @@ -95,4 +95,8 @@ class EmailRobot extends CoreRobot { .$(InkWell) .tap(); } + + Future tapDeleteThreadButton() async { + await $(#delete_thread_button).tap(); + } } \ No newline at end of file diff --git a/integration_test/scenarios/email_detailed/delete_thread_to_trash_scenario.dart b/integration_test/scenarios/email_detailed/delete_thread_to_trash_scenario.dart new file mode 100644 index 000000000..f64ce3acc --- /dev/null +++ b/integration_test/scenarios/email_detailed/delete_thread_to_trash_scenario.dart @@ -0,0 +1,51 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../mixin/generate_email_scenario_mixin.dart'; +import '../../mixin/setting_scenario_mixin.dart'; +import '../../robots/email_robot.dart'; +import '../../robots/mailbox_menu_robot.dart'; +import '../../robots/setting_robot.dart'; +import '../../robots/thread_robot.dart'; + +class DeleteThreadToTrashScenario extends BaseTestScenario + with GenerateEmailScenarioMixin, SettingScenarioMixin { + const DeleteThreadToTrashScenario(super.$); + + @override + Future runTestLogic() async { + const subject = 'Delete thread to trash'; + const emailUser = String.fromEnvironment('BASIC_AUTH_EMAIL'); + + final threadRobot = ThreadRobot($); + final settingRobot = SettingRobot($); + final mailboxMenuRobot = MailboxMenuRobot($); + final emailRobot = EmailRobot($); + final appLocalizations = AppLocalizations(); + + await goToSettingToEnableThread( + threadRobot: threadRobot, + settingRobot: settingRobot, + mailboxMenuRobot: mailboxMenuRobot, + ); + + await generateEmailWithSubject(emailUser: emailUser, subject: subject); + + await threadRobot.openEmailWithSubject(subject); + await $.pumpAndSettle(); + + await emailRobot.tapDeleteThreadButton(); + await $.pumpAndSettle(); + + await _expectDeleteThreadSuccessToast(appLocalizations); + } + + Future _expectDeleteThreadSuccessToast( + AppLocalizations appLocalizations, + ) async { + await expectViewVisible( + $(find.text(appLocalizations.moved_to_trash)), + ); + } +} diff --git a/integration_test/tests/email_detailed/delete_thread_to_trash_test.dart b/integration_test/tests/email_detailed/delete_thread_to_trash_test.dart new file mode 100644 index 000000000..532738a2b --- /dev/null +++ b/integration_test/tests/email_detailed/delete_thread_to_trash_test.dart @@ -0,0 +1,10 @@ +import '../../base/test_base.dart'; +import '../../scenarios/email_detailed/delete_thread_to_trash_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: + 'Should see toast message success when open detailed email and delete thread successfully', + scenarioBuilder: ($) => DeleteThreadToTrashScenario($), + ); +} diff --git a/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart b/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart index d6e112425..0a311de4e 100644 --- a/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart +++ b/lib/features/thread_detail/presentation/widgets/thread_detail_app_bar.dart @@ -68,6 +68,7 @@ class ThreadDetailAppBar extends StatelessWidget { onTapActionCallback: (_) => onThreadActionClick?.call(EmailActionType.moveToMailbox), ), _ThreadDetailAppBarButton( + key: const Key('delete_thread_button'), icon: imagePaths.icDeleteComposer, iconColor: threadDetailCanPermanentlyDelete ? AppColor.redFF3347 @@ -183,6 +184,7 @@ class ThreadDetailAppBar extends StatelessWidget { class _ThreadDetailAppBarButton extends StatelessWidget { const _ThreadDetailAppBarButton({ + super.key, required this.icon, required this.tooltipMessage, required this.onTapActionCallback,