TF-2536 Write unit test for getAllMailbox method repository
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -188,9 +188,9 @@ abstract class HiveCacheClient<T> {
|
|||||||
Future<void> clearAllDataContainKey(String nestedKey) {
|
Future<void> clearAllDataContainKey(String nestedKey) {
|
||||||
return Future.sync(() async {
|
return Future.sync(() async {
|
||||||
final boxItem = encryption ? await openBoxEncryption() : await openBox();
|
final boxItem = encryption ? await openBoxEncryption() : await openBox();
|
||||||
final mapItemNotContainNestedKey = boxItem.toMap().where((key, value) => !_matchedNestedKey(key, nestedKey));
|
final listKeys = boxItem.toMap().where((key, value) => _matchedNestedKey(key, nestedKey)).keys;
|
||||||
log('HiveCacheClient::clearAllDataContainKey:mapItemNotContainNestedKey: ${mapItemNotContainNestedKey.length}');
|
log('HiveCacheClient::clearAllDataContainKey:listKeys: ${listKeys.length}');
|
||||||
return boxItem.putAll(mapItemNotContainNestedKey);
|
return boxItem.deleteAll(listKeys);
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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/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.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: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/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/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/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/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/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_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
|
||||||
|
|
||||||
abstract class MailboxDataSource {
|
abstract class MailboxDataSource {
|
||||||
Future<GetMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties});
|
Future<JmapMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties});
|
||||||
|
|
||||||
Future<List<Mailbox>> getAllMailboxCache(AccountId accountId, UserName userName);
|
Future<List<Mailbox>> getAllMailboxCache(AccountId accountId, UserName userName);
|
||||||
|
|
||||||
|
|||||||
@@ -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/unsigned_int.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.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: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/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/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/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/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/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/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/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_mailbox_request.dart';
|
||||||
@@ -33,7 +33,7 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
|
|||||||
MailboxCacheDataSourceImpl(this._mailboxCacheManager, this._exceptionThrower);
|
MailboxCacheDataSourceImpl(this._mailboxCacheManager, this._exceptionThrower);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<GetMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) {
|
Future<JmapMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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/unsigned_int.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.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: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/datasource/mailbox_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.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/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/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/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/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/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_mailbox_request.dart';
|
||||||
@@ -35,7 +35,7 @@ class MailboxDataSourceImpl extends MailboxDataSource {
|
|||||||
MailboxDataSourceImpl(this.mailboxAPI, this._mailboxIsolateWorker, this._exceptionThrower);
|
MailboxDataSourceImpl(this.mailboxAPI, this._mailboxIsolateWorker, this._exceptionThrower);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<GetMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) {
|
Future<JmapMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) {
|
||||||
return Future.sync(() async {
|
return Future.sync(() async {
|
||||||
return await mailboxAPI.getAllMailbox(session, accountId, properties: properties);
|
return await mailboxAPI.getAllMailbox(session, accountId, properties: properties);
|
||||||
}).catchError(_exceptionThrower.throwException);
|
}).catchError(_exceptionThrower.throwException);
|
||||||
|
|||||||
@@ -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/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/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/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/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/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/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/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/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/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/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/rename_mailbox_request.dart';
|
||||||
@@ -51,7 +51,7 @@ class MailboxAPI with HandleSetErrorMixin {
|
|||||||
|
|
||||||
MailboxAPI(this.httpClient, this._uuid);
|
MailboxAPI(this.httpClient, this._uuid);
|
||||||
|
|
||||||
Future<GetMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async {
|
Future<JmapMailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async {
|
||||||
final processingInvocation = ProcessingInvocation();
|
final processingInvocation = ProcessingInvocation();
|
||||||
|
|
||||||
final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation);
|
final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation);
|
||||||
@@ -74,10 +74,12 @@ class MailboxAPI with HandleSetErrorMixin {
|
|||||||
queryInvocation.methodCallId,
|
queryInvocation.methodCallId,
|
||||||
GetMailboxResponse.deserialize);
|
GetMailboxResponse.deserialize);
|
||||||
|
|
||||||
if (getMailboxResponse == null) {
|
if (getMailboxResponse != null && getMailboxResponse.list.isNotEmpty) {
|
||||||
throw NotFoundGetMailboxResponseException();
|
return JmapMailboxResponse(
|
||||||
|
mailboxes: getMailboxResponse.list,
|
||||||
|
state: getMailboxResponse.state);
|
||||||
} else {
|
} else {
|
||||||
return getMailboxResponse;
|
throw NotFoundMailboxException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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/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/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/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/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/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/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/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_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_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;
|
yield cacheMailboxResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
final newMailboxResponse = await _getAllMailboxFromJMAP(accountId, session);
|
final jmapMailboxResponse = await _getAllMailboxFromJMAP(accountId, session);
|
||||||
if (newMailboxResponse == null) {
|
if (jmapMailboxResponse == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newMailboxResponse is FullMailboxResponse) {
|
await _syncNewInCache(
|
||||||
await _syncNewInCache(
|
accountId,
|
||||||
accountId,
|
session.username,
|
||||||
session.username,
|
jmapMailboxResponse.mailboxes,
|
||||||
newMailboxResponse.mailboxes,
|
jmapMailboxResponse.state!);
|
||||||
newMailboxResponse.state!);
|
|
||||||
|
|
||||||
yield newMailboxResponse;
|
yield jmapMailboxResponse;
|
||||||
} 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<CacheMailboxResponse?> _getAllMailboxFromCache(AccountId accountId, UserName userName) async {
|
Future<CacheMailboxResponse?> _getAllMailboxFromCache(AccountId accountId, UserName userName) async {
|
||||||
@@ -93,27 +77,18 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<MailboxResponse?> _getAllMailboxFromJMAP(
|
Future<JmapMailboxResponse?> _getAllMailboxFromJMAP(
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
Session session,
|
Session session,
|
||||||
{Properties? properties}
|
{Properties? properties}
|
||||||
) async {
|
) async {
|
||||||
try {
|
try {
|
||||||
final getMailboxResponse = await mapDataSource[DataSourceType.network]!.getAllMailbox(
|
final jmapMailboxResponse = await mapDataSource[DataSourceType.network]!.getAllMailbox(
|
||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
properties: properties);
|
properties: properties);
|
||||||
log('MailboxRepositoryImpl::_getAllMailboxFromJMAP: MAILBOX_NETWORK = ${getMailboxResponse.list.length} | STATE_NETWORK = ${getMailboxResponse.state.value}');
|
log('MailboxRepositoryImpl::_getAllMailboxFromJMAP: MAILBOX_NETWORK = ${jmapMailboxResponse.mailboxes.length} | STATE_NETWORK = ${jmapMailboxResponse.state}');
|
||||||
if (getMailboxResponse.notFound?.isNotEmpty == true) {
|
return jmapMailboxResponse;
|
||||||
return PartialMailboxResponse(
|
|
||||||
mailboxNotFound: getMailboxResponse.notFound!,
|
|
||||||
mailboxes: getMailboxResponse.list,
|
|
||||||
state: getMailboxResponse.state);
|
|
||||||
} else {
|
|
||||||
return FullMailboxResponse(
|
|
||||||
mailboxes: getMailboxResponse.list,
|
|
||||||
state: getMailboxResponse.state);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError('MailboxRepositoryImpl::_getAllMailboxFromJMAP: Exception: $e');
|
logError('MailboxRepositoryImpl::_getAllMailboxFromJMAP: Exception: $e');
|
||||||
return null;
|
return null;
|
||||||
@@ -126,10 +101,12 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
List<Mailbox> newMailboxes,
|
List<Mailbox> newMailboxes,
|
||||||
State newState,
|
State newState,
|
||||||
) async {
|
) async {
|
||||||
await Future.wait([
|
try {
|
||||||
_syncNewMailboxesInCache(accountId, userName, newMailboxes),
|
await _syncNewMailboxesInCache(accountId, userName, newMailboxes);
|
||||||
_syncNewMailboxStateInCache(accountId, userName, newState)
|
await _syncNewMailboxStateInCache(accountId, userName, newState);
|
||||||
]);
|
} catch (e) {
|
||||||
|
logError('MailboxRepositoryImpl::_syncNewInCache: Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _syncNewMailboxesInCache(
|
Future<void> _syncNewMailboxesInCache(
|
||||||
@@ -137,17 +114,13 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
UserName userName,
|
UserName userName,
|
||||||
List<Mailbox> newMailboxes
|
List<Mailbox> newMailboxes
|
||||||
) async {
|
) async {
|
||||||
try {
|
await mapDataSource[DataSourceType.local]!.clearAllMailboxCache(
|
||||||
await mapDataSource[DataSourceType.local]!.clearAllMailboxCache(
|
accountId,
|
||||||
accountId,
|
userName);
|
||||||
userName);
|
await mapDataSource[DataSourceType.local]!.update(
|
||||||
await mapDataSource[DataSourceType.local]!.update(
|
accountId,
|
||||||
accountId,
|
userName,
|
||||||
userName,
|
created: newMailboxes);
|
||||||
created: newMailboxes);
|
|
||||||
} catch (e) {
|
|
||||||
logError('MailboxRepositoryImpl::_syncNewMailboxesInCache: Exception = $e');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _syncNewMailboxStateInCache(
|
Future<void> _syncNewMailboxStateInCache(
|
||||||
@@ -155,41 +128,10 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
UserName userName,
|
UserName userName,
|
||||||
State newState
|
State newState
|
||||||
) async {
|
) async {
|
||||||
try {
|
await stateDataSource.saveState(
|
||||||
await stateDataSource.saveState(
|
accountId,
|
||||||
accountId,
|
userName,
|
||||||
userName,
|
newState.toStateCache(StateType.mailbox));
|
||||||
newState.toStateCache(StateType.mailbox));
|
|
||||||
} catch (e) {
|
|
||||||
logError('MailboxRepositoryImpl::_syncNewMailboxStateInCache: Exception = $e');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _syncUpdateInCache(
|
|
||||||
AccountId accountId,
|
|
||||||
UserName userName,
|
|
||||||
List<Mailbox> newMailboxes,
|
|
||||||
State newState,
|
|
||||||
) async {
|
|
||||||
await Future.wait([
|
|
||||||
_syncUpdateMailboxesInCache(accountId, userName, newMailboxes),
|
|
||||||
_syncNewMailboxStateInCache(accountId, userName, newState)
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _syncUpdateMailboxesInCache(
|
|
||||||
AccountId accountId,
|
|
||||||
UserName userName,
|
|
||||||
List<Mailbox> newMailboxes
|
|
||||||
) async {
|
|
||||||
try {
|
|
||||||
await mapDataSource[DataSourceType.local]!.update(
|
|
||||||
accountId,
|
|
||||||
userName,
|
|
||||||
updated: newMailboxes);
|
|
||||||
} catch (e) {
|
|
||||||
logError('MailboxRepositoryImpl::_syncUpdateMailboxesInCache: Exception = $e');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<Mailbox>?> _combineMailboxCache({
|
Future<List<Mailbox>?> _combineMailboxCache({
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
class NotFoundGetMailboxResponseException implements Exception {}
|
|
||||||
@@ -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});
|
|
||||||
}
|
|
||||||
@@ -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});
|
||||||
|
}
|
||||||
@@ -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<Id> mailboxNotFound;
|
|
||||||
|
|
||||||
PartialMailboxResponse({
|
|
||||||
required this.mailboxNotFound,
|
|
||||||
required super.mailboxes,
|
|
||||||
super.state,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [mailboxNotFound, ...super.props];
|
|
||||||
}
|
|
||||||
@@ -131,8 +131,7 @@ class FCMRepositoryImpl extends FCMRepository {
|
|||||||
return mailboxesCacheNotPutNotifications;
|
return mailboxesCacheNotPutNotifications;
|
||||||
} else {
|
} else {
|
||||||
final mailboxResponse = await _mapMailboxDataSource[DataSourceType.network]!.getAllMailbox(session, accountId);
|
final mailboxResponse = await _mapMailboxDataSource[DataSourceType.network]!.getAllMailbox(session, accountId);
|
||||||
final mailboxes = mailboxResponse.list;
|
final mailboxesNotPutNotifications = mailboxResponse.mailboxes
|
||||||
final mailboxesNotPutNotifications = mailboxes
|
|
||||||
.map((mailbox) => mailbox.toPresentationMailbox())
|
.map((mailbox) => mailbox.toPresentationMailbox())
|
||||||
.where((presentationMailbox) => presentationMailbox.pushNotificationDeactivated)
|
.where((presentationMailbox) => presentationMailbox.pushNotificationDeactivated)
|
||||||
.toList();
|
.toList();
|
||||||
|
|||||||
@@ -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
|
||||||
|
))
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Vendored
+5
@@ -95,4 +95,9 @@ class MailboxFixtures {
|
|||||||
true),
|
true),
|
||||||
isSubscribed: IsSubscribed(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')));
|
||||||
}
|
}
|
||||||
Vendored
+1
@@ -3,5 +3,6 @@ import 'package:jmap_dart_client/jmap/core/state.dart';
|
|||||||
|
|
||||||
class StateFixtures {
|
class StateFixtures {
|
||||||
static final currentMailboxState = State('a1234');
|
static final currentMailboxState = State('a1234');
|
||||||
|
static final newMailboxState = State('a2345');
|
||||||
static final currentEmailState = State('e1234');
|
static final currentEmailState = State('e1234');
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user