TF-2694 Unit Test User use advanced filter and sort then reset with open mailbox

This commit is contained in:
DatDang
2024-03-26 14:28:17 +07:00
committed by Dat H. Pham
parent 7ab03f6f80
commit 133691e082
@@ -10,6 +10,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:mockito/annotations.dart'; import 'package:mockito/annotations.dart';
@@ -52,11 +53,13 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_com
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart';
@@ -233,7 +236,7 @@ void main() {
late MailboxController mailboxController; late MailboxController mailboxController;
// mock thread controller direct dependencies // mock thread controller direct dependencies
final getEmailsInMailboxInteractor = MockGetEmailsInMailboxInteractor(); late MockGetEmailsInMailboxInteractor getEmailsInMailboxInteractor;
final refreshChangesEmailsInMailboxInteractor = final refreshChangesEmailsInMailboxInteractor =
MockRefreshChangesEmailsInMailboxInteractor(); MockRefreshChangesEmailsInMailboxInteractor();
final loadMoreEmailsInMailboxInteractor = MockLoadMoreEmailsInMailboxInteractor(); final loadMoreEmailsInMailboxInteractor = MockLoadMoreEmailsInMailboxInteractor();
@@ -241,164 +244,229 @@ void main() {
final searchMoreEmailInteractor = MockSearchMoreEmailInteractor(); final searchMoreEmailInteractor = MockSearchMoreEmailInteractor();
late ThreadController threadController; late ThreadController threadController;
late AdvancedFilterController advancedFilterController;
final context = MockBuildContext(); final context = MockBuildContext();
const queryString = 'test text'; const queryString = 'test text';
final google = Uri.parse('https://www.google.com'); final google = Uri.parse('https://www.google.com');
final testSession = final testSession =
Session({}, {}, {}, UserName('data'), google, google, google, google, State('1')); Session({}, {}, {}, UserName('data'), google, google, google, google, State('1'));
final testMailboxId = MailboxId(Id('1')); final testMailboxId = MailboxId(Id('1'));
final testAccountId = AccountId(Id('123'));
setUp(() { group('search/sort/filter feature:', () {
Get.put<RemoveEmailDraftsInteractor>(removeEmailDraftsInteractor); setUp(() {
Get.put<EmailReceiveManager>(emailReceiveManager); getEmailsInMailboxInteractor = MockGetEmailsInMailboxInteractor();
Get.put<DownloadController>(downloadController);
Get.put<AppGridDashboardController>(appGridDashboardController);
Get.put<SpamReportController>(spamReportController);
Get.put<NetworkConnectionController>(networkConnectionController);
Get.put<CachingManager>(cachingManager);
Get.put<LanguageCacheManager>(languageCacheManager);
Get.put<AuthorizationInterceptors>(authorizationInterceptors);
Get.put<AuthorizationInterceptors>(
authorizationInterceptors,
tag: BindingTag.isolateTag,
);
Get.put<DynamicUrlInterceptors>(dynamicUrlInterceptors);
Get.put<DeleteCredentialInteractor>(deleteCredentialInteractor);
Get.put<LogoutOidcInteractor>(logoutOidcInteractor);
Get.put<DeleteAuthorityOidcInteractor>(deleteAuthorityOidcInteractor);
Get.put<AppToast>(appToast);
Get.put<ImagePaths>(imagePaths);
Get.put<ResponsiveUtils>(responsiveUtils);
Get.put<Uuid>(uuid);
Get.put<GetSessionInteractor>(getSessionInteractor);
Get.put<GetAuthenticatedAccountInteractor>(getAuthenticatedAccountInteractor);
Get.put<UpdateAuthenticationAccountInteractor>(updateAuthenticationAccountInteractor);
Get.testMode = true; Get.put<RemoveEmailDraftsInteractor>(removeEmailDraftsInteractor);
PackageInfo.setMockInitialValues( Get.put<EmailReceiveManager>(emailReceiveManager);
appName: '', Get.put<DownloadController>(downloadController);
packageName: '', Get.put<AppGridDashboardController>(appGridDashboardController);
version: '', Get.put<SpamReportController>(spamReportController);
buildNumber: '', Get.put<NetworkConnectionController>(networkConnectionController);
buildSignature: ''); Get.put<CachingManager>(cachingManager);
Get.put<LanguageCacheManager>(languageCacheManager);
Get.put<AuthorizationInterceptors>(authorizationInterceptors);
Get.put<AuthorizationInterceptors>(
authorizationInterceptors,
tag: BindingTag.isolateTag,
);
Get.put<DynamicUrlInterceptors>(dynamicUrlInterceptors);
Get.put<DeleteCredentialInteractor>(deleteCredentialInteractor);
Get.put<LogoutOidcInteractor>(logoutOidcInteractor);
Get.put<DeleteAuthorityOidcInteractor>(deleteAuthorityOidcInteractor);
Get.put<AppToast>(appToast);
Get.put<ImagePaths>(imagePaths);
Get.put<ResponsiveUtils>(responsiveUtils);
Get.put<Uuid>(uuid);
Get.put<GetSessionInteractor>(getSessionInteractor);
Get.put<GetAuthenticatedAccountInteractor>(getAuthenticatedAccountInteractor);
Get.put<UpdateAuthenticationAccountInteractor>(updateAuthenticationAccountInteractor);
when(emailReceiveManager.pendingEmailAddressInfo).thenAnswer((_) => BehaviorSubject.seeded(null)); Get.testMode = true;
when(emailReceiveManager.pendingEmailContentInfo).thenAnswer((_) => BehaviorSubject.seeded(null)); PackageInfo.setMockInitialValues(
when(emailReceiveManager.pendingFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); appName: '',
packageName: '',
version: '',
buildNumber: '',
buildSignature: '');
searchController = SearchController( when(emailReceiveManager.pendingEmailAddressInfo).thenAnswer((_) => BehaviorSubject.seeded(null));
quickSearchEmailInteractor, when(emailReceiveManager.pendingEmailContentInfo).thenAnswer((_) => BehaviorSubject.seeded(null));
saveRecentSearchInteractor, when(emailReceiveManager.pendingFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
getAllRecentSearchLatestInteractor);
Get.put(searchController);
mailboxDashboardController = MailboxDashBoardController( searchController = SearchController(
moveToMailboxInteractor, quickSearchEmailInteractor,
deleteEmailPermanentlyInteractor, saveRecentSearchInteractor,
markAsMailboxReadInteractor, getAllRecentSearchLatestInteractor);
getEmailCacheOnWebInteractor, Get.put(searchController);
markAsEmailReadInteractor,
markAsStarEmailInteractor,
markAsMultipleEmailReadInteractor,
markAsStarMultipleEmailInteractor,
moveMultipleEmailToMailboxInteractor,
emptyTrashFolderInteractor,
deleteMultipleEmailsPermanentlyInteractor,
getEmailByIdInteractor,
sendEmailInteractor,
storeSendingEmailInteractor,
updateSendingEmailInteractor,
getAllSendingEmailInteractor,
storeSessionInteractor,
emptySpamFolderInteractor,
saveEmailAsDraftsInteractor,
updateEmailDraftsInteractor,
deleteSendingEmailInteractor,
unsubscribeEmailInteractor,
restoreDeletedMessageInteractor,
getRestoredDeletedMessageInteractor);
Get.put(mailboxDashboardController);
mailboxDashboardController.onReady();
mailboxController = MailboxController( mailboxDashboardController = MailboxDashBoardController(
createNewMailboxInteractor, moveToMailboxInteractor,
deleteMultipleMailboxInteractor, deleteEmailPermanentlyInteractor,
renameMailboxInteractor, markAsMailboxReadInteractor,
moveMailboxInteractor, getEmailCacheOnWebInteractor,
subscribeMailboxInteractor, markAsEmailReadInteractor,
subscribeMultipleMailboxInteractor, markAsStarEmailInteractor,
createDefaultMailboxInteractor, markAsMultipleEmailReadInteractor,
treeBuilder, markAsStarMultipleEmailInteractor,
verifyNameInteractor, moveMultipleEmailToMailboxInteractor,
getAllMailboxInteractor, emptyTrashFolderInteractor,
refreshAllMailboxInteractor); deleteMultipleEmailsPermanentlyInteractor,
mailboxController.onReady(); getEmailByIdInteractor,
sendEmailInteractor,
storeSendingEmailInteractor,
updateSendingEmailInteractor,
getAllSendingEmailInteractor,
storeSessionInteractor,
emptySpamFolderInteractor,
saveEmailAsDraftsInteractor,
updateEmailDraftsInteractor,
deleteSendingEmailInteractor,
unsubscribeEmailInteractor,
restoreDeletedMessageInteractor,
getRestoredDeletedMessageInteractor);
Get.put(mailboxDashboardController);
mailboxDashboardController.onReady();
threadController = ThreadController( mailboxController = MailboxController(
getEmailsInMailboxInteractor, createNewMailboxInteractor,
refreshChangesEmailsInMailboxInteractor, deleteMultipleMailboxInteractor,
loadMoreEmailsInMailboxInteractor, renameMailboxInteractor,
searchEmailInteractor, moveMailboxInteractor,
searchMoreEmailInteractor, subscribeMailboxInteractor,
getEmailByIdInteractor); subscribeMultipleMailboxInteractor,
Get.put(threadController); createDefaultMailboxInteractor,
treeBuilder,
verifyNameInteractor,
getAllMailboxInteractor,
refreshAllMailboxInteractor);
mailboxController.onReady();
mailboxDashboardController.sessionCurrent = testSession; threadController = ThreadController(
mailboxDashboardController.filterMessageOption.value = FilterMessageOption.all; getEmailsInMailboxInteractor,
mailboxDashboardController.userProfile.value = UserProfile('test@gmail.com'); refreshChangesEmailsInMailboxInteractor,
}); loadMoreEmailsInMailboxInteractor,
searchEmailInteractor,
searchMoreEmailInteractor,
getEmailByIdInteractor);
Get.put(threadController);
tearDown(Get.deleteAll); advancedFilterController = AdvancedFilterController();
test('WHEN user search email by keyword, ' mailboxDashboardController.sessionCurrent = testSession;
mailboxDashboardController.filterMessageOption.value = FilterMessageOption.all;
mailboxDashboardController.userProfile.value = UserProfile('test@gmail.com');
mailboxDashboardController.accountId.value = testAccountId;
});
test('WHEN user search email by keyword, '
'THEN user filter search result, ' 'THEN user filter search result, '
'THEN user tap on mail box, ' 'THEN user tap on mail box, '
'SHOULD reset all search and filter options, ' 'SHOULD reset all search and filter options, '
'THEN query get all email with default options', 'THEN query get all email with default options',
() async { () async {
// arrange // arrange
when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager())); when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager()));
final testAccountId = AccountId(Id('123'));
mailboxDashboardController.accountId.value = testAccountId; // expect query in search controller update as expected
mailboxDashboardController.searchEmail(context, queryString: queryString);
expect(searchController.searchEmailFilter.value.text, SearchQuery(queryString));
// expect sort in search controller update as expected
mailboxDashboardController.selectSortOrderQuickSearchFilter(
context,
EmailSortOrderType.oldest);
expect(searchController.sortOrderFiltered.value, EmailSortOrderType.oldest);
// expect query in search controller update as expected // expect filter in search controller update as expected
mailboxDashboardController.searchEmail(context, queryString: queryString); mailboxDashboardController.selectQuickSearchFilterAction(QuickSearchFilter.hasAttachment);
expect(searchController.searchEmailFilter.value.text, SearchQuery(queryString)); expect(searchController.searchEmailFilter.value.hasAttachment, true);
mailboxDashboardController.selectQuickSearchFilterAction(QuickSearchFilter.last7Days);
// expect sort in search controller update as expected mailboxDashboardController.selectReceiveTimeQuickSearchFilter(context, EmailReceiveTimeType.last30Days);
mailboxDashboardController.selectSortOrderQuickSearchFilter( expect(searchController.searchEmailFilter.value.emailReceiveTimeType, EmailReceiveTimeType.last30Days);
context,
EmailSortOrderType.oldest);
expect(searchController.sortOrderFiltered.value, EmailSortOrderType.oldest);
// expect filter in search controller update as expected // expect mailbox dashboard controller calls GetEmailsInMailboxInteractor
mailboxDashboardController.selectQuickSearchFilterAction(QuickSearchFilter.hasAttachment); // when [selectedMailbox] is changed and triggered obx listener in thread controller
expect(searchController.searchEmailFilter.value.hasAttachment, true); mailboxController.openMailbox(context, PresentationMailbox(testMailboxId));
mailboxDashboardController.selectQuickSearchFilterAction(QuickSearchFilter.last7Days); await untilCalled(getEmailsInMailboxInteractor.execute(
mailboxDashboardController.selectReceiveTimeQuickSearchFilter(context, EmailReceiveTimeType.last30Days); any, any,
expect(searchController.searchEmailFilter.value.emailReceiveTimeType, EmailReceiveTimeType.last30Days); limit: anyNamed('limit'),
sort: anyNamed('sort'),
emailFilter: anyNamed('emailFilter'),
propertiesCreated: anyNamed('propertiesCreated'),
propertiesUpdated: anyNamed('propertiesUpdated')));
expect(searchController.sortOrderFiltered.value, EmailSortOrderType.mostRecent);
expect(searchController.searchEmailFilter.value, SearchEmailFilter.initial());
verify(getEmailsInMailboxInteractor.execute(
testSession, testAccountId,
limit: ThreadConstants.defaultLimit,
sort: EmailSortOrderType.mostRecent.getSortOrder().toNullable(),
emailFilter: EmailFilter(
filter: EmailFilterCondition(inMailbox: testMailboxId),
filterOption: FilterMessageOption.all,
mailboxId: testMailboxId),
propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault));
});
// expect mailbox dashboard controller calls GetEmailsInMailboxInteractor test('WHEN user use advanced search/sort/filter feature, '
// when [selectedMailbox] is changed and triggered obx listener in thread controller 'THEN user tap on mail box, '
mailboxController.openMailbox(context, PresentationMailbox(testMailboxId)); 'SHOULD reset all advanced search and filter options, '
await untilCalled(getEmailsInMailboxInteractor.execute( 'THEN query get all email with default options',
any, testAccountId, () async {
limit: anyNamed('limit'), final fromEmailAddress = EmailAddress('test from', 'test-from@gmail.com');
sort: anyNamed('sort'), final toEmailAddress = EmailAddress('test to', 'test-to@gmail.com');
emailFilter: anyNamed('emailFilter'), const emailSubject = 'test subject';
propertiesCreated: anyNamed('propertiesCreated'), const emailContainsWord = 'test word';
propertiesUpdated: anyNamed('propertiesUpdated'))); const emailNotContainsWord = 'test not word';
expect(searchController.sortOrderFiltered.value, EmailSortOrderType.mostRecent); // arrange
expect(searchController.searchEmailFilter.value, SearchEmailFilter.initial()); when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager()));
verify(getEmailsInMailboxInteractor.execute(
testSession, testAccountId, // expect query in advanced filter controller update as expected
limit: ThreadConstants.defaultLimit, advancedFilterController.updateListEmailAddress(AdvancedSearchFilterField.from, [fromEmailAddress]);
sort: EmailSortOrderType.mostRecent.getSortOrder().toNullable(), advancedFilterController.updateListEmailAddress(AdvancedSearchFilterField.to, [toEmailAddress]);
emailFilter: EmailFilter( advancedFilterController.subjectFilterInputController.text = emailSubject;
filter: EmailFilterCondition(inMailbox: testMailboxId), advancedFilterController.hasKeyWordFilterInputController.text = emailContainsWord;
filterOption: FilterMessageOption.all, advancedFilterController.notKeyWordFilterInputController.text = emailNotContainsWord;
mailboxId: testMailboxId), // mailbox: impossible? due to private field
propertiesCreated: ThreadConstants.propertiesDefault, advancedFilterController.updateReceiveDateSearchFilter(context, EmailReceiveTimeType.last30Days);
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault)); advancedFilterController.updateSortOrder(EmailSortOrderType.relevance);
advancedFilterController.applyAdvancedSearchFilter(context);
expect(searchController.searchEmailFilter.value, SearchEmailFilter(
from: {fromEmailAddress.email!},
to: {toEmailAddress.email!},
subject: emailSubject,
text: SearchQuery(emailContainsWord),
notKeyword: {emailNotContainsWord},
emailReceiveTimeType: EmailReceiveTimeType.last30Days,
sortOrder: EmailSortOrderType.relevance.getSortOrder().toNullable(),
position: 0));
// expect mailbox dashboard controller calls GetEmailsInMailboxInteractor
// when [selectedMailbox] is changed and triggered obx listener in thread controller
mailboxController.openMailbox(context, PresentationMailbox(testMailboxId));
await untilCalled(getEmailsInMailboxInteractor.execute(
any, any,
limit: anyNamed('limit'),
sort: anyNamed('sort'),
emailFilter: anyNamed('emailFilter'),
propertiesCreated: anyNamed('propertiesCreated'),
propertiesUpdated: anyNamed('propertiesUpdated')));
expect(searchController.sortOrderFiltered.value, EmailSortOrderType.mostRecent);
expect(searchController.searchEmailFilter.value, SearchEmailFilter.initial());
verify(getEmailsInMailboxInteractor.execute(
testSession, testAccountId,
limit: ThreadConstants.defaultLimit,
sort: EmailSortOrderType.mostRecent.getSortOrder().toNullable(),
emailFilter: EmailFilter(
filter: EmailFilterCondition(inMailbox: testMailboxId),
filterOption: FilterMessageOption.all,
mailboxId: testMailboxId),
propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault));
});
tearDown(Get.deleteAll);
}); });
} }