TF-3579 E2E Mailbox mark as read

This commit is contained in:
DatDang
2025-03-19 16:36:57 +07:00
committed by Dat H. Pham
parent a65bf27bb9
commit e6c3ebf0d7
8 changed files with 90 additions and 201 deletions
@@ -175,4 +175,9 @@ class MailboxMenuRobot extends CoreRobot {
Future<void> tapAddNewFolderButton() async {
await $(#add_new_folder_button).tap();
}
Future<void> tapMarkAsRead() async {
await $(AppLocalizations().mark_as_read).tap();
await $.pumpAndSettle();
}
}
+9 -4
View File
@@ -113,13 +113,18 @@ class ThreadRobot extends CoreRobot {
}
Future<void> moveEmailToMailboxWithName(String mailboxName) async {
await $(#move_selected_email_to_mailbox_button).tap();
await $(#moreAction_selected_email_button).tap();
await $.pumpAndTrySettle();
await $(#moveToMailbox_action).tap();
await $.pumpAndTrySettle();
await $(mailboxName).tap();
await $.pumpAndSettle();
await $.pumpAndTrySettle();
}
Future<void> moveEmailToTrash() async {
await $(#delete_selected_email_button).tap();
await $.pumpAndSettle();
await $(#moveToTrash_selected_email_button).tap();
await $.pumpAndTrySettle();
}
}
@@ -0,0 +1,64 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.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 MarkMailboxAsReadScenario extends BaseTestScenario {
const MarkMailboxAsReadScenario(super.$);
@override
Future<void> runTestLogic() async {
const email = String.fromEnvironment('BASIC_AUTH_EMAIL');
final threadRobot = ThreadRobot($);
final mailboxMenuRobot = MailboxMenuRobot($);
await provisionEmail([ProvisioningEmail(
toEmail: email,
subject: 'placeholder email',
content: ''
)]);
await $.pumpAndSettle(duration: const Duration(seconds: 2));
await threadRobot.openMailbox();
await $.pumpAndTrySettle();
_expectInboxUnreadCountVisible();
await mailboxMenuRobot.longPressMailboxWithName(
AppLocalizations().inboxMailboxDisplayName,
);
await mailboxMenuRobot.tapMarkAsRead();
await threadRobot.openMailbox();
await $.pumpAndTrySettle();
_expectInboxUnreadCountInvisible();
}
void _expectInboxUnreadCountVisible() {
expect(
$(TrailingMailboxItemWidget).which<TrailingMailboxItemWidget>((widget) {
final mailbox = widget.mailboxNode.item;
return mailbox.role == PresentationMailbox.roleInbox &&
mailbox.countUnReadEmailsAsString.isNotEmpty;
}),
findsOneWidget,
);
}
void _expectInboxUnreadCountInvisible() {
expect(
$(TrailingMailboxItemWidget)
.which<TrailingMailboxItemWidget>((widget) {
final mailbox = widget.mailboxNode.item;
return mailbox.role == PresentationMailbox.roleInbox
&& mailbox.countUnReadEmailsAsString.isNotEmpty;
}
),
findsNothing,
);
}
}
@@ -0,0 +1,9 @@
import '../../base/test_base.dart';
import '../../scenarios/mailbox/mark_mailbox_as_read_scenario.dart';
void main() {
TestBase().runPatrolTest(
description: 'Should not see unread counter when mark mailbox as read',
scenarioBuilder: ($) => MarkMailboxAsReadScenario($),
);
}
@@ -71,6 +71,7 @@ extension HandlePressEmailSelectionActionExtension on SearchEmailController {
AppLocalizations.of(context),
imagePaths,
category: action.category,
key: '${action.name}_action',
))
.toList();
@@ -71,6 +71,7 @@ extension HandlePressEmailSelectionActionExtension on ThreadController {
AppLocalizations.of(context),
imagePaths,
category: action.category,
key: '${action.name}_action',
))
.toList();
@@ -64,6 +64,7 @@ class SelectionMobileAppBarThreadWidget extends StatelessWidget {
),
...emailSelectionActionTypes.map(
(type) => TMailButtonWidget.fromIcon(
key: Key('${type.name}_selected_email_button'),
icon: type.getIcon(imagePaths),
iconColor: type.getIconColor(),
iconSize: type.getIconSize(),
@@ -1,197 +0,0 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/list_presentation_email_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnPressEmailSelectionActionClick = void Function(EmailActionType, List<PresentationEmail>);
class BottomBarThreadSelectionWidget extends StatelessWidget{
final ImagePaths _imagePaths;
final ResponsiveUtils _responsiveUtils;
final List<PresentationEmail> _listSelectionEmail;
final PresentationMailbox? _currentMailbox;
final OnPressEmailSelectionActionClick? onPressEmailSelectionActionClick;
const BottomBarThreadSelectionWidget(
this._imagePaths,
this._responsiveUtils,
this._listSelectionEmail,
this._currentMailbox,
{
super.key,
this.onPressEmailSelectionActionClick,
}
);
@override
Widget build(BuildContext context) {
return Container(
decoration: const BoxDecoration(
border: Border(top: BorderSide(
color: AppColor.colorDividerHorizontal,
width: 0.5,
)),
),
child: IntrinsicHeight(
child: Row(
children: [
if (_currentMailbox?.isDrafts == false)
Expanded(
child: TMailButtonWidget(
key: const Key('mark_as_read_selected_email_button'),
text: _listSelectionEmail.isAllEmailRead
? AppLocalizations.of(context).unread
: AppLocalizations.of(context).read,
icon: _listSelectionEmail.isAllEmailRead ? _imagePaths.icUnread : _imagePaths.icRead,
borderRadius: 0,
iconSize: 20,
iconColor: AppColor.steelGrayA540,
flexibleText: true,
textAlign: TextAlign.center,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12),
backgroundColor: Colors.transparent,
textStyle: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 12,
color: AppColor.steelGrayA540,
),
verticalDirection: _verticalDirection(context),
onTapActionCallback: () {
onPressEmailSelectionActionClick?.call(
_listSelectionEmail.isAllEmailRead ? EmailActionType.markAsUnread : EmailActionType.markAsRead,
_listSelectionEmail
);
},
),
),
Expanded(
child: TMailButtonWidget(
key: const Key('mark_as_star_selected_email_button'),
text: _listSelectionEmail.isAllEmailStarred
? AppLocalizations.of(context).un_star
: AppLocalizations.of(context).star,
icon: _listSelectionEmail.isAllEmailStarred ? _imagePaths.icUnStar : _imagePaths.icStar,
borderRadius: 0,
iconSize: 20,
iconColor: _listSelectionEmail.isAllEmailStarred
? AppColor.steelGrayA540
: null,
flexibleText: true,
textAlign: TextAlign.center,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12),
backgroundColor: Colors.transparent,
textStyle: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 12,
color: AppColor.steelGrayA540,
),
verticalDirection: _verticalDirection(context),
onTapActionCallback: () {
onPressEmailSelectionActionClick?.call(
_listSelectionEmail.isAllEmailStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred,
_listSelectionEmail
);
},
),
),
if (_currentMailbox?.isDrafts == false)
Expanded(
child: TMailButtonWidget(
key: const Key('move_selected_email_to_mailbox_button'),
text: AppLocalizations.of(context).move,
icon: _imagePaths.icMoveMailbox,
borderRadius: 0,
iconSize: 20,
iconColor: AppColor.steelGrayA540,
textAlign: TextAlign.center,
flexibleText: true,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12),
backgroundColor: Colors.transparent,
textStyle: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 12,
color: AppColor.steelGrayA540,
),
verticalDirection: _verticalDirection(context),
onTapActionCallback: () {
onPressEmailSelectionActionClick?.call(EmailActionType.moveToMailbox, _listSelectionEmail);
},
),
),
if (_currentMailbox?.isDrafts == false)
Expanded(
child: TMailButtonWidget(
key: const Key('move_selected_email_to_spam_button'),
text: _currentMailbox?.isSpam == true
? AppLocalizations.of(context).un_spam
: AppLocalizations.of(context).spam,
icon: _currentMailbox?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam,
borderRadius: 0,
iconSize: 20,
iconColor: AppColor.steelGrayA540,
flexibleText: true,
textAlign: TextAlign.center,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12),
backgroundColor: Colors.transparent,
textStyle: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 12,
color: AppColor.steelGrayA540,
),
verticalDirection: _verticalDirection(context),
onTapActionCallback: () {
if (_currentMailbox?.isSpam == true) {
onPressEmailSelectionActionClick?.call(EmailActionType.unSpam, _listSelectionEmail);
} else {
onPressEmailSelectionActionClick?.call(EmailActionType.moveToSpam, _listSelectionEmail);
}
},
),
),
Expanded(
child: TMailButtonWidget(
key: const Key('delete_selected_email_button'),
text: AppLocalizations.of(context).delete,
icon: _imagePaths.icDeleteComposer,
borderRadius: 0,
iconSize: 20,
iconColor: AppColor.steelGrayA540,
flexibleText: true,
textAlign: TextAlign.center,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12),
backgroundColor: Colors.transparent,
textStyle: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 12,
color: AppColor.steelGrayA540,
),
verticalDirection: _verticalDirection(context),
onTapActionCallback: () {
if (canDeletePermanently) {
onPressEmailSelectionActionClick?.call(EmailActionType.deletePermanently, _listSelectionEmail);
} else {
onPressEmailSelectionActionClick?.call(EmailActionType.moveToTrash, _listSelectionEmail);
}
},
),
),
]
),
)
);
}
bool get canDeletePermanently {
return _currentMailbox?.isTrash == true || _currentMailbox?.isDrafts == true || _currentMailbox?.isSpam == true;
}
bool _verticalDirection(BuildContext context) {
return _responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context) ||
_responsiveUtils.isTabletLarge(context);
}
}