HOTFIX Fix integration tests

This commit is contained in:
DatDang
2025-07-01 15:55:40 +07:00
committed by Dat H. Pham
parent 966a3acd39
commit 8e500a2ac5
12 changed files with 23 additions and 225 deletions
+1 -4
View File
@@ -4,7 +4,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:model/email/prefix_email_address.dart';
import 'package:rich_text_composer/rich_text_composer.dart';
import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/composer/presentation/view/mobile/mobile_editor_view.dart';
@@ -118,8 +117,6 @@ class ComposerRobot extends CoreRobot {
.$(TMailButtonWidget)
.which<TMailButtonWidget>((widget) => widget.icon == ImagePaths().icMore)
.tap();
await $(PopupItemWidget)
.$(AppLocalizations().saveAsTemplate)
.tap();
await $(AppLocalizations().saveAsTemplate).tap();
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ class LoginRobot extends CoreRobot {
LoginRobot(super.$);
Future<void> grantNotificationPermission(NativeAutomator nativeAutomator) async {
if (await nativeAutomator.isPermissionDialogVisible(timeout: const Duration(seconds: 5))) {
if (await nativeAutomator.isPermissionDialogVisible(timeout: const Duration(seconds: 1))) {
await nativeAutomator.grantPermissionWhenInUse();
}
}
+1 -1
View File
@@ -35,7 +35,7 @@ class ThreadRobot extends CoreRobot {
await $(#mobile_mailbox_menu_button).tap();
}
Future<void> tapEmptyTrashBanner() => $(#empty_trash_banner).tap();
Future<void> tapEmptyTrashBanner() => $(' ${AppLocalizations().empty_trash_now}').tap();
Future<void> tapDeleteAllButtonOnEmptyTrashConfirmDialog(
AppLocalizations appLocalizations,
@@ -2,8 +2,8 @@
import 'package:core/utils/platform_info.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid_view.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid/app_grid_icon.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid/app_shortcut.dart';
import '../base/base_test_scenario.dart';
import '../robots/app_grid_robot.dart';
@@ -34,7 +34,8 @@ class AppGridScenario extends BaseTestScenario {
await Future.delayed(const Duration(seconds: 2));
if (PlatformInfo.isAndroid) {
await $.native.pressBack();
await $.native.pressHome();
await $.native.openApp();
await appGridRobot.openAppInAppGridByAppName('Twake Sync');
await Future.delayed(const Duration(seconds: 2));
@@ -44,6 +45,7 @@ class AppGridScenario extends BaseTestScenario {
await appGridRobot.openAppInAppGridByAppName('Twake Chat');
await Future.delayed(const Duration(seconds: 2));
await $.native.pressBack();
await $.native.pressBack();
await _expectMailboxViewVisible();
@@ -54,18 +56,18 @@ class AppGridScenario extends BaseTestScenario {
Future<void> _expectMailboxViewVisible() => expectViewVisible($(MailboxView));
Future<void> _expectAppGridViewVisible() => expectViewVisible($(AppGridView));
Future<void> _expectAppGridViewVisible() => expectViewVisible($(AppGridIcon));
Future<void> _expectListViewAppGridVisible() => expectViewVisible($(#list_view_app_grid));
Future<void> _expectAllAppInAppGridDisplayedIsFull() async {
int totalApp = PlatformInfo.isIOS ? 2 : 3;
expect(find.byType(AppListDashboardItem), findsNWidgets(totalApp));
expect(find.byType(AppShortcut), findsNWidgets(totalApp));
final listAppItem = $.tester
.widgetList<AppListDashboardItem>(find.byType(AppListDashboardItem));
.widgetList<AppShortcut>(find.byType(AppShortcut));
final listAppNames = listAppItem.map((item) => item.app.appName).toList();
final listAppNames = listAppItem.map((item) => item.label).toList();
if (PlatformInfo.isIOS) {
expect(listAppNames, equals(['Twake Drive', 'Twake Chat']));
@@ -1,3 +1,4 @@
import 'package:flutter/widgets.dart';
import 'package:tmail_ui_user/features/email/presentation/email_view.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_banner_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_button_widget.dart';
@@ -52,7 +53,7 @@ class CalendarEventCounterScenario extends BaseTestScenario {
) async {
final yesButton = $(CalendarEventActionButtonWidget)
.$(appLocalizations.yes);
await yesButton.scrollTo();
await yesButton.scrollTo(scrollDirection: AxisDirection.down);
await expectViewVisible(yesButton);
}
@@ -87,7 +88,7 @@ class CalendarEventCounterScenario extends BaseTestScenario {
final proposedEventChangesText = $(CalendarEventActionBannerWidget)
.$(appLocalizations.anAttendee
+ appLocalizations.messageEventActionBannerAttendeeCounter);
await proposedEventChangesText.scrollTo();
await proposedEventChangesText.scrollTo(scrollDirection: AxisDirection.down);
await expectViewVisible(proposedEventChangesText);
}
}
@@ -21,7 +21,7 @@ class WebSocketUpdateUiScenario extends BaseTestScenario {
refreshEmailView: false,
);
await $.pumpAndSettle();
await _expectEmailVisible(email);
await _expectEmailVisible(subject);
await _expectEmailUnreadWithSubject(subject);
await _expectEmailUnstarredWithSubject(subject);
@@ -40,7 +40,9 @@ class WebSocketUpdateUiScenario extends BaseTestScenario {
await _expectEmailStarredWithSubject(subject);
}
Future<void> _expectEmailVisible(String email) => expectViewVisible($(email));
Future<void> _expectEmailVisible(String subject) async {
await expectViewVisible($(subject));
}
Future<void> _expectEmailUnreadWithSubject(String subject) => expectViewVisible(
$(EmailTileBuilder)
@@ -41,6 +41,7 @@ extension OpenAppGridExtension on MailboxController {
color: Colors.white,
),
child: GridView(
key: const ValueKey('list_view_app_grid'),
gridDelegate: const SliverGridDelegateFixedHeight(
height: 80.58,
crossAxisCount: 3,
@@ -1,133 +0,0 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/utils/direction_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class AppGridView extends StatefulWidget {
final List<AppLinagoraEcosystem> linagoraApps;
const AppGridView({super.key, required this.linagoraApps});
@override
State<AppGridView> createState() => _AppGridViewState();
}
class _AppGridViewState extends State<AppGridView> {
final ValueNotifier<bool> _isCollapsedNotifier = ValueNotifier<bool>(true);
final _imagePaths = Get.find<ImagePaths>();
@override
void dispose() {
_isCollapsedNotifier.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(children: [
Padding(
padding: const EdgeInsetsDirectional.only(
start: 26,
end: 4,
top: 4,
bottom: 4,
),
child: Row(
children: [
SvgPicture.asset(
_imagePaths.icAppDashboard,
colorFilter: AppColor.primaryColor.asFilter(),
width: 20,
height: 20,
fit: BoxFit.fill,
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(
AppLocalizations.of(context).appGridTittle,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontSize: 16,
color: AppColor.colorTextButton,
fontWeight: FontWeight.w500,
),
),
)
),
ValueListenableBuilder(
valueListenable: _isCollapsedNotifier,
builder: (context, isCollapsed, child) {
return TMailButtonWidget.fromIcon(
key: const Key('toggle_app_grid_button'),
icon: _getCollapseIcon(context, isCollapsed),
iconColor: isCollapsed
? AppColor.colorIconUnSubscribedMailbox
: AppColor.primaryColor,
iconSize: 32,
padding: const EdgeInsets.all(3),
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).appGridTittle,
onTapActionCallback: _toggleAppGridDashboard,
);
},
),
],
),
),
AnimatedContainer(
duration: const Duration(milliseconds: 400),
child: ValueListenableBuilder(
valueListenable: _isCollapsedNotifier,
builder: (context, isCollapsed, child) {
if (isCollapsed) {
return const Offstage();
} else {
return child ?? const Offstage();
}
},
child: ListView.builder(
key: const Key('list_view_app_grid'),
shrinkWrap: true,
primary: false,
padding: const EdgeInsetsDirectional.only(
start: 16,
end: 16,
bottom: 8,
),
itemCount: widget.linagoraApps.length,
itemBuilder: (context, index) {
return AppListDashboardItem(
app: widget.linagoraApps[index],
imagePaths: _imagePaths,
);
},
),
),
),
const Divider(color: AppColor.colorDividerMailbox, height: 1)
]);
}
String _getCollapseIcon(BuildContext context, bool isCollapsed) {
if (isCollapsed) {
return DirectionUtils.isDirectionRTLByLanguage(context)
? _imagePaths.icArrowLeft
: _imagePaths.icArrowRight;
} else {
return _imagePaths.icArrowBottom;
}
}
void _toggleAppGridDashboard() {
_isCollapsedNotifier.value = !_isCollapsedNotifier.value;
}
}
@@ -45,6 +45,7 @@ class MailboxAppBar extends StatelessWidget {
),
if (openAppGridAction != null)
AppGridIcon(
key: const ValueKey('toggle_app_grid_button'),
icon: imagePaths.icAppDashboard,
onTapAction: openAppGridAction!,
),
@@ -1,48 +0,0 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/presentation/views/text/slogan_builder.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/base/mixin/launcher_application_mixin.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/app_linagora_ecosystem.dart';
class AppListDashboardItem extends StatelessWidget with LauncherApplicationMixin {
final AppLinagoraEcosystem app;
final ImagePaths imagePaths;
const AppListDashboardItem({
super.key,
required this.app,
required this.imagePaths,
});
@override
Widget build(BuildContext context) {
return SloganBuilder(
sizeLogo: 32,
paddingText: const EdgeInsetsDirectional.only(start: 12),
text: app.appName,
textAlign: TextAlign.center,
textStyle: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 17,
fontWeight: FontWeight.w500,
color: AppColor.colorNameEmail,
),
logo: app.getIconPath(imagePaths),
onTapCallback: _handleOpenApp,
padding: const EdgeInsetsDirectional.symmetric(vertical: 12, horizontal: 20),
hoverColor: AppColor.colorBgMailboxSelected
);
}
Future<void> _handleOpenApp() async {
await launchApplication(
androidPackageId: app.androidPackageId,
iosScheme: app.iosUrlScheme,
iosStoreLink: app.iosAppStoreLink,
uri: app.appRedirectLink,
);
}
}
@@ -874,31 +874,6 @@ Content-Type: application/ics; name="invite.ics"
Content-Disposition: attachment; filename="invite.ics"
Content-Transfer-Encoding: base64
QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFyIDcw
LjkwNTQvL0VODQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6Q09VTlRF
Ug0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMjUwNDE1VDEwMzAwMFoNCkRURU5EOjIwMjUwNDE1
VDExMDAwMFoNCkRUU1RBTVA6MjAyNTA0MTVUMDkxNzExWg0KT1JHQU5JWkVSO0NOPVR1YW4gRGF0
IERBTkc6bWFpbHRvOnRkZGFuZ0BsaW5hZ29yYS5jb20NClVJRDphMGI5N2U2ZS0zYzgyLTRlZjEt
OTgzNy01NmMxNjg5NTlmM2QNCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JPTEU9UkVRLVBB
UlRJQ0lQQU5UO1BBUlRTVEFUPVRFTlRBVElWRTtDTj1EYXQgRA0KIGFuZztYLU5VTS1HVUVTVFM9
MDptYWlsdG86dGRkYW5nMTk5NUBnbWFpbC5jb20NCkNSRUFURUQ6MjAyNTA0MTVUMDkxNjQwWg0K
REVTQ1JJUFRJT046DQpMQVNULU1PRElGSUVEOjIwMjUwNDE1VDA5MTcwN1oNCkxPQ0FUSU9OOg0K
U0VRVUVOQ0U6MA0KU1RBVFVTOkNPTkZJUk1FRA0KU1VNTUFSWTpDb21lIGZvciBhIGNoYXQNClRS
QU5TUDpPUEFRVUUNCkFUVEFDSDtGSUxFTkFNRT1hY2NvdW50LW11bHRpcGxlLnBuZzo/dmlldz1h
dHQmdGg9MTk2MzhiYzcwNDQ3N2JkNSZhdHRpZD0wLg0KIDAuMC4xJmRpc3A9YXR0ZCZ6dw0KQVRU
QUNIO0ZJTEVOQU1FPWNsb2NrLnBuZzo/dmlldz1hdHQmdGg9MTk2MzhiYzcwNDQ3N2JkNSZhdHRp
ZD0wLjAuMC4yJmRpc3A9DQogYXR0ZCZ6dw0KQVRUQUNIO0ZJTEVOQU1FPWZvbGRlci1kb3dubG9h
ZC5wbmc6P3ZpZXc9YXR0JnRoPTE5NjM4YmM3MDQ0NzdiZDUmYXR0aWQ9MC4wDQogLjAuMyZkaXNw
PWF0dGQmencNCkFUVEFDSDtGSUxFTkFNRT1mb3JtYXQtYWxpZ24tanVzdGlmeS5wbmc6P3ZpZXc9
YXR0JnRoPTE5NjM4YmM3MDQ0NzdiZDUmYXR0aQ0KIGQ9MC4wLjAuNCZkaXNwPWF0dGQmencNCkFU
VEFDSDtGSUxFTkFNRT1sb2dvLnBuZzo/dmlldz1hdHQmdGg9MTk2MzhiYzcwNDQ3N2JkNSZhdHRp
ZD0wLjAuMC41JmRpc3A9YQ0KIHR0ZCZ6dw0KQVRUQUNIO0ZJTEVOQU1FPW1hcC1tYXJrZXIucG5n
Oj92aWV3PWF0dCZ0aD0xOTYzOGJjNzA0NDc3YmQ1JmF0dGlkPTAuMC4wLjYmDQogZGlzcD1hdHRk
Jnp3DQpBVFRBQ0g7RklMRU5BTUU9cmVzb3VyY2UucG5nOj92aWV3PWF0dCZ0aD0xOTYzOGJjNzA0
NDc3YmQ1JmF0dGlkPTAuMC4wLjcmZGkNCiBzcD1hdHRkJnp3DQpBVFRBQ0g7RklMRU5BTUU9dG8u
cG5nOj92aWV3PWF0dCZ0aD0xOTYzOGJjNzA0NDc3YmQ1JmF0dGlkPTAuMC4wLjgmZGlzcD1hdHQN
CiBkJnp3DQpBVFRBQ0g7RklMRU5BTUU9dmlkZW9jb25mZXJlbmNlLnBuZzo/dmlldz1hdHQmdGg9
MTk2MzhiYzcwNDQ3N2JkNSZhdHRpZD0wLjANCiAuMC45JmRpc3A9YXR0ZCZ6dw0KRU5EOlZFVkVO
VA0KRU5EOlZDQUxFTkRBUg0K
QkVHSU46VkNBTEVOREFSClBST0RJRDotLy9Hb29nbGUgSW5jLy9Hb29nbGUgQ2FsZW5kYXIgNzAuOTA1NC8vRU4KVkVSU0lPTjoyLjAKQ0FMU0NBTEU6R1JFR09SSUFOCk1FVEhPRDpDT1VOVEVSCkJFR0lOOlZFVkVOVApEVFNUQVJUOjIwMjUwNDE1VDEwMzAwMFoKRFRFTkQ6MjAyNTA0MTVUMTEwMDAwWgpEVFNUQU1QOjIwMjUwNDE1VDA5MTcxMVoKT1JHQU5JWkVSO0NOPVR1YW4gRGF0IERBTkc6bWFpbHRvOnRkZGFuZ0BsaW5hZ29yYS5jb20KVUlEOmEwYjk3ZTZlLTNjODItNGVmMS05ODM3LTU2YzE2ODk1OWYzZApBVFRFTkRFRTtDVVRZUEU9SU5ESVZJRFVBTDtST0xFPVJFUS1QQVJUSUNJUEFOVDtQQVJUU1RBVD1URU5UQVRJVkU7Q049RGF0IEQKIGFuZztYLU5VTS1HVUVTVFM9MDptYWlsdG86Ym9iQGV4YW1wbGUuY29tCkNSRUFURUQ6MjAyNTA0MTVUMDkxNjQwWgpERVNDUklQVElPTjoKTEFTVC1NT0RJRklFRDoyMDI1MDQxNVQwOTE3MDdaCkxPQ0FUSU9OOgpTRVFVRU5DRTowClNUQVRVUzpDT05GSVJNRUQKU1VNTUFSWTpDb21lIGZvciBhIGNoYXQKVFJBTlNQOk9QQVFVRQpBVFRBQ0g7RklMRU5BTUU9YWNjb3VudC1tdWx0aXBsZS5wbmc6P3ZpZXc9YXR0JnRoPTE5NjM4YmM3MDQ0NzdiZDUmYXR0aWQ9MC4KIDAuMC4xJmRpc3A9YXR0ZCZ6dwpBVFRBQ0g7RklMRU5BTUU9Y2xvY2sucG5nOj92aWV3PWF0dCZ0aD0xOTYzOGJjNzA0NDc3YmQ1JmF0dGlkPTAuMC4wLjImZGlzcD0KIGF0dGQmencKQVRUQUNIO0ZJTEVOQU1FPWZvbGRlci1kb3dubG9hZC5wbmc6P3ZpZXc9YXR0JnRoPTE5NjM4YmM3MDQ0NzdiZDUmYXR0aWQ9MC4wCiAuMC4zJmRpc3A9YXR0ZCZ6dwpBVFRBQ0g7RklMRU5BTUU9Zm9ybWF0LWFsaWduLWp1c3RpZnkucG5nOj92aWV3PWF0dCZ0aD0xOTYzOGJjNzA0NDc3YmQ1JmF0dGkKIGQ9MC4wLjAuNCZkaXNwPWF0dGQmencKQVRUQUNIO0ZJTEVOQU1FPWxvZ28ucG5nOj92aWV3PWF0dCZ0aD0xOTYzOGJjNzA0NDc3YmQ1JmF0dGlkPTAuMC4wLjUmZGlzcD1hCiB0dGQmencKQVRUQUNIO0ZJTEVOQU1FPW1hcC1tYXJrZXIucG5nOj92aWV3PWF0dCZ0aD0xOTYzOGJjNzA0NDc3YmQ1JmF0dGlkPTAuMC4wLjYmCiBkaXNwPWF0dGQmencKQVRUQUNIO0ZJTEVOQU1FPXJlc291cmNlLnBuZzo/dmlldz1hdHQmdGg9MTk2MzhiYzcwNDQ3N2JkNSZhdHRpZD0wLjAuMC43JmRpCiBzcD1hdHRkJnp3CkFUVEFDSDtGSUxFTkFNRT10by5wbmc6P3ZpZXc9YXR0JnRoPTE5NjM4YmM3MDQ0NzdiZDUmYXR0aWQ9MC4wLjAuOCZkaXNwPWF0dAogZCZ6dwpBVFRBQ0g7RklMRU5BTUU9dmlkZW9jb25mZXJlbmNlLnBuZzo/dmlldz1hdHQmdGg9MTk2MzhiYzcwNDQ3N2JkNSZhdHRpZD0wLjAKIC4wLjkmZGlzcD1hdHRkJnp3CkVORDpWRVZFTlQKRU5EOlZDQUxFTkRBUgo=
--0000000000003367f00632cda27b--
@@ -59,7 +59,7 @@ gcloud firebase test android run \
--type instrumentation \
--app build/app/outputs/apk/debug/app-debug.apk \
--test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device 'model=oriole,version=33,locale=en,orientation=portrait' \
--device 'model=MediumPhone.arm,version=33,locale=en,orientation=portrait' \
--timeout 10m \
--use-orchestrator \
--environment-variables clearPackageData=true