diff --git a/integration_test/robots/label_list_context_menu_robot.dart b/integration_test/robots/label_list_context_menu_robot.dart new file mode 100644 index 000000000..8f8266bd1 --- /dev/null +++ b/integration_test/robots/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/search_robot.dart b/integration_test/robots/search_robot.dart index 645d99c0b..fa94a1c07 100644 --- a/integration_test/robots/search_robot.dart +++ b/integration_test/robots/search_robot.dart @@ -95,4 +95,8 @@ class SearchRobot extends CoreRobot { ); await $(#mobile_hasAttachment_search_filter_button).tap(); } + + Future openLabelListModal() async { + await $(#mobile_labels_search_filter_button).tap(); + } } \ No newline at end of file diff --git a/integration_test/scenarios/search/search_email_with_tag_scenario.dart b/integration_test/scenarios/search/search_email_with_tag_scenario.dart new file mode 100644 index 000000000..45494fef3 --- /dev/null +++ b/integration_test/scenarios/search/search_email_with_tag_scenario.dart @@ -0,0 +1,91 @@ +import 'package:core/utils/platform_info.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:labels/labels.dart'; +import 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../mixin/provisioning_label_scenario_mixin.dart'; +import '../../robots/label_list_context_menu_robot.dart'; +import '../../robots/search_robot.dart'; +import '../../robots/thread_robot.dart'; + +class SearchEmailWithTagScenario extends BaseTestScenario + with ProvisioningLabelScenarioMixin { + const SearchEmailWithTagScenario(super.$); + + @override + Future setupPreLogin() async { + PlatformInfo.isIntegrationTesting = true; + } + + @override + Future runTestLogic() async { + const emailUser = String.fromEnvironment('BASIC_AUTH_EMAIL'); + + final threadRobot = ThreadRobot($); + final searchRobot = SearchRobot($); + final labelListContextMenuRobot = LabelListContextMenuRobot($); + + final labels = await provisionLabelsByDisplayNames( + ['Search Tag 1', 'Search Tag 2', 'Search Tag 3'], + ); + await $.pumpAndSettle(); + + int emailCount = 3; + for (final label in labels) { + await provisionEmail( + buildEmailsForLabel( + label: label, + toEmail: emailUser, + count: emailCount, + ), + requestReadReceipt: false, + ); + } + await $.pumpAndSettle(duration: const Duration(seconds: 2)); + + await threadRobot.openSearchView(); + await _expectSearchViewVisible(); + + for (final label in labels) { + final labelDisplayName = label.safeDisplayName; + + await searchRobot.openLabelListModal(); + await _expectLabelListContextMenuVisible(); + + await labelListContextMenuRobot.selectLabelByName(labelDisplayName); + await _expectEmailListDisplayedCorrectByTag( + tagDisplayName: labelDisplayName, + emailCount: emailCount, + ); + + await $.pumpAndSettle(duration: const Duration(seconds: 1)); + } + } + + Future _expectSearchViewVisible() async { + await expectViewVisible($(SearchEmailView)); + } + + Future _expectLabelListContextMenuVisible() async { + await expectViewVisible($(#label_list_bottom_sheet_context_menu)); + } + + Future _expectEmailListDisplayedCorrectByTag({ + required String tagDisplayName, + required int emailCount, + }) async { + final listEmailTileWithTag = $.tester.widgetList( + $(EmailTileBuilder).which((widget) => + widget.presentationEmail.subject?.contains(tagDisplayName) == true), + ); + + expect(listEmailTileWithTag.length, greaterThanOrEqualTo(emailCount)); + } + + @override + Future disposeAfterTest() async { + PlatformInfo.isIntegrationTesting = false; + } +} diff --git a/integration_test/tests/search/search_email_with_tag_test.dart b/integration_test/tests/search/search_email_with_tag_test.dart new file mode 100644 index 000000000..93d8b3a33 --- /dev/null +++ b/integration_test/tests/search/search_email_with_tag_test.dart @@ -0,0 +1,9 @@ +import '../../base/test_base.dart'; +import '../../scenarios/search/search_email_with_tag_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should display email list correctly when search with tag', + scenarioBuilder: ($) => SearchEmailWithTagScenario($), + ); +} diff --git a/lib/features/search/email/presentation/mixin/search_label_filter_modal_mixin.dart b/lib/features/search/email/presentation/mixin/search_label_filter_modal_mixin.dart index ae4ca3638..eb4b7b91a 100644 --- a/lib/features/search/email/presentation/mixin/search_label_filter_modal_mixin.dart +++ b/lib/features/search/email/presentation/mixin/search_label_filter_modal_mixin.dart @@ -81,6 +81,7 @@ mixin SearchLabelFilterModalMixin on PopupContextMenuActionMixin { }).toList(); openBottomSheetContextMenuAction( + key: const Key('label_list_bottom_sheet_context_menu'), context: context, itemActions: contextMenuActions, onContextMenuActionClick: (menuAction) { diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index e12fea0fe..619d00842 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -753,14 +753,12 @@ class SearchEmailView extends GetWidget final isLabelAvailable = dashboardController.isLabelAvailable; - final labelController = dashboardController.labelController; + final listLabels = dashboardController.labelController.labels; List