TF-2694 Unit Test User select quick sort filter and query string

This commit is contained in:
DatDang
2024-03-25 16:18:33 +07:00
committed by Dat H. Pham
parent f7486e565f
commit 7ab03f6f80
@@ -0,0 +1,404 @@
import 'package:core/data/network/config/dynamic_url_interceptors.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/widgets.dart' hide State;
import 'package:flutter_test/flutter_test.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
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/state.dart';
import 'package:jmap_dart_client/jmap/core/user_name.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:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/user/user_profile.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:rxdart/subjects.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/save_email_as_drafts_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/update_email_drafts_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/get_restored_deleted_message_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/restore_deleted_message_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart';
import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart';
import 'package:tmail_ui_user/features/home/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/update_authentication_account_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_composer_cache_on_web_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/save_recent_search_interactor.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/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/spam_report_controller.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/quick_search_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/delete_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/store_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/empty_spam_folder_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/get_email_by_id_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'
if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart';
import 'package:uuid/uuid.dart';
import '../../../email/presentation/controller/single_email_controller_test.mocks.dart';
import 'mailbox_dashboard_controller_test.mocks.dart';
mockControllerCallback() => InternalFinalCallback<void>(callback: () {});
const fallbackGenerators = {
#onStart: mockControllerCallback,
#onDelete: mockControllerCallback,
};
@GenerateNiceMocks([
// write mock specs for unavailable dependencies
MockSpec<DeleteEmailPermanentlyInteractor>(),
MockSpec<MarkAsMailboxReadInteractor>(),
MockSpec<GetComposerCacheOnWebInteractor>(),
MockSpec<MarkAsMultipleEmailReadInteractor>(),
MockSpec<MarkAsStarMultipleEmailInteractor>(),
MockSpec<MoveMultipleEmailToMailboxInteractor>(),
MockSpec<EmptyTrashFolderInteractor>(),
MockSpec<DeleteMultipleEmailsPermanentlyInteractor>(),
MockSpec<GetEmailByIdInteractor>(),
MockSpec<SendEmailInteractor>(),
MockSpec<StoreSendingEmailInteractor>(),
MockSpec<UpdateSendingEmailInteractor>(),
MockSpec<GetAllSendingEmailInteractor>(),
MockSpec<StoreSessionInteractor>(),
MockSpec<EmptySpamFolderInteractor>(),
MockSpec<SaveEmailAsDraftsInteractor>(),
MockSpec<UpdateEmailDraftsInteractor>(),
MockSpec<DeleteSendingEmailInteractor>(),
MockSpec<UnsubscribeEmailInteractor>(),
MockSpec<RestoredDeletedMessageInteractor>(),
MockSpec<GetRestoredDeletedMessageInterator>(),
MockSpec<BuildContext>(),
MockSpec<RemoveEmailDraftsInteractor>(),
MockSpec<EmailReceiveManager>(),
MockSpec<DownloadController>(fallbackGenerators: fallbackGenerators),
MockSpec<AppGridDashboardController>(),
MockSpec<SpamReportController>(fallbackGenerators: fallbackGenerators),
MockSpec<NetworkConnectionController>(fallbackGenerators: fallbackGenerators),
MockSpec<QuickSearchEmailInteractor>(),
MockSpec<SaveRecentSearchInteractor>(),
MockSpec<GetAllRecentSearchLatestInteractor>(),
MockSpec<GetSessionInteractor>(),
MockSpec<GetAuthenticatedAccountInteractor>(),
MockSpec<UpdateAuthenticationAccountInteractor>(),
MockSpec<CreateNewMailboxInteractor>(),
MockSpec<DeleteMultipleMailboxInteractor>(),
MockSpec<RenameMailboxInteractor>(),
MockSpec<MoveMailboxInteractor>(),
MockSpec<SubscribeMailboxInteractor>(),
MockSpec<SubscribeMultipleMailboxInteractor>(),
MockSpec<CreateDefaultMailboxInteractor>(),
MockSpec<TreeBuilder>(),
MockSpec<VerifyNameInteractor>(),
MockSpec<GetAllMailboxInteractor>(),
MockSpec<RefreshAllMailboxInteractor>(),
MockSpec<GetEmailsInMailboxInteractor>(),
MockSpec<RefreshChangesEmailsInMailboxInteractor>(),
MockSpec<LoadMoreEmailsInMailboxInteractor>(),
MockSpec<SearchEmailInteractor>(),
MockSpec<SearchMoreEmailInteractor>(),
])
void main() {
// mock mailbox dashboard controller direct dependencies
final moveToMailboxInteractor = MockMoveToMailboxInteractor();
final deleteEmailPermanentlyInteractor =
MockDeleteEmailPermanentlyInteractor();
final markAsMailboxReadInteractor = MockMarkAsMailboxReadInteractor();
final getEmailCacheOnWebInteractor = MockGetComposerCacheOnWebInteractor();
final markAsEmailReadInteractor = MockMarkAsEmailReadInteractor();
final markAsStarEmailInteractor = MockMarkAsStarEmailInteractor();
final markAsMultipleEmailReadInteractor =
MockMarkAsMultipleEmailReadInteractor();
final markAsStarMultipleEmailInteractor =
MockMarkAsStarMultipleEmailInteractor();
final moveMultipleEmailToMailboxInteractor =
MockMoveMultipleEmailToMailboxInteractor();
final emptyTrashFolderInteractor = MockEmptyTrashFolderInteractor();
final deleteMultipleEmailsPermanentlyInteractor =
MockDeleteMultipleEmailsPermanentlyInteractor();
final getEmailByIdInteractor = MockGetEmailByIdInteractor();
final sendEmailInteractor = MockSendEmailInteractor();
final storeSendingEmailInteractor = MockStoreSendingEmailInteractor();
final updateSendingEmailInteractor = MockUpdateSendingEmailInteractor();
final getAllSendingEmailInteractor = MockGetAllSendingEmailInteractor();
final storeSessionInteractor = MockStoreSessionInteractor();
final emptySpamFolderInteractor = MockEmptySpamFolderInteractor();
final saveEmailAsDraftsInteractor = MockSaveEmailAsDraftsInteractor();
final updateEmailDraftsInteractor = MockUpdateEmailDraftsInteractor();
final deleteSendingEmailInteractor = MockDeleteSendingEmailInteractor();
final unsubscribeEmailInteractor = MockUnsubscribeEmailInteractor();
final restoreDeletedMessageInteractor =
MockRestoredDeletedMessageInteractor();
final getRestoredDeletedMessageInteractor =
MockGetRestoredDeletedMessageInterator();
late MailboxDashBoardController mailboxDashboardController;
// mock mailbox dashboard controller Get dependencies
final removeEmailDraftsInteractor = MockRemoveEmailDraftsInteractor();
final emailReceiveManager = MockEmailReceiveManager();
final downloadController = MockDownloadController();
final appGridDashboardController = MockAppGridDashboardController();
final spamReportController = MockSpamReportController();
final networkConnectionController = MockNetworkConnectionController();
// mock search controller direct dependencies
final quickSearchEmailInteractor = MockQuickSearchEmailInteractor();
final saveRecentSearchInteractor = MockSaveRecentSearchInteractor();
final getAllRecentSearchLatestInteractor = MockGetAllRecentSearchLatestInteractor();
late SearchController searchController;
// mock base controller Get dependencies
final cachingManager = MockCachingManager();
final languageCacheManager = MockLanguageCacheManager();
final authorizationInterceptors = MockAuthorizationInterceptors();
final dynamicUrlInterceptors = MockDynamicUrlInterceptors();
final deleteCredentialInteractor = MockDeleteCredentialInteractor();
final logoutOidcInteractor = MockLogoutOidcInteractor();
final deleteAuthorityOidcInteractor = MockDeleteAuthorityOidcInteractor();
final appToast = MockAppToast();
final imagePaths = MockImagePaths();
final responsiveUtils = MockResponsiveUtils();
final uuid = MockUuid();
// mock reloadable controller Get dependencies
final getSessionInteractor = MockGetSessionInteractor();
final getAuthenticatedAccountInteractor = MockGetAuthenticatedAccountInteractor();
final updateAuthenticationAccountInteractor = MockUpdateAuthenticationAccountInteractor();
// mock mailbox controller direct dependencies
final createNewMailboxInteractor = MockCreateNewMailboxInteractor();
final deleteMultipleMailboxInteractor = MockDeleteMultipleMailboxInteractor();
final renameMailboxInteractor = MockRenameMailboxInteractor();
final moveMailboxInteractor = MockMoveMailboxInteractor();
final subscribeMailboxInteractor = MockSubscribeMailboxInteractor();
final subscribeMultipleMailboxInteractor = MockSubscribeMultipleMailboxInteractor();
final createDefaultMailboxInteractor = MockCreateDefaultMailboxInteractor();
final treeBuilder = MockTreeBuilder();
final verifyNameInteractor = MockVerifyNameInteractor();
final getAllMailboxInteractor = MockGetAllMailboxInteractor();
final refreshAllMailboxInteractor = MockRefreshAllMailboxInteractor();
late MailboxController mailboxController;
// mock thread controller direct dependencies
final getEmailsInMailboxInteractor = MockGetEmailsInMailboxInteractor();
final refreshChangesEmailsInMailboxInteractor =
MockRefreshChangesEmailsInMailboxInteractor();
final loadMoreEmailsInMailboxInteractor = MockLoadMoreEmailsInMailboxInteractor();
final searchEmailInteractor = MockSearchEmailInteractor();
final searchMoreEmailInteractor = MockSearchMoreEmailInteractor();
late ThreadController threadController;
final context = MockBuildContext();
const queryString = 'test text';
final google = Uri.parse('https://www.google.com');
final testSession =
Session({}, {}, {}, UserName('data'), google, google, google, google, State('1'));
final testMailboxId = MailboxId(Id('1'));
setUp(() {
Get.put<RemoveEmailDraftsInteractor>(removeEmailDraftsInteractor);
Get.put<EmailReceiveManager>(emailReceiveManager);
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;
PackageInfo.setMockInitialValues(
appName: '',
packageName: '',
version: '',
buildNumber: '',
buildSignature: '');
when(emailReceiveManager.pendingEmailAddressInfo).thenAnswer((_) => BehaviorSubject.seeded(null));
when(emailReceiveManager.pendingEmailContentInfo).thenAnswer((_) => BehaviorSubject.seeded(null));
when(emailReceiveManager.pendingFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
searchController = SearchController(
quickSearchEmailInteractor,
saveRecentSearchInteractor,
getAllRecentSearchLatestInteractor);
Get.put(searchController);
mailboxDashboardController = MailboxDashBoardController(
moveToMailboxInteractor,
deleteEmailPermanentlyInteractor,
markAsMailboxReadInteractor,
getEmailCacheOnWebInteractor,
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(
createNewMailboxInteractor,
deleteMultipleMailboxInteractor,
renameMailboxInteractor,
moveMailboxInteractor,
subscribeMailboxInteractor,
subscribeMultipleMailboxInteractor,
createDefaultMailboxInteractor,
treeBuilder,
verifyNameInteractor,
getAllMailboxInteractor,
refreshAllMailboxInteractor);
mailboxController.onReady();
threadController = ThreadController(
getEmailsInMailboxInteractor,
refreshChangesEmailsInMailboxInteractor,
loadMoreEmailsInMailboxInteractor,
searchEmailInteractor,
searchMoreEmailInteractor,
getEmailByIdInteractor);
Get.put(threadController);
mailboxDashboardController.sessionCurrent = testSession;
mailboxDashboardController.filterMessageOption.value = FilterMessageOption.all;
mailboxDashboardController.userProfile.value = UserProfile('test@gmail.com');
});
tearDown(Get.deleteAll);
test('WHEN user search email by keyword, '
'THEN user filter search result, '
'THEN user tap on mail box, '
'SHOULD reset all search and filter options, '
'THEN query get all email with default options',
() async {
// arrange
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 filter in search controller update as expected
mailboxDashboardController.selectQuickSearchFilterAction(QuickSearchFilter.hasAttachment);
expect(searchController.searchEmailFilter.value.hasAttachment, true);
mailboxDashboardController.selectQuickSearchFilterAction(QuickSearchFilter.last7Days);
mailboxDashboardController.selectReceiveTimeQuickSearchFilter(context, EmailReceiveTimeType.last30Days);
expect(searchController.searchEmailFilter.value.emailReceiveTimeType, EmailReceiveTimeType.last30Days);
// 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, testAccountId,
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));
});
}