TF-2528 Add integration test for search email with sort by sender nam…e ascending

This commit is contained in:
dab246
2024-11-13 15:51:25 +07:00
committed by Dat H. Pham
parent cf2a0b08e5
commit 51a4a1b9b7
27 changed files with 591 additions and 59 deletions
@@ -1,9 +1,11 @@
import 'package:tmail_ui_user/features/login/presentation/login_view.dart';
import 'package:tmail_ui_user/features/starting_page/presentation/twake_welcome/twake_welcome_view.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
import '../base/base_scenario.dart';
import '../robots/login_robot.dart';
import '../robots/thread_robot.dart';
import '../utils/scenario_utils_mixin.dart';
class LoginWithBasicAuthScenario extends BaseScenario with ScenarioUtilsMixin {
class LoginWithBasicAuthScenario extends BaseScenario {
const LoginWithBasicAuthScenario(
super.$,
{
@@ -22,12 +24,12 @@ class LoginWithBasicAuthScenario extends BaseScenario with ScenarioUtilsMixin {
@override
Future<void> execute() async {
final loginRobot = LoginRobot($);
final threadRobot = ThreadRobot($);
await loginRobot.expectWelcomeViewVisible();
await _expectWelcomeViewVisible();
await loginRobot.tapOnUseCompanyServer();
await _expectLoginViewVisible();
await loginRobot.expectLoginViewVisible();
await loginRobot.enterEmail(username);
await loginRobot.enterHostUrl(hostUrl);
@@ -35,8 +37,14 @@ class LoginWithBasicAuthScenario extends BaseScenario with ScenarioUtilsMixin {
await loginRobot.enterBasicAuthPassword(password);
await loginRobot.loginBasicAuth();
await grantNotificationPermission($.native);
await loginRobot.grantNotificationPermission($.native);
await threadRobot.expectThreadViewVisible();
await _expectThreadViewVisible();
}
Future<void> _expectWelcomeViewVisible() => expectViewVisible($(TwakeWelcomeView));
Future<void> _expectLoginViewVisible() => expectViewVisible($(LoginView));
Future<void> _expectThreadViewVisible() => expectViewVisible($(ThreadView));
}
@@ -0,0 +1,198 @@
import 'package:collection/collection.dart';
import 'package:core/domain/extensions/list_datetime_extension.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.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 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import '../base/base_scenario.dart';
import '../robots/search_robot.dart';
import '../robots/thread_robot.dart';
import 'login_with_basic_auth_scenario.dart';
class SearchEmailWithSortOrderScenario extends BaseScenario {
const SearchEmailWithSortOrderScenario(
super.$,
{
required this.loginWithBasicAuthScenario,
required this.queryString,
required this.listUsername,
}
);
final LoginWithBasicAuthScenario loginWithBasicAuthScenario;
final String queryString;
final List<String> listUsername;
@override
Future<void> execute() async {
await loginWithBasicAuthScenario.execute();
final threadRobot = ThreadRobot($);
await threadRobot.openSearchView();
await _expectSearchViewVisible();
final searchRobot = SearchRobot($);
await searchRobot.enterQueryString(queryString);
await _expectSuggestionSearchListViewVisible();
await searchRobot.scrollToEndListSearchFilter();
await _expectSortBySearchFilterButtonVisible();
final appLocalizations = AppLocalizations();
for (var sortOrderType in EmailSortOrderType.values) {
await _performSelectSortOrderAndValidateSearchResult(
searchRobot: searchRobot,
sortOrderType: sortOrderType,
appLocalizations: appLocalizations,
);
}
}
Future<void> _performSelectSortOrderAndValidateSearchResult({
required SearchRobot searchRobot,
required EmailSortOrderType sortOrderType,
required AppLocalizations appLocalizations,
}) async {
await Future.delayed(const Duration(seconds: 2));
await searchRobot.openSortOrderBottomDialog();
await _expectSortFilterContextMenuVisible();
await searchRobot.selectSortOrder(sortOrderType.getTitleByAppLocalizations(appLocalizations));
await _expectSearchResultEmailListVisible();
await _expectEmailListDisplayedCorrectly(listUsername: listUsername);
switch (sortOrderType) {
case EmailSortOrderType.mostRecent:
await _expectEmailListSortedCorrectByMostRecent();
break;
case EmailSortOrderType.oldest:
await _expectEmailListSortedCorrectByOldest();
break;
case EmailSortOrderType.senderAscending:
await _expectEmailListSortedCorrectBySenderAscending(listUsername: listUsername);
break;
case EmailSortOrderType.senderDescending:
await _expectEmailListSortedCorrectBySenderDescending(listUsername: listUsername);
break;
case EmailSortOrderType.subjectAscending:
await _expectEmailListSortedCorrectBySubjectAscending(listUsername: listUsername);
break;
case EmailSortOrderType.subjectDescending:
await _expectEmailListSortedCorrectBySubjectDescending(listUsername: listUsername);
break;
case EmailSortOrderType.relevance:
break;
}
}
Future<void> _expectSearchViewVisible() async {
await expectViewVisible($(SearchEmailView));
}
Future<void> _expectSuggestionSearchListViewVisible() async {
await expectViewVisible($(#suggestion_search_list_view));
}
Future<void> _expectSortBySearchFilterButtonVisible() async {
await expectViewVisible($(#mobile_sortBy_search_filter_button));
}
Future<void> _expectSortFilterContextMenuVisible() async {
await expectViewVisible($(#sort_filter_context_menu));
}
Future<void> _expectSearchResultEmailListVisible() async {
await expectViewVisible($(#search_email_list_notification_listener));
}
Future<void> _expectEmailListDisplayedCorrectly({
required List<String> listUsername,
}) async {
expect(find.byType(EmailTileBuilder), findsNWidgets(listUsername.length));
}
Future<void> _expectEmailListSortedCorrectBySenderAscending({
required List<String> listUsername,
}) async {
final listEmailTile = $.tester
.widgetList<EmailTileBuilder>(find.byType(EmailTileBuilder));
for (int i = 0; i < listUsername.length; i++) {
EmailTileBuilder emailTile = listEmailTile.elementAt(i);
final senderName = emailTile.presentationEmail.firstEmailAddressInFrom;
expect(senderName, equals('${listUsername[i].toLowerCase()}@example.com'));
}
}
Future<void> _expectEmailListSortedCorrectBySenderDescending({
required List<String> listUsername,
}) async {
final listEmailTile = $.tester
.widgetList<EmailTileBuilder>(find.byType(EmailTileBuilder));
final reversedListUsername = listUsername.reversed.toList();
for (int i = 0; i < reversedListUsername.length; i++) {
EmailTileBuilder emailTile = listEmailTile.elementAt(i);
final senderName = emailTile.presentationEmail.firstEmailAddressInFrom;
expect(senderName, equals('${reversedListUsername[i].toLowerCase()}@example.com'));
}
}
Future<void> _expectEmailListSortedCorrectBySubjectAscending({
required List<String> listUsername,
}) async {
final listEmailTile = $.tester
.widgetList<EmailTileBuilder>(find.byType(EmailTileBuilder));
for (int i = 0; i < listUsername.length; i++) {
EmailTileBuilder emailTile = listEmailTile.elementAt(i);
final subject = emailTile.presentationEmail.subject;
expect(subject, equals('${listUsername[i]} send Bob'));
}
}
Future<void> _expectEmailListSortedCorrectBySubjectDescending({
required List<String> listUsername,
}) async {
final listEmailTile = $.tester
.widgetList<EmailTileBuilder>(find.byType(EmailTileBuilder));
final reversedListUsername = listUsername.reversed.toList();
for (int i = 0; i < reversedListUsername.length; i++) {
EmailTileBuilder emailTile = listEmailTile.elementAt(i);
final subject = emailTile.presentationEmail.subject;
expect(subject, equals('${reversedListUsername[i]} send Bob'));
}
}
Future<void> _expectEmailListSortedCorrectByMostRecent() async {
final listEmailTile = $.tester
.widgetList<EmailTileBuilder>(find.byType(EmailTileBuilder));
final listReceiveAtTime = listEmailTile
.map((emailTile) => emailTile.presentationEmail.receivedAt?.value)
.whereNotNull()
.toList();
expect(listReceiveAtTime.isSortedByMostRecent(), isTrue);
}
Future<void> _expectEmailListSortedCorrectByOldest() async {
final listEmailTile = $.tester
.widgetList<EmailTileBuilder>(find.byType(EmailTileBuilder));
final listReceiveAtTime = listEmailTile
.map((emailTile) => emailTile.presentationEmail.receivedAt?.value)
.whereNotNull()
.toList();
expect(listReceiveAtTime.isSortedByOldestFirst(), isTrue);
}
}
@@ -1,3 +1,6 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import '../base/base_scenario.dart';
import '../robots/composer_robot.dart';
import '../robots/thread_robot.dart';
@@ -27,7 +30,7 @@ class SendEmailScenario extends BaseScenario {
await loginWithBasicAuthScenario.execute();
await threadRobot.openComposer();
await threadRobot.expectComposerViewVisible();
await _expectComposerViewVisible();
await composerRobot.grantContactPermission();
@@ -36,6 +39,13 @@ class SendEmailScenario extends BaseScenario {
await composerRobot.addSubject(subject);
await composerRobot.addContent(content);
await composerRobot.sendEmail();
await composerRobot.expectSendEmailSuccessToast();
await _expectSendEmailSuccessToast();
}
Future<void> _expectComposerViewVisible() => expectViewVisible($(ComposerView));
Future<void> _expectSendEmailSuccessToast() async {
expect($('Message has been sent successfully'), findsOneWidget);
}
}