diff --git a/lib/features/caching/config/hive_cache_client.dart b/lib/features/caching/config/hive_cache_client.dart index 2a455f5c1..8a8a971b3 100644 --- a/lib/features/caching/config/hive_cache_client.dart +++ b/lib/features/caching/config/hive_cache_client.dart @@ -188,9 +188,9 @@ abstract class HiveCacheClient { Future clearAllDataContainKey(String nestedKey) { return Future.sync(() async { final boxItem = encryption ? await openBoxEncryption() : await openBox(); - final mapItemNotContainNestedKey = boxItem.toMap().where((key, value) => !_matchedNestedKey(key, nestedKey)); - log('HiveCacheClient::clearAllDataContainKey:mapItemNotContainNestedKey: ${mapItemNotContainNestedKey.length}'); - return boxItem.putAll(mapItemNotContainNestedKey); + final listKeys = boxItem.toMap().where((key, value) => _matchedNestedKey(key, nestedKey)).keys; + log('HiveCacheClient::clearAllDataContainKey:listKeys: ${listKeys.length}'); + return boxItem.deleteAll(listKeys); }).catchError((error) { throw error; }); diff --git a/lib/features/mailbox/data/datasource/mailbox_datasource.dart b/lib/features/mailbox/data/datasource/mailbox_datasource.dart index 35a2113e3..4b9f30c7e 100644 --- a/lib/features/mailbox/data/datasource/mailbox_datasource.dart +++ b/lib/features/mailbox/data/datasource/mailbox_datasource.dart @@ -11,18 +11,18 @@ 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.dart'; -import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart'; abstract class MailboxDataSource { - Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}); + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}); Future> getAllMailboxCache(AccountId accountId, UserName userName); diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart index 869270f9b..b52e767b2 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart @@ -12,13 +12,13 @@ import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart'; @@ -33,7 +33,7 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource { MailboxCacheDataSourceImpl(this._mailboxCacheManager, this._exceptionThrower); @override - Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) { + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) { throw UnimplementedError(); } diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart index 3151e2778..062e7effa 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart @@ -12,7 +12,6 @@ import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart'; @@ -20,6 +19,7 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart'; @@ -35,7 +35,7 @@ class MailboxDataSourceImpl extends MailboxDataSource { MailboxDataSourceImpl(this.mailboxAPI, this._mailboxIsolateWorker, this._exceptionThrower); @override - Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) { + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) { return Future.sync(() async { return await mailboxAPI.getAllMailbox(session, accountId, properties: properties); }).catchError(_exceptionThrower.throwException); diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index 1b824fe1f..6d7df8bfe 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -30,12 +30,12 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart'; import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/exceptions/mailbox_exception.dart'; import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_method_exception.dart'; import 'package:tmail_ui_user/features/mailbox/domain/extensions/list_mailbox_id_extension.dart'; import 'package:tmail_ui_user/features/mailbox/domain/extensions/role_extension.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; @@ -51,7 +51,7 @@ class MailboxAPI with HandleSetErrorMixin { MailboxAPI(this.httpClient, this._uuid); - Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async { + Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async { final processingInvocation = ProcessingInvocation(); final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation); @@ -74,10 +74,12 @@ class MailboxAPI with HandleSetErrorMixin { queryInvocation.methodCallId, GetMailboxResponse.deserialize); - if (getMailboxResponse == null) { - throw NotFoundGetMailboxResponseException(); + if (getMailboxResponse != null && getMailboxResponse.list.isNotEmpty) { + return JmapMailboxResponse( + mailboxes: getMailboxResponse.list, + state: getMailboxResponse.state); } else { - return getMailboxResponse; + throw NotFoundMailboxException(); } } diff --git a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart index 6986a4e6d..a0fde06d7 100644 --- a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart +++ b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart @@ -23,11 +23,10 @@ import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.d import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/cache_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/model/full_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/model/partial_mailbox_response.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart'; @@ -50,33 +49,18 @@ class MailboxRepositoryImpl extends MailboxRepository { yield cacheMailboxResponse; } - final newMailboxResponse = await _getAllMailboxFromJMAP(accountId, session); - if (newMailboxResponse == null) { + final jmapMailboxResponse = await _getAllMailboxFromJMAP(accountId, session); + if (jmapMailboxResponse == null) { return; } - if (newMailboxResponse is FullMailboxResponse) { - await _syncNewInCache( - accountId, - session.username, - newMailboxResponse.mailboxes, - newMailboxResponse.state!); + await _syncNewInCache( + accountId, + session.username, + jmapMailboxResponse.mailboxes, + jmapMailboxResponse.state!); - yield newMailboxResponse; - } else if (newMailboxResponse is PartialMailboxResponse) { - await _syncUpdateInCache( - accountId, - session.username, - newMailboxResponse.mailboxes, - newMailboxResponse.state!); - - cacheMailboxResponse = await _getAllMailboxFromCache(accountId, session.username); - if (cacheMailboxResponse != null) { - yield cacheMailboxResponse; - } else { - yield newMailboxResponse; - } - } + yield jmapMailboxResponse; } Future _getAllMailboxFromCache(AccountId accountId, UserName userName) async { @@ -93,27 +77,18 @@ class MailboxRepositoryImpl extends MailboxRepository { } } - Future _getAllMailboxFromJMAP( + Future _getAllMailboxFromJMAP( AccountId accountId, Session session, {Properties? properties} ) async { try { - final getMailboxResponse = await mapDataSource[DataSourceType.network]!.getAllMailbox( + final jmapMailboxResponse = await mapDataSource[DataSourceType.network]!.getAllMailbox( session, accountId, properties: properties); - log('MailboxRepositoryImpl::_getAllMailboxFromJMAP: MAILBOX_NETWORK = ${getMailboxResponse.list.length} | STATE_NETWORK = ${getMailboxResponse.state.value}'); - if (getMailboxResponse.notFound?.isNotEmpty == true) { - return PartialMailboxResponse( - mailboxNotFound: getMailboxResponse.notFound!, - mailboxes: getMailboxResponse.list, - state: getMailboxResponse.state); - } else { - return FullMailboxResponse( - mailboxes: getMailboxResponse.list, - state: getMailboxResponse.state); - } + log('MailboxRepositoryImpl::_getAllMailboxFromJMAP: MAILBOX_NETWORK = ${jmapMailboxResponse.mailboxes.length} | STATE_NETWORK = ${jmapMailboxResponse.state}'); + return jmapMailboxResponse; } catch (e) { logError('MailboxRepositoryImpl::_getAllMailboxFromJMAP: Exception: $e'); return null; @@ -126,10 +101,12 @@ class MailboxRepositoryImpl extends MailboxRepository { List newMailboxes, State newState, ) async { - await Future.wait([ - _syncNewMailboxesInCache(accountId, userName, newMailboxes), - _syncNewMailboxStateInCache(accountId, userName, newState) - ]); + try { + await _syncNewMailboxesInCache(accountId, userName, newMailboxes); + await _syncNewMailboxStateInCache(accountId, userName, newState); + } catch (e) { + logError('MailboxRepositoryImpl::_syncNewInCache: Exception = $e'); + } } Future _syncNewMailboxesInCache( @@ -137,17 +114,13 @@ class MailboxRepositoryImpl extends MailboxRepository { UserName userName, List newMailboxes ) async { - try { - await mapDataSource[DataSourceType.local]!.clearAllMailboxCache( - accountId, - userName); - await mapDataSource[DataSourceType.local]!.update( - accountId, - userName, - created: newMailboxes); - } catch (e) { - logError('MailboxRepositoryImpl::_syncNewMailboxesInCache: Exception = $e'); - } + await mapDataSource[DataSourceType.local]!.clearAllMailboxCache( + accountId, + userName); + await mapDataSource[DataSourceType.local]!.update( + accountId, + userName, + created: newMailboxes); } Future _syncNewMailboxStateInCache( @@ -155,41 +128,10 @@ class MailboxRepositoryImpl extends MailboxRepository { UserName userName, State newState ) async { - try { - await stateDataSource.saveState( - accountId, - userName, - newState.toStateCache(StateType.mailbox)); - } catch (e) { - logError('MailboxRepositoryImpl::_syncNewMailboxStateInCache: Exception = $e'); - } - } - - Future _syncUpdateInCache( - AccountId accountId, - UserName userName, - List newMailboxes, - State newState, - ) async { - await Future.wait([ - _syncUpdateMailboxesInCache(accountId, userName, newMailboxes), - _syncNewMailboxStateInCache(accountId, userName, newState) - ]); - } - - Future _syncUpdateMailboxesInCache( - AccountId accountId, - UserName userName, - List newMailboxes - ) async { - try { - await mapDataSource[DataSourceType.local]!.update( - accountId, - userName, - updated: newMailboxes); - } catch (e) { - logError('MailboxRepositoryImpl::_syncUpdateMailboxesInCache: Exception = $e'); - } + await stateDataSource.saveState( + accountId, + userName, + newState.toStateCache(StateType.mailbox)); } Future?> _combineMailboxCache({ diff --git a/lib/features/mailbox/domain/exceptions/mailbox_exception.dart b/lib/features/mailbox/domain/exceptions/mailbox_exception.dart deleted file mode 100644 index 015859d57..000000000 --- a/lib/features/mailbox/domain/exceptions/mailbox_exception.dart +++ /dev/null @@ -1 +0,0 @@ -class NotFoundGetMailboxResponseException implements Exception {} \ No newline at end of file diff --git a/lib/features/mailbox/domain/model/full_mailbox_response.dart b/lib/features/mailbox/domain/model/full_mailbox_response.dart deleted file mode 100644 index b7d9729bc..000000000 --- a/lib/features/mailbox/domain/model/full_mailbox_response.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; - -class FullMailboxResponse extends MailboxResponse { - - FullMailboxResponse({required super.mailboxes, super.state}); -} \ No newline at end of file diff --git a/lib/features/mailbox/domain/model/jmap_mailbox_response.dart b/lib/features/mailbox/domain/model/jmap_mailbox_response.dart new file mode 100644 index 000000000..72569215e --- /dev/null +++ b/lib/features/mailbox/domain/model/jmap_mailbox_response.dart @@ -0,0 +1,6 @@ +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; + +class JmapMailboxResponse extends MailboxResponse { + + JmapMailboxResponse({required super.mailboxes, super.state}); +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/model/partial_mailbox_response.dart b/lib/features/mailbox/domain/model/partial_mailbox_response.dart deleted file mode 100644 index c9c9d4866..000000000 --- a/lib/features/mailbox/domain/model/partial_mailbox_response.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:jmap_dart_client/jmap/core/id.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart'; - -class PartialMailboxResponse extends MailboxResponse { - - final List mailboxNotFound; - - PartialMailboxResponse({ - required this.mailboxNotFound, - required super.mailboxes, - super.state, - }); - - @override - List get props => [mailboxNotFound, ...super.props]; -} \ No newline at end of file diff --git a/lib/features/push_notification/data/repository/fcm_repository_impl.dart b/lib/features/push_notification/data/repository/fcm_repository_impl.dart index 3abd9b15a..366749dfd 100644 --- a/lib/features/push_notification/data/repository/fcm_repository_impl.dart +++ b/lib/features/push_notification/data/repository/fcm_repository_impl.dart @@ -131,8 +131,7 @@ class FCMRepositoryImpl extends FCMRepository { return mailboxesCacheNotPutNotifications; } else { final mailboxResponse = await _mapMailboxDataSource[DataSourceType.network]!.getAllMailbox(session, accountId); - final mailboxes = mailboxResponse.list; - final mailboxesNotPutNotifications = mailboxes + final mailboxesNotPutNotifications = mailboxResponse.mailboxes .map((mailbox) => mailbox.toPresentationMailbox()) .where((presentationMailbox) => presentationMailbox.pushNotificationDeactivated) .toList(); diff --git a/test/features/mailbox/repository/mailbox_respository_test.dart b/test/features/mailbox/repository/mailbox_respository_test.dart new file mode 100644 index 000000000..0407a7748 --- /dev/null +++ b/test/features/mailbox/repository/mailbox_respository_test.dart @@ -0,0 +1,232 @@ +import 'package:core/data/model/source_type/data_source_type.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:model/extensions/session_extension.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart'; +import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; +import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_method_exception.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/cache_mailbox_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; + +import '../../../fixtures/mailbox_fixtures.dart'; +import '../../../fixtures/session_fixtures.dart'; +import '../../../fixtures/state_fixtures.dart'; +import 'mailbox_respository_test.mocks.dart'; + +@GenerateMocks([ + MailboxDataSource, + MailboxCacheDataSourceImpl, + StateDataSource +]) +void main() { + late MailboxDataSource mailboxDataSource; + late MailboxCacheDataSourceImpl mailboxCacheDataSourceImpl; + late StateDataSource stateDataSource; + late MailboxRepository mailboxRepository; + + final sessionFixture = SessionFixtures.aliceSession; + final accountIdFixture = SessionFixtures.aliceSession.personalAccount.accountId; + final userNameFixture = SessionFixtures.aliceSession.username; + + group('[getAllMailbox] method test', () { + setUp(() { + mailboxDataSource = MockMailboxDataSource(); + mailboxCacheDataSourceImpl = MockMailboxCacheDataSourceImpl(); + stateDataSource = MockStateDataSource(); + mailboxRepository = MailboxRepositoryImpl( + { + DataSourceType.network: mailboxDataSource, + DataSourceType.local: mailboxCacheDataSourceImpl + }, + stateDataSource); + }); + + test( + 'getAllMailbox SHOULD only return CacheMailboxResponse \n' + 'WHEN `getAllMailboxCache` has data \n' + 'AND getAllMailbox from JMAP throws NotFoundMailboxException', + () async { + when(mailboxCacheDataSourceImpl.getAllMailboxCache(accountIdFixture, userNameFixture)) + .thenAnswer((_) async => [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ]); + + when(stateDataSource.getState(accountIdFixture, userNameFixture, StateType.mailbox)) + .thenAnswer((_) async => StateFixtures.currentMailboxState); + + when(mailboxDataSource.getAllMailbox(sessionFixture, accountIdFixture)) + .thenThrow(NotFoundMailboxException()); + + final streamMailboxResponses = mailboxRepository.getAllMailbox(sessionFixture, accountIdFixture); + + final listMailboxResponse = await streamMailboxResponses.toList(); + + expect(listMailboxResponse.length, 1); + expect( + listMailboxResponse, + containsAllInOrder([ + CacheMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ], + state: StateFixtures.currentMailboxState + ) + ]) + ); + }); + + test( + 'getAllMailbox SHOULD return [CacheMailboxResponse, JmapMailboxResponse] \n' + 'WHEN getAllMailbox from JMAP has JmapMailboxResponse with `list` property is not empty', + () async { + when(mailboxCacheDataSourceImpl.getAllMailboxCache(accountIdFixture, userNameFixture)) + .thenAnswer((_) async => [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ]); + + when(stateDataSource.getState(accountIdFixture, userNameFixture, StateType.mailbox)) + .thenAnswer((_) async => StateFixtures.currentMailboxState); + + when(mailboxDataSource.getAllMailbox(sessionFixture, accountIdFixture)) + .thenAnswer((_) async => JmapMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ], + state: StateFixtures.currentMailboxState + )); + + final streamMailboxResponses = mailboxRepository.getAllMailbox(sessionFixture, accountIdFixture); + + final listMailboxResponse = await streamMailboxResponses.toList(); + + expect(listMailboxResponse.length, 2); + expect( + listMailboxResponse, + containsAllInOrder([ + CacheMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ], + state: StateFixtures.currentMailboxState + ), + JmapMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ], + state: StateFixtures.currentMailboxState + ) + ]) + ); + }); + + test( + 'getAllMailbox SHOULD only return JmapMailboxResponse \n' + 'WHEN `getAllMailboxCache` throw an Exception \n' + 'AND getAllMailbox from JMAP has JmapMailboxResponse with `list` property is not empty', + () async { + when(mailboxCacheDataSourceImpl.getAllMailboxCache(accountIdFixture, userNameFixture)) + .thenThrow(Exception('Not Found Mailbox Cache')); + + when(stateDataSource.getState(accountIdFixture, userNameFixture, StateType.mailbox)) + .thenAnswer((_) async => null); + + when(mailboxDataSource.getAllMailbox(sessionFixture, accountIdFixture)) + .thenAnswer((_) async => JmapMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ], + state: StateFixtures.currentMailboxState + )); + + final streamMailboxResponses = mailboxRepository.getAllMailbox(sessionFixture, accountIdFixture); + + final listMailboxResponse = await streamMailboxResponses.toList(); + + expect(listMailboxResponse.length, 1); + expect( + listMailboxResponse, + containsAllInOrder([ + JmapMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ], + state: StateFixtures.currentMailboxState + ) + ]) + ); + }); + + test( + 'getAllMailbox SHOULD return latest list mailbox is [MailboxA, MailboxB, MailboxB, MailboxC, MailboxD] \n' + 'WHEN `getAllMailboxCache` has [MailboxA, MailboxB] \n' + 'AND getAllMailbox from JMAP has JmapMailboxResponse with `list` property is [MailboxA, MailboxB, MailboxC, MailboxD]', + () async { + when(mailboxCacheDataSourceImpl.getAllMailboxCache(accountIdFixture, userNameFixture)) + .thenAnswer((_) async => [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + ]); + + when(stateDataSource.getState(accountIdFixture, userNameFixture, StateType.mailbox)) + .thenAnswer((_) async => StateFixtures.currentMailboxState); + + when(mailboxDataSource.getAllMailbox(sessionFixture, accountIdFixture)) + .thenAnswer((_) async => JmapMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD + ], + state: StateFixtures.newMailboxState + )); + + final streamMailboxResponses = mailboxRepository.getAllMailbox(sessionFixture, accountIdFixture); + + final listMailboxResponse = await streamMailboxResponses.toList(); + + expect(listMailboxResponse.length, 2); + expect( + listMailboxResponse.last, + equals(JmapMailboxResponse( + mailboxes: [ + MailboxFixtures.mailboxA, + MailboxFixtures.mailboxB, + MailboxFixtures.mailboxC, + MailboxFixtures.mailboxD, + ], + state: StateFixtures.newMailboxState + )) + ); + }); + }); +} \ No newline at end of file diff --git a/test/fixtures/mailbox_fixtures.dart b/test/fixtures/mailbox_fixtures.dart index d02446070..a1796f5e6 100644 --- a/test/fixtures/mailbox_fixtures.dart +++ b/test/fixtures/mailbox_fixtures.dart @@ -95,4 +95,9 @@ class MailboxFixtures { true), isSubscribed: IsSubscribed(true) ); + + static final mailboxA = Mailbox(id: MailboxId(Id('A'))); + static final mailboxB = Mailbox(id: MailboxId(Id('B'))); + static final mailboxC = Mailbox(id: MailboxId(Id('C'))); + static final mailboxD = Mailbox(id: MailboxId(Id('D'))); } \ No newline at end of file diff --git a/test/fixtures/state_fixtures.dart b/test/fixtures/state_fixtures.dart index df5eb6981..ddc391a09 100644 --- a/test/fixtures/state_fixtures.dart +++ b/test/fixtures/state_fixtures.dart @@ -3,5 +3,6 @@ import 'package:jmap_dart_client/jmap/core/state.dart'; class StateFixtures { static final currentMailboxState = State('a1234'); + static final newMailboxState = State('a2345'); static final currentEmailState = State('e1234'); } \ No newline at end of file