diff --git a/integration_test/robots/language_robot.dart b/integration_test/robots/language_robot.dart new file mode 100644 index 000000000..84a5dd3ce --- /dev/null +++ b/integration_test/robots/language_robot.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/extensions/locale_extension.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +import '../base/core_robot.dart'; + +class LanguageRobot extends CoreRobot { + LanguageRobot(super.$); + + Future openLanguageContextMenu() async { + await $(#language_drop_down_button).tap(); + } + + Future selectLanguage( + Locale locale, + AppLocalizations appLocalizations, + ) async { + await $(find.text( + '${locale.getLanguageNameByCurrentLocale(appLocalizations)} - ${locale.getSourceLanguageName()}')) + .tap(); + } +} diff --git a/integration_test/robots/mailbox_menu_robot.dart b/integration_test/robots/mailbox_menu_robot.dart index c73ea2405..6b8393b76 100644 --- a/integration_test/robots/mailbox_menu_robot.dart +++ b/integration_test/robots/mailbox_menu_robot.dart @@ -18,4 +18,8 @@ class MailboxMenuRobot extends CoreRobot { .$(find.text(name)) .tap(); } + + Future openSetting() async { + await $(#user_avatar).tap(); + } } \ No newline at end of file diff --git a/integration_test/robots/setting_robot.dart b/integration_test/robots/setting_robot.dart new file mode 100644 index 000000000..7390865ff --- /dev/null +++ b/integration_test/robots/setting_robot.dart @@ -0,0 +1,11 @@ +import 'package:flutter_test/flutter_test.dart'; + +import '../base/core_robot.dart'; + +class SettingRobot extends CoreRobot { + SettingRobot(super.$); + + Future openLanguageMenuItem() async { + await $(#setting_language_region).tap(); + } +} \ No newline at end of file diff --git a/integration_test/scenarios/setting/language/change_language_scenario.dart b/integration_test/scenarios/setting/language/change_language_scenario.dart new file mode 100644 index 000000000..0296f8de2 --- /dev/null +++ b/integration_test/scenarios/setting/language/change_language_scenario.dart @@ -0,0 +1,64 @@ +import 'package:duration/duration.dart'; +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_test_scenario.dart'; +import '../../../robots/language_robot.dart'; +import '../../../robots/mailbox_menu_robot.dart'; +import '../../../robots/setting_robot.dart'; +import '../../../robots/thread_robot.dart'; + +class ChangeLanguageScenario extends BaseTestScenario { + const ChangeLanguageScenario(super.$); + + @override + Future runTestLogic() async { + final threadRobot = ThreadRobot($); + final mailboxMenuRobot = MailboxMenuRobot($); + final settingRobot = SettingRobot($); + final languageRobot = LanguageRobot($); + final appLocalizations = AppLocalizations(); + + await threadRobot.openMailbox(); + await _expectUserAvatarVisible(); + + await mailboxMenuRobot.openSetting(); + await _expectSettingViewVisible(appLocalizations); + await $.pumpAndSettle(duration: seconds(1)); + + await _expectLanguageMenuItemVisible(); + await settingRobot.openLanguageMenuItem(); + await $.pumpAndSettle(duration: seconds(1)); + await _expectLanguageViewWithEnglishTitleVisible(); + + await languageRobot.openLanguageContextMenu(); + await _expectLanguageContextMenuVisible(); + + await languageRobot.selectLanguage(const Locale('vi'), appLocalizations); + await $.pumpAndSettle(duration: seconds(3)); + await _expectLanguageViewWithVietnameseTitleVisible(); + } + + Future _expectUserAvatarVisible() => expectViewVisible($(#user_avatar)); + + Future _expectSettingViewVisible(AppLocalizations appLocalizations) => + expectViewVisible($(find.text(appLocalizations.settings))); + + Future _expectLanguageMenuItemVisible() async { + await $(#setting_language_region).scrollTo( + scrollDirection: AxisDirection.down, + ); + await expectViewVisible($(#setting_language_region)); + } + + Future _expectLanguageViewWithEnglishTitleVisible() => + expectViewVisible($(find.text('Language'))); + + Future _expectLanguageContextMenuVisible() async { + await expectViewVisible($(#language_context_menu)); + } + + Future _expectLanguageViewWithVietnameseTitleVisible() => + expectViewVisible($(find.text('Ngôn ngữ'))); +} diff --git a/integration_test/tests/setting/language/change_language_test.dart b/integration_test/tests/setting/language/change_language_test.dart new file mode 100644 index 000000000..ec8ed9350 --- /dev/null +++ b/integration_test/tests/setting/language/change_language_test.dart @@ -0,0 +1,9 @@ +import '../../../base/test_base.dart'; +import '../../../scenarios/setting/language/change_language_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should see title in Setting change language when successfully selecting another language', + scenarioBuilder: ($) => ChangeLanguageScenario($), + ); +} \ No newline at end of file diff --git a/lib/features/mailbox/presentation/widgets/mailbox_app_bar.dart b/lib/features/mailbox/presentation/widgets/mailbox_app_bar.dart index f902658b8..58b93d3cb 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_app_bar.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_app_bar.dart @@ -49,6 +49,7 @@ class MailboxAppBar extends StatelessWidget { onTapAction: openAppGridAction!, ), UserAvatarBuilder( + key: const Key('user_avatar'), username: username.firstLetterToUpperCase, padding: const EdgeInsetsDirectional.only(start: 4), onTapAction: openSettingsAction, diff --git a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart index cae7ebe6c..a98f8c905 100644 --- a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart +++ b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart @@ -88,6 +88,7 @@ class LanguageAndRegionController extends BaseController { }).toList(); openBottomSheetContextMenuAction( + key: const Key('language_context_menu'), context: context, itemActions: contextMenuActions, onContextMenuActionClick: (menuAction) { diff --git a/lib/features/manage_account/presentation/language_and_region/widgets/change_language_button_widget.dart b/lib/features/manage_account/presentation/language_and_region/widgets/change_language_button_widget.dart index a2784b12d..6a548ec04 100644 --- a/lib/features/manage_account/presentation/language_and_region/widgets/change_language_button_widget.dart +++ b/lib/features/manage_account/presentation/language_and_region/widgets/change_language_button_widget.dart @@ -132,6 +132,7 @@ class _ChangeLanguageButtonWidgetState extends State Widget _buildMobileLanguageMenu(BuildContext context) { return Obx(() => TMailDropDownWidget( + key: const Key('language_drop_down_button'), text: _languageAndRegionController .languageSelected .value diff --git a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart index a5672eefe..f34bc546d 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart @@ -17,6 +17,7 @@ class SettingsFirstLevelView extends GetWidget { @override Widget build(BuildContext context) { return SingleChildScrollView( + key: const Key('setting_menu'), child: Column(children: [ Obx(() => UserInformationWidget( userName: controller.manageAccountDashboardController.accountId.value != null @@ -141,6 +142,7 @@ class SettingsFirstLevelView extends GetWidget { endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils) ), SettingFirstLevelTileBuilder( + key: const Key('setting_language_region'), AccountMenuItem.languageAndRegion.getName(AppLocalizations.of(context)), AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths), () => controller.selectSettings(AccountMenuItem.languageAndRegion)