diff --git a/integration_test/robots/email_robot.dart b/integration_test/robots/email_robot.dart index 63811fdfb..7ca79f2f6 100644 --- a/integration_test/robots/email_robot.dart +++ b/integration_test/robots/email_robot.dart @@ -1,8 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/base/widget/labels/tag_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_item_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/email_subject_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_back_button.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/information_sender_and_receiver_builder.dart'; +import 'package:tmail_ui_user/features/labels/presentation/widgets/label_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import '../base/core_robot.dart'; @@ -83,4 +86,8 @@ class EmailRobot extends CoreRobot { Future onTapAttachmentItem() async { await $(AttachmentItemWidget).$(InkWell).tap(); } + + Future tapRemoveLabelButton(String labelDisplayName) async { + await $(EmailSubjectWidget).$(LabelWidget).$(TagWidget).$(InkWell).tap(); + } } \ No newline at end of file diff --git a/integration_test/robots/thread_robot.dart b/integration_test/robots/thread_robot.dart index e6cabab33..f43403f62 100644 --- a/integration_test/robots/thread_robot.dart +++ b/integration_test/robots/thread_robot.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/views/search/search_bar_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:labels/extensions/label_extension.dart'; import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'; @@ -32,6 +33,17 @@ class ThreadRobot extends CoreRobot { await $.pump(const Duration(seconds: 2)); } + Future openEmailWithLabel(String labelDisplayName) async { + final email = $(EmailTileBuilder).which( + (view) => + view.labels + ?.any((label) => label.safeDisplayName == labelDisplayName) == + true, + ); + await $.waitUntilVisible(email); + await email.tap(); + } + Future openMailbox() async { await $(#mobile_mailbox_menu_button).tap(); } diff --git a/integration_test/scenarios/labels/remove_a_label_from_email_scenario.dart b/integration_test/scenarios/labels/remove_a_label_from_email_scenario.dart new file mode 100644 index 000000000..4365f9c52 --- /dev/null +++ b/integration_test/scenarios/labels/remove_a_label_from_email_scenario.dart @@ -0,0 +1,93 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:labels/labels.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/email_subject_widget.dart'; +import 'package:tmail_ui_user/features/labels/presentation/widgets/label_widget.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/label_list_view.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../mixin/provisioning_label_scenario_mixin.dart'; +import '../../robots/email_robot.dart'; +import '../../robots/label_robot.dart'; +import '../../robots/thread_robot.dart'; + +class RemoveALabelFromEmailScenario extends BaseTestScenario + with ProvisioningLabelScenarioMixin { + const RemoveALabelFromEmailScenario(super.$); + + @override + Future runTestLogic() async { + const emailUser = String.fromEnvironment('BASIC_AUTH_EMAIL'); + + final threadRobot = ThreadRobot($); + final emailRobot = EmailRobot($); + final labelRobot = LabelRobot($); + + final labels = await provisionLabelsByDisplayNames( + ['Remove Tag 1'], + ); + await $.pumpAndSettle(); + + final firstLabel = labels.first; + final labelDisplayName = firstLabel.safeDisplayName; + await provisionEmail( + buildEmailsForLabel( + label: firstLabel, + toEmail: emailUser, + count: 1, + ), + requestReadReceipt: false, + ); + await $.pumpAndSettle(duration: const Duration(seconds: 2)); + + await threadRobot.openMailbox(); + await _expectLabelListViewVisible(); + + await labelRobot.openLabelByName(labelDisplayName); + await _expectEmailListDisplayedCorrectByTag(labelDisplayName); + + await threadRobot.openEmailWithLabel(labelDisplayName); + await $.pumpAndSettle(duration: const Duration(seconds: 1)); + await _expectLabelDisplayedOnEmailSubject(labelDisplayName); + + await emailRobot.tapRemoveLabelButton(labelDisplayName); + await _expectRemoveLabelFromEmailSuccessToast(labelDisplayName); + } + + Future _expectLabelListViewVisible() => + expectViewVisible($(LabelListView)); + + Future _expectEmailListDisplayedCorrectByTag( + String labelDisplayName, + ) async { + final listEmailTileWithTag = $.tester.widgetList( + $(EmailTileBuilder).which((widget) => + widget.presentationEmail.subject?.contains(labelDisplayName) == true), + ); + + expect(listEmailTileWithTag.length, greaterThanOrEqualTo(1)); + } + + Future _expectLabelDisplayedOnEmailSubject( + String labelDisplayName, + ) async { + expect( + $(EmailSubjectWidget) + .$(LabelWidget) + .which( + (widget) => widget.label.safeDisplayName == labelDisplayName) + .visible, + true, + ); + } + + Future _expectRemoveLabelFromEmailSuccessToast( + String labelDisplayName, + ) async { + await expectViewVisible( + $(find.text(AppLocalizations() + .removeLabelFromEmailSuccessfullyMessage(labelDisplayName))), + ); + } +} diff --git a/integration_test/tests/labels/remove_a_label_from_email_test.dart b/integration_test/tests/labels/remove_a_label_from_email_test.dart new file mode 100644 index 000000000..af2353f83 --- /dev/null +++ b/integration_test/tests/labels/remove_a_label_from_email_test.dart @@ -0,0 +1,10 @@ +import '../../base/test_base.dart'; +import '../../scenarios/labels/remove_a_label_from_email_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: + 'Should remove tag on email subject when click click on the cross on a tag in the opened mail', + scenarioBuilder: ($) => RemoveALabelFromEmailScenario($), + ); +}