Add integration test for change language

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-07-04 14:17:01 +07:00
committed by Dat H. Pham
parent 672188baa2
commit 1b0b8e190c
9 changed files with 116 additions and 0 deletions
@@ -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<void> openLanguageContextMenu() async {
await $(#language_drop_down_button).tap();
}
Future<void> selectLanguage(
Locale locale,
AppLocalizations appLocalizations,
) async {
await $(find.text(
'${locale.getLanguageNameByCurrentLocale(appLocalizations)} - ${locale.getSourceLanguageName()}'))
.tap();
}
}
@@ -18,4 +18,8 @@ class MailboxMenuRobot extends CoreRobot {
.$(find.text(name)) .$(find.text(name))
.tap(); .tap();
} }
Future<void> openSetting() async {
await $(#user_avatar).tap();
}
} }
@@ -0,0 +1,11 @@
import 'package:flutter_test/flutter_test.dart';
import '../base/core_robot.dart';
class SettingRobot extends CoreRobot {
SettingRobot(super.$);
Future<void> openLanguageMenuItem() async {
await $(#setting_language_region).tap();
}
}
@@ -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<void> 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<void> _expectUserAvatarVisible() => expectViewVisible($(#user_avatar));
Future<void> _expectSettingViewVisible(AppLocalizations appLocalizations) =>
expectViewVisible($(find.text(appLocalizations.settings)));
Future<void> _expectLanguageMenuItemVisible() async {
await $(#setting_language_region).scrollTo(
scrollDirection: AxisDirection.down,
);
await expectViewVisible($(#setting_language_region));
}
Future<void> _expectLanguageViewWithEnglishTitleVisible() =>
expectViewVisible($(find.text('Language')));
Future<void> _expectLanguageContextMenuVisible() async {
await expectViewVisible($(#language_context_menu));
}
Future<void> _expectLanguageViewWithVietnameseTitleVisible() =>
expectViewVisible($(find.text('Ngôn ngữ')));
}
@@ -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($),
);
}
@@ -49,6 +49,7 @@ class MailboxAppBar extends StatelessWidget {
onTapAction: openAppGridAction!, onTapAction: openAppGridAction!,
), ),
UserAvatarBuilder( UserAvatarBuilder(
key: const Key('user_avatar'),
username: username.firstLetterToUpperCase, username: username.firstLetterToUpperCase,
padding: const EdgeInsetsDirectional.only(start: 4), padding: const EdgeInsetsDirectional.only(start: 4),
onTapAction: openSettingsAction, onTapAction: openSettingsAction,
@@ -88,6 +88,7 @@ class LanguageAndRegionController extends BaseController {
}).toList(); }).toList();
openBottomSheetContextMenuAction( openBottomSheetContextMenuAction(
key: const Key('language_context_menu'),
context: context, context: context,
itemActions: contextMenuActions, itemActions: contextMenuActions,
onContextMenuActionClick: (menuAction) { onContextMenuActionClick: (menuAction) {
@@ -132,6 +132,7 @@ class _ChangeLanguageButtonWidgetState extends State<ChangeLanguageButtonWidget>
Widget _buildMobileLanguageMenu(BuildContext context) { Widget _buildMobileLanguageMenu(BuildContext context) {
return Obx(() => TMailDropDownWidget( return Obx(() => TMailDropDownWidget(
key: const Key('language_drop_down_button'),
text: _languageAndRegionController text: _languageAndRegionController
.languageSelected .languageSelected
.value .value
@@ -17,6 +17,7 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SingleChildScrollView( return SingleChildScrollView(
key: const Key('setting_menu'),
child: Column(children: [ child: Column(children: [
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userName: controller.manageAccountDashboardController.accountId.value != null userName: controller.manageAccountDashboardController.accountId.value != null
@@ -141,6 +142,7 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils) endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
), ),
SettingFirstLevelTileBuilder( SettingFirstLevelTileBuilder(
key: const Key('setting_language_region'),
AccountMenuItem.languageAndRegion.getName(AppLocalizations.of(context)), AccountMenuItem.languageAndRegion.getName(AppLocalizations.of(context)),
AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths), AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths),
() => controller.selectSettings(AccountMenuItem.languageAndRegion) () => controller.selectSettings(AccountMenuItem.languageAndRegion)