TF-4367 Add E2E test for test case forward email is forwarded when change language on mobile

This commit is contained in:
dab246
2026-03-10 14:09:15 +07:00
committed by Dat H. Pham
parent 12b9ad4a40
commit 9e9e666518
8 changed files with 249 additions and 201 deletions
@@ -0,0 +1,29 @@
import 'package:flutter_test/flutter_test.dart';
import '../base/base_scenario.dart';
import '../models/provisioning_email.dart';
import '../robots/email_robot.dart';
import 'scenario_utils_mixin.dart';
mixin GenerateEmailScenarioMixin on BaseScenario, ScenarioUtilsMixin {
Future<void> generateEmailWithSubject({
required String emailUser,
required String subject,
}) async {
await provisionEmail(
[
ProvisioningEmail(
toEmail: emailUser,
subject: subject,
content: subject,
),
],
requestReadReceipt: false,
);
await $.pumpAndTrySettle();
}
Future<void> closeEmailDetailedView({required EmailRobot emailRobot}) async {
await emailRobot.onTapBackButton();
}
}
@@ -0,0 +1,19 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter_test/flutter_test.dart';
import '../robots/composer_robot.dart';
import '../robots/email_robot.dart';
mixin ScreenScenarioMixin {
Future<void> closeEmailDetailedView({required EmailRobot emailRobot}) async {
await emailRobot.onTapBackButton();
}
Future<void> closeComposer({
required ComposerRobot composerRobot,
required ImagePaths imagePaths,
}) async {
await composerRobot.tapCloseComposer(imagePaths);
await composerRobot.tapDiscardChanges();
}
}
@@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import '../base/base_scenario.dart';
import '../robots/language_robot.dart';
import '../robots/mailbox_menu_robot.dart';
import '../robots/setting_robot.dart';
import '../robots/thread_robot.dart';
mixin SettingScenarioMixin on BaseScenario {
Future<void> goToSettingToChangeLanguage({
required ThreadRobot threadRobot,
required SettingRobot settingRobot,
required MailboxMenuRobot mailboxMenuRobot,
required LanguageRobot languageRobot,
required AppLocalizations appLocalizations,
required Locale locale,
}) async {
await threadRobot.openMailbox();
await mailboxMenuRobot.openSetting();
await _expectLanguageMenuItemVisible();
await settingRobot.openLanguageMenuItem();
await languageRobot.openLanguageContextMenu();
await languageRobot.selectLanguage(locale, appLocalizations);
await _expectLanguageViewByLocaleTitleVisible(appLocalizations);
await settingRobot.backToSettingsFromFirstLevel();
await settingRobot.closeSettings();
}
Future<void> _expectLanguageMenuItemVisible() async {
await $(#setting_language_region).scrollTo(
scrollDirection: AxisDirection.down,
);
await expectViewVisible($(#setting_language_region));
}
Future<void> _expectLanguageViewByLocaleTitleVisible(
AppLocalizations appLocalizations,
) async {
await expectViewVisible($(find.text(appLocalizations.language)));
}
}
@@ -0,0 +1,119 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/email_view.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/localizations/localization_service.dart';
import '../../base/base_test_scenario.dart';
import '../../mixin/generate_email_scenario_mixin.dart';
import '../../mixin/screen_scenario_mixin.dart';
import '../../mixin/setting_scenario_mixin.dart';
import '../../robots/composer_robot.dart';
import '../../robots/email_robot.dart';
import '../../robots/language_robot.dart';
import '../../robots/mailbox_menu_robot.dart';
import '../../robots/setting_robot.dart';
import '../../robots/thread_robot.dart';
class ForwardEmailForwardedWhenChangeLanguageScenario extends BaseTestScenario
with SettingScenarioMixin, GenerateEmailScenarioMixin, ScreenScenarioMixin {
const ForwardEmailForwardedWhenChangeLanguageScenario(super.$);
@override
Future<void> runTestLogic() async {
const emailUser = String.fromEnvironment('BASIC_AUTH_EMAIL');
final threadRobot = ThreadRobot($);
final emailRobot = EmailRobot($);
final composerRobot = ComposerRobot($);
final settingRobot = SettingRobot($);
final languageRobot = LanguageRobot($);
final mailboxMenuRobot = MailboxMenuRobot($);
final imagePaths = ImagePaths();
for (var locale in LocalizationService.supportedLocales) {
final appLocalizations = await AppLocalizations.load(locale);
String subject =
'${appLocalizations.prefix_forward_email} Email by locale ${locale.languageCode}';
await goToSettingToChangeLanguage(
threadRobot: threadRobot,
settingRobot: settingRobot,
mailboxMenuRobot: mailboxMenuRobot,
languageRobot: languageRobot,
appLocalizations: appLocalizations,
locale: locale,
);
await generateEmailWithSubject(emailUser: emailUser, subject: subject);
await _forwardEmailBySubject(
threadRobot: threadRobot,
emailRobot: emailRobot,
composerRobot: composerRobot,
subject: subject,
appLocalizations: appLocalizations,
);
await closeComposer(
composerRobot: composerRobot,
imagePaths: imagePaths,
);
await closeEmailDetailedView(emailRobot: emailRobot);
await $.pumpAndTrySettle();
}
}
Future<void> _forwardEmailBySubject({
required ThreadRobot threadRobot,
required EmailRobot emailRobot,
required ComposerRobot composerRobot,
required String subject,
required AppLocalizations appLocalizations,
}) async {
await threadRobot.openEmailWithSubject(subject);
await _expectEmailViewVisible();
await _expectForwardEmailButtonVisible();
await emailRobot.onTapForwardEmail();
await _expectComposerViewVisible();
await composerRobot.grantContactPermission();
await $.pumpAndTrySettle();
await _expectComposerSubjectIsNotChanged(
appLocalizations: appLocalizations,
subject: subject,
);
}
Future<void> _expectEmailViewVisible() async {
await expectViewVisible($(EmailView));
}
Future<void> _expectForwardEmailButtonVisible() async {
await expectViewVisible($(#forward_email_button));
}
Future<void> _expectComposerViewVisible() async {
await expectViewVisible($(ComposerView));
}
Future<void> _expectComposerSubjectIsNotChanged({
required AppLocalizations appLocalizations,
required String subject,
}) async {
expect(
$(SubjectComposerWidget)
.which<SubjectComposerWidget>(
(widget) => widget.textController.text == subject)
.visible,
isTrue,
);
}
}
@@ -1,5 +1,4 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart';
@@ -8,7 +7,9 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/localizations/localization_service.dart';
import '../../base/base_test_scenario.dart';
import '../../models/provisioning_email.dart';
import '../../mixin/generate_email_scenario_mixin.dart';
import '../../mixin/screen_scenario_mixin.dart';
import '../../mixin/setting_scenario_mixin.dart';
import '../../robots/composer_robot.dart';
import '../../robots/email_robot.dart';
import '../../robots/language_robot.dart';
@@ -16,7 +17,8 @@ import '../../robots/mailbox_menu_robot.dart';
import '../../robots/setting_robot.dart';
import '../../robots/thread_robot.dart';
class ForwardEmailWhenChangeLanguageScenario extends BaseTestScenario {
class ForwardEmailWhenChangeLanguageScenario extends BaseTestScenario
with SettingScenarioMixin, GenerateEmailScenarioMixin, ScreenScenarioMixin {
const ForwardEmailWhenChangeLanguageScenario(super.$);
@override
@@ -36,7 +38,7 @@ class ForwardEmailWhenChangeLanguageScenario extends BaseTestScenario {
final appLocalizations = await AppLocalizations.load(locale);
await _goToSettingToChangeLanguage(
await goToSettingToChangeLanguage(
threadRobot: threadRobot,
settingRobot: settingRobot,
mailboxMenuRobot: mailboxMenuRobot,
@@ -45,7 +47,7 @@ class ForwardEmailWhenChangeLanguageScenario extends BaseTestScenario {
locale: locale,
);
await _generateEmail(emailUser, subject);
await generateEmailWithSubject(emailUser: emailUser, subject: subject);
await _forwardEmailBySubject(
threadRobot: threadRobot,
@@ -55,52 +57,17 @@ class ForwardEmailWhenChangeLanguageScenario extends BaseTestScenario {
appLocalizations: appLocalizations,
);
await _closeComposer(
await closeComposer(
composerRobot: composerRobot,
imagePaths: imagePaths,
);
await _closeEmailDetailedView(emailRobot: emailRobot);
await closeEmailDetailedView(emailRobot: emailRobot);
await $.pumpAndTrySettle();
}
}
Future<void> _goToSettingToChangeLanguage({
required ThreadRobot threadRobot,
required SettingRobot settingRobot,
required MailboxMenuRobot mailboxMenuRobot,
required LanguageRobot languageRobot,
required AppLocalizations appLocalizations,
required Locale locale,
}) async {
await threadRobot.openMailbox();
await mailboxMenuRobot.openSetting();
await _expectLanguageMenuItemVisible();
await settingRobot.openLanguageMenuItem();
await languageRobot.openLanguageContextMenu();
await languageRobot.selectLanguage(locale, appLocalizations);
await _expectLanguageViewByLocaleTitleVisible(appLocalizations);
await settingRobot.backToSettingsFromFirstLevel();
await settingRobot.closeSettings();
}
Future<void> _generateEmail(String emailUser, String subject) async {
await provisionEmail(
[
ProvisioningEmail(
toEmail: emailUser,
subject: subject,
content: subject,
),
],
requestReadReceipt: false,
);
await $.pumpAndTrySettle();
}
Future<void> _forwardEmailBySubject({
required ThreadRobot threadRobot,
required EmailRobot emailRobot,
@@ -124,31 +91,6 @@ class ForwardEmailWhenChangeLanguageScenario extends BaseTestScenario {
);
}
Future<void> _closeComposer({
required ComposerRobot composerRobot,
required ImagePaths imagePaths,
}) async {
await composerRobot.tapCloseComposer(imagePaths);
await composerRobot.tapDiscardChanges();
}
Future<void> _closeEmailDetailedView({required EmailRobot emailRobot}) async {
await emailRobot.onTapBackButton();
}
Future<void> _expectLanguageMenuItemVisible() async {
await $(#setting_language_region).scrollTo(
scrollDirection: AxisDirection.down,
);
await expectViewVisible($(#setting_language_region));
}
Future<void> _expectLanguageViewByLocaleTitleVisible(
AppLocalizations appLocalizations,
) async {
await expectViewVisible($(find.text(appLocalizations.language)));
}
Future<void> _expectEmailViewVisible() async {
await expectViewVisible($(EmailView));
}
@@ -1,5 +1,4 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart';
@@ -8,7 +7,9 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/localizations/localization_service.dart';
import '../../base/base_test_scenario.dart';
import '../../models/provisioning_email.dart';
import '../../mixin/generate_email_scenario_mixin.dart';
import '../../mixin/screen_scenario_mixin.dart';
import '../../mixin/setting_scenario_mixin.dart';
import '../../robots/composer_robot.dart';
import '../../robots/email_robot.dart';
import '../../robots/language_robot.dart';
@@ -16,7 +17,8 @@ import '../../robots/mailbox_menu_robot.dart';
import '../../robots/setting_robot.dart';
import '../../robots/thread_robot.dart';
class ReplyEmailRepliedWhenChangeLanguageScenario extends BaseTestScenario {
class ReplyEmailRepliedWhenChangeLanguageScenario extends BaseTestScenario
with SettingScenarioMixin, GenerateEmailScenarioMixin, ScreenScenarioMixin {
const ReplyEmailRepliedWhenChangeLanguageScenario(super.$);
@override
@@ -37,7 +39,7 @@ class ReplyEmailRepliedWhenChangeLanguageScenario extends BaseTestScenario {
String subject =
'${appLocalizations.prefix_reply_email} Email by locale ${locale.languageCode}';
await _goToSettingToChangeLanguage(
await goToSettingToChangeLanguage(
threadRobot: threadRobot,
settingRobot: settingRobot,
mailboxMenuRobot: mailboxMenuRobot,
@@ -46,7 +48,7 @@ class ReplyEmailRepliedWhenChangeLanguageScenario extends BaseTestScenario {
locale: locale,
);
await _generateEmail(emailUser, subject);
await generateEmailWithSubject(emailUser: emailUser, subject: subject);
await _replyEmailBySubject(
threadRobot: threadRobot,
@@ -56,52 +58,17 @@ class ReplyEmailRepliedWhenChangeLanguageScenario extends BaseTestScenario {
appLocalizations: appLocalizations,
);
await _closeComposer(
await closeComposer(
composerRobot: composerRobot,
imagePaths: imagePaths,
);
await _closeEmailDetailedView(emailRobot: emailRobot);
await closeEmailDetailedView(emailRobot: emailRobot);
await $.pumpAndTrySettle();
}
}
Future<void> _goToSettingToChangeLanguage({
required ThreadRobot threadRobot,
required SettingRobot settingRobot,
required MailboxMenuRobot mailboxMenuRobot,
required LanguageRobot languageRobot,
required AppLocalizations appLocalizations,
required Locale locale,
}) async {
await threadRobot.openMailbox();
await mailboxMenuRobot.openSetting();
await _expectLanguageMenuItemVisible();
await settingRobot.openLanguageMenuItem();
await languageRobot.openLanguageContextMenu();
await languageRobot.selectLanguage(locale, appLocalizations);
await _expectLanguageViewByLocaleTitleVisible(appLocalizations);
await settingRobot.backToSettingsFromFirstLevel();
await settingRobot.closeSettings();
}
Future<void> _generateEmail(String emailUser, String subject) async {
await provisionEmail(
[
ProvisioningEmail(
toEmail: emailUser,
subject: subject,
content: subject,
),
],
requestReadReceipt: false,
);
await $.pumpAndTrySettle();
}
Future<void> _replyEmailBySubject({
required ThreadRobot threadRobot,
required EmailRobot emailRobot,
@@ -125,31 +92,6 @@ class ReplyEmailRepliedWhenChangeLanguageScenario extends BaseTestScenario {
);
}
Future<void> _closeComposer({
required ComposerRobot composerRobot,
required ImagePaths imagePaths,
}) async {
await composerRobot.tapCloseComposer(imagePaths);
await composerRobot.tapDiscardChanges();
}
Future<void> _closeEmailDetailedView({required EmailRobot emailRobot}) async {
await emailRobot.onTapBackButton();
}
Future<void> _expectLanguageMenuItemVisible() async {
await $(#setting_language_region).scrollTo(
scrollDirection: AxisDirection.down,
);
await expectViewVisible($(#setting_language_region));
}
Future<void> _expectLanguageViewByLocaleTitleVisible(
AppLocalizations appLocalizations,
) async {
await expectViewVisible($(find.text(appLocalizations.language)));
}
Future<void> _expectEmailViewVisible() async {
await expectViewVisible($(EmailView));
}
@@ -1,5 +1,4 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart';
@@ -8,7 +7,9 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/localizations/localization_service.dart';
import '../../base/base_test_scenario.dart';
import '../../models/provisioning_email.dart';
import '../../mixin/generate_email_scenario_mixin.dart';
import '../../mixin/screen_scenario_mixin.dart';
import '../../mixin/setting_scenario_mixin.dart';
import '../../robots/composer_robot.dart';
import '../../robots/email_robot.dart';
import '../../robots/language_robot.dart';
@@ -16,7 +17,8 @@ import '../../robots/mailbox_menu_robot.dart';
import '../../robots/setting_robot.dart';
import '../../robots/thread_robot.dart';
class ReplyEmailWhenChangeLanguageScenario extends BaseTestScenario {
class ReplyEmailWhenChangeLanguageScenario extends BaseTestScenario
with SettingScenarioMixin, GenerateEmailScenarioMixin, ScreenScenarioMixin {
const ReplyEmailWhenChangeLanguageScenario(super.$);
@override
@@ -36,7 +38,7 @@ class ReplyEmailWhenChangeLanguageScenario extends BaseTestScenario {
final appLocalizations = await AppLocalizations.load(locale);
await _goToSettingToChangeLanguage(
await goToSettingToChangeLanguage(
threadRobot: threadRobot,
settingRobot: settingRobot,
mailboxMenuRobot: mailboxMenuRobot,
@@ -45,7 +47,7 @@ class ReplyEmailWhenChangeLanguageScenario extends BaseTestScenario {
locale: locale,
);
await _generateEmail(emailUser, subject);
await generateEmailWithSubject(emailUser: emailUser, subject: subject);
await _replyEmailBySubject(
threadRobot: threadRobot,
@@ -55,52 +57,17 @@ class ReplyEmailWhenChangeLanguageScenario extends BaseTestScenario {
appLocalizations: appLocalizations,
);
await _closeComposer(
await closeComposer(
composerRobot: composerRobot,
imagePaths: imagePaths,
);
await _closeEmailDetailedView(emailRobot: emailRobot);
await closeEmailDetailedView(emailRobot: emailRobot);
await $.pumpAndTrySettle();
}
}
Future<void> _goToSettingToChangeLanguage({
required ThreadRobot threadRobot,
required SettingRobot settingRobot,
required MailboxMenuRobot mailboxMenuRobot,
required LanguageRobot languageRobot,
required AppLocalizations appLocalizations,
required Locale locale,
}) async {
await threadRobot.openMailbox();
await mailboxMenuRobot.openSetting();
await _expectLanguageMenuItemVisible();
await settingRobot.openLanguageMenuItem();
await languageRobot.openLanguageContextMenu();
await languageRobot.selectLanguage(locale, appLocalizations);
await _expectLanguageViewByLocaleTitleVisible(appLocalizations);
await settingRobot.backToSettingsFromFirstLevel();
await settingRobot.closeSettings();
}
Future<void> _generateEmail(String emailUser, String subject) async {
await provisionEmail(
[
ProvisioningEmail(
toEmail: emailUser,
subject: subject,
content: subject,
),
],
requestReadReceipt: false,
);
await $.pumpAndTrySettle();
}
Future<void> _replyEmailBySubject({
required ThreadRobot threadRobot,
required EmailRobot emailRobot,
@@ -124,31 +91,6 @@ class ReplyEmailWhenChangeLanguageScenario extends BaseTestScenario {
);
}
Future<void> _closeComposer({
required ComposerRobot composerRobot,
required ImagePaths imagePaths,
}) async {
await composerRobot.tapCloseComposer(imagePaths);
await composerRobot.tapDiscardChanges();
}
Future<void> _closeEmailDetailedView({required EmailRobot emailRobot}) async {
await emailRobot.onTapBackButton();
}
Future<void> _expectLanguageMenuItemVisible() async {
await $(#setting_language_region).scrollTo(
scrollDirection: AxisDirection.down,
);
await expectViewVisible($(#setting_language_region));
}
Future<void> _expectLanguageViewByLocaleTitleVisible(
AppLocalizations appLocalizations,
) async {
await expectViewVisible($(find.text(appLocalizations.language)));
}
Future<void> _expectEmailViewVisible() async {
await expectViewVisible($(EmailView));
}
@@ -0,0 +1,10 @@
import '../../base/test_base.dart';
import '../../scenarios/email_detailed/forward_email_forwarded_when_change_language_scenario.dart';
void main() {
TestBase().runPatrolTest(
description:
'The subject line of an email should not be changed when forwarding to an email that has already been forwarded to.',
scenarioBuilder: ($) => ForwardEmailForwardedWhenChangeLanguageScenario($),
);
}