From 817499f7ae0807ec51f7bf2f75d7e30854d4ce78 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 1 Apr 2025 16:22:12 +0700 Subject: [PATCH] TF-3570 Add integration test for case mark as unread in EmailView Signed-off-by: dab246 --- integration_test/robots/email_robot.dart | 8 +++ .../mark_as_unread_email_scenario.dart | 66 +++++++++++++++++++ ...d_email_when_open_detailed_email_test.dart | 9 +++ .../widgets/email_view_app_bar_widget.dart | 1 + .../mixin/base_email_item_tile.dart | 1 + .../widgets/email_tile_builder.dart | 8 +-- 6 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 integration_test/scenarios/email_detailed/mark_as_unread_email_scenario.dart create mode 100644 integration_test/tests/email_detailed/mark_as_unread_email_when_open_detailed_email_test.dart diff --git a/integration_test/robots/email_robot.dart b/integration_test/robots/email_robot.dart index 7d33a9fc5..ff3ce14a0 100644 --- a/integration_test/robots/email_robot.dart +++ b/integration_test/robots/email_robot.dart @@ -32,4 +32,12 @@ class EmailRobot extends CoreRobot { Future onTapBackButton() async { await $(find.byType(EmailViewBackButton)).first.tap(); } + + Future tapEmailDetailedMoreButton() async { + await $(#email_detailed_more_button).tap(); + } + + Future tapMarkAsUnreadOptionInContextMenu() async { + await $(#markAsUnread_action).tap(); + } } \ No newline at end of file diff --git a/integration_test/scenarios/email_detailed/mark_as_unread_email_scenario.dart b/integration_test/scenarios/email_detailed/mark_as_unread_email_scenario.dart new file mode 100644 index 000000000..df34f163a --- /dev/null +++ b/integration_test/scenarios/email_detailed/mark_as_unread_email_scenario.dart @@ -0,0 +1,66 @@ + +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/email/presentation/email_view.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../models/provisioning_email.dart'; +import '../../robots/email_robot.dart'; +import '../../robots/thread_robot.dart'; + +class MarkAsUnreadEmailScenario extends BaseTestScenario { + + const MarkAsUnreadEmailScenario(super.$); + + @override + Future runTestLogic() async { + const subject = 'Mark as unread email'; + const emailUser = String.fromEnvironment('BASIC_AUTH_EMAIL'); + final threadRobot = ThreadRobot($); + final emailRobot = EmailRobot($); + + await provisionEmail( + [ + ProvisioningEmail( + toEmail: emailUser, + subject: subject, + content: subject, + ), + ], + requestReadReceipt: false, + ); + await $.pumpAndSettle(); + + await threadRobot.openEmailWithSubject(subject); + await $.pumpAndSettle(); + _expectEmailDetailedMoreButtonVisible(); + + await emailRobot.tapEmailDetailedMoreButton(); + await $.pumpAndSettle(duration: const Duration(seconds: 2)); + + await emailRobot.tapMarkAsUnreadOptionInContextMenu(); + await $.pumpAndSettle(duration: const Duration(seconds: 3)); + + _expectEmailViewInvisible(); + await _expectDisplayedEmailHasUnreadIcon(subject); + } + + void _expectEmailDetailedMoreButtonVisible() { + expect($(#email_detailed_more_button), findsOneWidget); + } + + void _expectEmailViewInvisible() { + expect($(EmailView).visible, isFalse); + } + + Future _expectDisplayedEmailHasUnreadIcon(String subject) async { + await expectViewVisible( + $(EmailTileBuilder) + .which( + (widget) => widget.presentationEmail.subject == subject + && !widget.presentationEmail.hasRead + ), + ); + await expectViewVisible($(#unread_status_icon)); + } +} \ No newline at end of file diff --git a/integration_test/tests/email_detailed/mark_as_unread_email_when_open_detailed_email_test.dart b/integration_test/tests/email_detailed/mark_as_unread_email_when_open_detailed_email_test.dart new file mode 100644 index 000000000..da26603c8 --- /dev/null +++ b/integration_test/tests/email_detailed/mark_as_unread_email_when_open_detailed_email_test.dart @@ -0,0 +1,9 @@ +import '../../base/test_base.dart'; +import '../../scenarios/email_detailed/mark_as_unread_email_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should see email item has unread icon when open detailed email and select mark as unread email successfully', + scenarioBuilder: ($) => MarkAsUnreadEmailScenario($), + ); +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart index 391010ff5..e67f0b272 100644 --- a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart +++ b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart @@ -220,6 +220,7 @@ class EmailViewAppBarWidget extends StatelessWidget { AppLocalizations applocalizations, bool isScreenWithShortestSide, ) => TMailButtonWidget.fromIcon( + key: const Key('email_detailed_more_button'), icon: _imagePaths.icMoreVertical, iconSize: EmailViewAppBarWidgetStyles.buttonIconSize, iconColor: EmailViewAppBarWidgetStyles.iconColor, diff --git a/lib/features/thread/presentation/mixin/base_email_item_tile.dart b/lib/features/thread/presentation/mixin/base_email_item_tile.dart index 4c31725ab..04d85e47e 100644 --- a/lib/features/thread/presentation/mixin/base_email_item_tile.dart +++ b/lib/features/thread/presentation/mixin/base_email_item_tile.dart @@ -208,6 +208,7 @@ mixin BaseEmailItemTile { Widget buildIconUnreadStatus() { return SvgPicture.asset( + key: const Key('unread_status_icon'), imagePaths.icUnreadStatus, width: 9, height: 9, diff --git a/lib/features/thread/presentation/widgets/email_tile_builder.dart b/lib/features/thread/presentation/widgets/email_tile_builder.dart index 67ef43d57..cd6b7c136 100644 --- a/lib/features/thread/presentation/widgets/email_tile_builder.dart +++ b/lib/features/thread/presentation/widgets/email_tile_builder.dart @@ -1,6 +1,5 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; @@ -73,11 +72,8 @@ class EmailTileBuilder extends StatelessWidget with BaseEmailItemTile { if (!presentationEmail.hasRead) Padding( padding: const EdgeInsetsDirectional.only(end: 5), - child: SvgPicture.asset( - imagePaths.icUnreadStatus, - width: 9, - height: 9, - fit: BoxFit.fill)), + child: buildIconUnreadStatus(), + ), Expanded(child: buildInformationSender( context, presentationEmail,