From 9e9e6665184ba93ab595ca58dd0cf7f13bcbceca Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 10 Mar 2026 14:09:15 +0700 Subject: [PATCH] TF-4367 Add E2E test for test case forward email is forwarded when change language on mobile --- .../mixin/generate_email_scenario_mixin.dart | 29 +++++ .../mixin/screen_scenario_mixin.dart | 19 +++ .../mixin/setting_scenario_mixin.dart | 45 +++++++ ...rwarded_when_change_language_scenario.dart | 119 ++++++++++++++++++ ...d_email_when_change_language_scenario.dart | 76 ++--------- ...replied_when_change_language_scenario.dart | 76 ++--------- ...y_email_when_change_language_scenario.dart | 76 ++--------- ...l_forwarded_when_change_language_test.dart | 10 ++ 8 files changed, 249 insertions(+), 201 deletions(-) create mode 100644 integration_test/mixin/generate_email_scenario_mixin.dart create mode 100644 integration_test/mixin/screen_scenario_mixin.dart create mode 100644 integration_test/mixin/setting_scenario_mixin.dart create mode 100644 integration_test/scenarios/email_detailed/forward_email_forwarded_when_change_language_scenario.dart create mode 100644 integration_test/tests/email_detailed/forward_email_forwarded_when_change_language_test.dart diff --git a/integration_test/mixin/generate_email_scenario_mixin.dart b/integration_test/mixin/generate_email_scenario_mixin.dart new file mode 100644 index 000000000..c07a206ac --- /dev/null +++ b/integration_test/mixin/generate_email_scenario_mixin.dart @@ -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 generateEmailWithSubject({ + required String emailUser, + required String subject, + }) async { + await provisionEmail( + [ + ProvisioningEmail( + toEmail: emailUser, + subject: subject, + content: subject, + ), + ], + requestReadReceipt: false, + ); + await $.pumpAndTrySettle(); + } + + Future closeEmailDetailedView({required EmailRobot emailRobot}) async { + await emailRobot.onTapBackButton(); + } +} diff --git a/integration_test/mixin/screen_scenario_mixin.dart b/integration_test/mixin/screen_scenario_mixin.dart new file mode 100644 index 000000000..1196fbe00 --- /dev/null +++ b/integration_test/mixin/screen_scenario_mixin.dart @@ -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 closeEmailDetailedView({required EmailRobot emailRobot}) async { + await emailRobot.onTapBackButton(); + } + + Future closeComposer({ + required ComposerRobot composerRobot, + required ImagePaths imagePaths, + }) async { + await composerRobot.tapCloseComposer(imagePaths); + await composerRobot.tapDiscardChanges(); + } +} diff --git a/integration_test/mixin/setting_scenario_mixin.dart b/integration_test/mixin/setting_scenario_mixin.dart new file mode 100644 index 000000000..29dc03e7f --- /dev/null +++ b/integration_test/mixin/setting_scenario_mixin.dart @@ -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 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 _expectLanguageMenuItemVisible() async { + await $(#setting_language_region).scrollTo( + scrollDirection: AxisDirection.down, + ); + await expectViewVisible($(#setting_language_region)); + } + + Future _expectLanguageViewByLocaleTitleVisible( + AppLocalizations appLocalizations, + ) async { + await expectViewVisible($(find.text(appLocalizations.language))); + } +} diff --git a/integration_test/scenarios/email_detailed/forward_email_forwarded_when_change_language_scenario.dart b/integration_test/scenarios/email_detailed/forward_email_forwarded_when_change_language_scenario.dart new file mode 100644 index 000000000..b8fc25658 --- /dev/null +++ b/integration_test/scenarios/email_detailed/forward_email_forwarded_when_change_language_scenario.dart @@ -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 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 _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 _expectEmailViewVisible() async { + await expectViewVisible($(EmailView)); + } + + Future _expectForwardEmailButtonVisible() async { + await expectViewVisible($(#forward_email_button)); + } + + Future _expectComposerViewVisible() async { + await expectViewVisible($(ComposerView)); + } + + Future _expectComposerSubjectIsNotChanged({ + required AppLocalizations appLocalizations, + required String subject, + }) async { + expect( + $(SubjectComposerWidget) + .which( + (widget) => widget.textController.text == subject) + .visible, + isTrue, + ); + } +} diff --git a/integration_test/scenarios/email_detailed/forward_email_when_change_language_scenario.dart b/integration_test/scenarios/email_detailed/forward_email_when_change_language_scenario.dart index b30e32790..869278e99 100644 --- a/integration_test/scenarios/email_detailed/forward_email_when_change_language_scenario.dart +++ b/integration_test/scenarios/email_detailed/forward_email_when_change_language_scenario.dart @@ -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 _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 _generateEmail(String emailUser, String subject) async { - await provisionEmail( - [ - ProvisioningEmail( - toEmail: emailUser, - subject: subject, - content: subject, - ), - ], - requestReadReceipt: false, - ); - await $.pumpAndTrySettle(); - } - Future _forwardEmailBySubject({ required ThreadRobot threadRobot, required EmailRobot emailRobot, @@ -124,31 +91,6 @@ class ForwardEmailWhenChangeLanguageScenario extends BaseTestScenario { ); } - Future _closeComposer({ - required ComposerRobot composerRobot, - required ImagePaths imagePaths, - }) async { - await composerRobot.tapCloseComposer(imagePaths); - await composerRobot.tapDiscardChanges(); - } - - Future _closeEmailDetailedView({required EmailRobot emailRobot}) async { - await emailRobot.onTapBackButton(); - } - - Future _expectLanguageMenuItemVisible() async { - await $(#setting_language_region).scrollTo( - scrollDirection: AxisDirection.down, - ); - await expectViewVisible($(#setting_language_region)); - } - - Future _expectLanguageViewByLocaleTitleVisible( - AppLocalizations appLocalizations, - ) async { - await expectViewVisible($(find.text(appLocalizations.language))); - } - Future _expectEmailViewVisible() async { await expectViewVisible($(EmailView)); } diff --git a/integration_test/scenarios/email_detailed/reply_email_replied_when_change_language_scenario.dart b/integration_test/scenarios/email_detailed/reply_email_replied_when_change_language_scenario.dart index 61544469a..85590a0fb 100644 --- a/integration_test/scenarios/email_detailed/reply_email_replied_when_change_language_scenario.dart +++ b/integration_test/scenarios/email_detailed/reply_email_replied_when_change_language_scenario.dart @@ -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 _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 _generateEmail(String emailUser, String subject) async { - await provisionEmail( - [ - ProvisioningEmail( - toEmail: emailUser, - subject: subject, - content: subject, - ), - ], - requestReadReceipt: false, - ); - await $.pumpAndTrySettle(); - } - Future _replyEmailBySubject({ required ThreadRobot threadRobot, required EmailRobot emailRobot, @@ -125,31 +92,6 @@ class ReplyEmailRepliedWhenChangeLanguageScenario extends BaseTestScenario { ); } - Future _closeComposer({ - required ComposerRobot composerRobot, - required ImagePaths imagePaths, - }) async { - await composerRobot.tapCloseComposer(imagePaths); - await composerRobot.tapDiscardChanges(); - } - - Future _closeEmailDetailedView({required EmailRobot emailRobot}) async { - await emailRobot.onTapBackButton(); - } - - Future _expectLanguageMenuItemVisible() async { - await $(#setting_language_region).scrollTo( - scrollDirection: AxisDirection.down, - ); - await expectViewVisible($(#setting_language_region)); - } - - Future _expectLanguageViewByLocaleTitleVisible( - AppLocalizations appLocalizations, - ) async { - await expectViewVisible($(find.text(appLocalizations.language))); - } - Future _expectEmailViewVisible() async { await expectViewVisible($(EmailView)); } diff --git a/integration_test/scenarios/email_detailed/reply_email_when_change_language_scenario.dart b/integration_test/scenarios/email_detailed/reply_email_when_change_language_scenario.dart index 5dfcc96df..1bb67ba01 100644 --- a/integration_test/scenarios/email_detailed/reply_email_when_change_language_scenario.dart +++ b/integration_test/scenarios/email_detailed/reply_email_when_change_language_scenario.dart @@ -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 _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 _generateEmail(String emailUser, String subject) async { - await provisionEmail( - [ - ProvisioningEmail( - toEmail: emailUser, - subject: subject, - content: subject, - ), - ], - requestReadReceipt: false, - ); - await $.pumpAndTrySettle(); - } - Future _replyEmailBySubject({ required ThreadRobot threadRobot, required EmailRobot emailRobot, @@ -124,31 +91,6 @@ class ReplyEmailWhenChangeLanguageScenario extends BaseTestScenario { ); } - Future _closeComposer({ - required ComposerRobot composerRobot, - required ImagePaths imagePaths, - }) async { - await composerRobot.tapCloseComposer(imagePaths); - await composerRobot.tapDiscardChanges(); - } - - Future _closeEmailDetailedView({required EmailRobot emailRobot}) async { - await emailRobot.onTapBackButton(); - } - - Future _expectLanguageMenuItemVisible() async { - await $(#setting_language_region).scrollTo( - scrollDirection: AxisDirection.down, - ); - await expectViewVisible($(#setting_language_region)); - } - - Future _expectLanguageViewByLocaleTitleVisible( - AppLocalizations appLocalizations, - ) async { - await expectViewVisible($(find.text(appLocalizations.language))); - } - Future _expectEmailViewVisible() async { await expectViewVisible($(EmailView)); } diff --git a/integration_test/tests/email_detailed/forward_email_forwarded_when_change_language_test.dart b/integration_test/tests/email_detailed/forward_email_forwarded_when_change_language_test.dart new file mode 100644 index 000000000..0dedfa23e --- /dev/null +++ b/integration_test/tests/email_detailed/forward_email_forwarded_when_change_language_test.dart @@ -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($), + ); +}