diff --git a/integration_test/robots/labels/create_label_modal_robot.dart b/integration_test/robots/labels/create_label_modal_robot.dart new file mode 100644 index 000000000..e79a0a56c --- /dev/null +++ b/integration_test/robots/labels/create_label_modal_robot.dart @@ -0,0 +1,22 @@ +import 'package:core/presentation/views/text/text_field_builder.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/base/widget/label_input_field_builder.dart'; +import 'package:tmail_ui_user/features/labels/presentation/widgets/create_new_label_modal.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +import '../../base/core_robot.dart'; + +class CreateLabelModalRobot extends CoreRobot { + CreateLabelModalRobot(super.$); + + Future enterNewLabelName(String name) async { + await $(CreateNewLabelModal) + .$(LabelInputFieldBuilder) + .$(TextFieldBuilder) + .enterText(name); + } + + Future tapSaveButton() async { + await $(CreateNewLabelModal).$(AppLocalizations().save).tap(); + } +} diff --git a/integration_test/robots/labels/label_action_type_context_menu_robot.dart b/integration_test/robots/labels/label_action_type_context_menu_robot.dart new file mode 100644 index 000000000..54f8f8d5e --- /dev/null +++ b/integration_test/robots/labels/label_action_type_context_menu_robot.dart @@ -0,0 +1,14 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/base/widget/context_menu/context_menu_dialog_item.dart'; + +import '../../base/core_robot.dart'; + +class LabelActionTypeContextMenuRobot extends CoreRobot { + LabelActionTypeContextMenuRobot(super.$); + + Future selectActionByName(String name) async { + final item = $(ContextMenuDialogItem).$(name); + await $.scrollUntilVisible(finder: item); + await item.tap(); + } +} diff --git a/integration_test/robots/labels/label_list_context_menu_robot.dart b/integration_test/robots/labels/label_list_context_menu_robot.dart new file mode 100644 index 000000000..128605de8 --- /dev/null +++ b/integration_test/robots/labels/label_list_context_menu_robot.dart @@ -0,0 +1,14 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/base/widget/context_menu/context_menu_dialog_item.dart'; + +import '../../base/core_robot.dart'; + +class LabelListContextMenuRobot extends CoreRobot { + LabelListContextMenuRobot(super.$); + + Future selectLabelByName(String name) async { + final item = $(ContextMenuDialogItem).$(name); + await $.scrollUntilVisible(finder: item); + await item.tap(); + } +} diff --git a/integration_test/robots/labels/label_robot.dart b/integration_test/robots/labels/label_robot.dart new file mode 100644 index 000000000..67a7f2928 --- /dev/null +++ b/integration_test/robots/labels/label_robot.dart @@ -0,0 +1,14 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/label_list_item.dart'; + +import '../../base/core_robot.dart'; + +class LabelRobot extends CoreRobot { + LabelRobot(super.$); + + Future longPressLabelWithName(String name) async { + final item = $(LabelListItem).$(name); + await $.scrollUntilVisible(finder: item); + await item.longPress(); + } +} diff --git a/integration_test/scenarios/labels/edit_a_tag_scenario.dart b/integration_test/scenarios/labels/edit_a_tag_scenario.dart new file mode 100644 index 000000000..0682a7631 --- /dev/null +++ b/integration_test/scenarios/labels/edit_a_tag_scenario.dart @@ -0,0 +1,63 @@ +import 'package:core/utils/platform_info.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 '../../mixin/provisioning_label_scenario_mixin.dart'; +import '../../robots/labels/create_label_modal_robot.dart'; +import '../../robots/labels/label_action_type_context_menu_robot.dart'; +import '../../robots/labels/label_robot.dart'; +import '../../robots/thread_robot.dart'; + +class EditATagScenario extends BaseTestScenario + with ProvisioningLabelScenarioMixin { + const EditATagScenario(super.$); + + @override + Future setupPreLogin() async { + PlatformInfo.isIntegrationTesting = true; + } + + @override + Future runTestLogic() async { + final threadRobot = ThreadRobot($); + final labelRobot = LabelRobot($); + final labelActionTypeContextMenuRobot = LabelActionTypeContextMenuRobot($); + final createLabelModalRobot = CreateLabelModalRobot($); + final appLocalizations = AppLocalizations(); + + await provisionLabelsByDisplayNames(['Edit Tag 1', 'Edit Tag 2']); + await $.pumpAndSettle(duration: const Duration(seconds: 2)); + + await threadRobot.openMailbox(); + await labelRobot.longPressLabelWithName('Edit Tag 1'); + await _expectLabelActionTypeContextMenuVisible(); + + await labelActionTypeContextMenuRobot.selectActionByName( + appLocalizations.edit, + ); + await _expectEditLabelModalVisible(); + + const newLabelName = 'New edit tag 1'; + await createLabelModalRobot.enterNewLabelName(newLabelName); + await createLabelModalRobot.tapSaveButton(); + await _expectLabelWithNewNameUpdated(newLabelName); + } + + Future _expectLabelActionTypeContextMenuVisible() async { + await expectViewVisible($(#label_action_type_context_menu)); + } + + Future _expectEditLabelModalVisible() async { + await expectViewVisible($(#edit_label_modal)); + } + + Future _expectLabelWithNewNameUpdated(String name) async { + await expectViewVisible($(name)); + } + + @override + Future disposeAfterTest() async { + PlatformInfo.isIntegrationTesting = false; + } +} diff --git a/integration_test/tests/labels/edit_a_label_test.dart b/integration_test/tests/labels/edit_a_label_test.dart new file mode 100644 index 000000000..a801cf534 --- /dev/null +++ b/integration_test/tests/labels/edit_a_label_test.dart @@ -0,0 +1,10 @@ +import '../../base/test_base.dart'; +import '../../scenarios/labels/edit_a_tag_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: + 'Should update label display name when edit a label successfully', + scenarioBuilder: ($) => EditATagScenario($), + ); +} diff --git a/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart b/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart index a9b733a13..e128c06ed 100644 --- a/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart +++ b/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart @@ -1,5 +1,6 @@ import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; +import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:labels/extensions/list_label_extension.dart'; import 'package:labels/model/label.dart'; @@ -42,6 +43,7 @@ extension HandleLabelActionTypeExtension on LabelController { await DialogRouter().openDialogModal( child: CreateNewLabelModal( + key: const Key('edit_label_modal'), labels: labels, selectedLabel: label, actionType: LabelActionType.edit, diff --git a/lib/features/labels/presentation/mixin/label_context_menu_mixin.dart b/lib/features/labels/presentation/mixin/label_context_menu_mixin.dart index 51a189a66..8b60eb6d6 100644 --- a/lib/features/labels/presentation/mixin/label_context_menu_mixin.dart +++ b/lib/features/labels/presentation/mixin/label_context_menu_mixin.dart @@ -100,6 +100,7 @@ mixin LabelContextMenuMixin on PopupContextMenuActionMixin { .toList(); return openBottomSheetContextMenuAction( + key: const Key('label_action_type_context_menu'), context: context, itemActions: contextMenuActions, onContextMenuActionClick: (menuAction) {