diff --git a/contact/lib/contact_module.dart b/contact/lib/contact_module.dart index 6858970d7..bb499cc50 100644 --- a/contact/lib/contact_module.dart +++ b/contact/lib/contact_module.dart @@ -4,10 +4,6 @@ export 'contact/model/contact.dart'; export 'contact/model/contact_filter.dart'; export 'contact/model/tmail_contact.dart'; -export 'data/network/contact_api.dart'; -export 'data/datasource/auto_complete_datasource.dart'; -export 'data/datasource_impl/tmail_contact_datasource_impl.dart'; - export 'contact/autocomplete/autocomplete_tmail_contact_method.dart'; export 'contact/autocomplete/autocomplete_tmail_contact_response.dart'; diff --git a/contact/test/datasource/tmail_contact_datasource_impl_test.dart b/contact/test/datasource/tmail_contact_datasource_impl_test.dart deleted file mode 100644 index 8ccd0f75e..000000000 --- a/contact/test/datasource/tmail_contact_datasource_impl_test.dart +++ /dev/null @@ -1,54 +0,0 @@ - -import 'package:contact/contact/model/tmail_contact.dart'; -import 'package:contact/data/datasource_impl/tmail_contact_datasource_impl.dart'; -import 'package:contact/data/network/contact_api.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:jmap_dart_client/jmap/core/id.dart'; -import 'package:mockito/mockito.dart'; -import 'package:mockito/annotations.dart'; -import 'package:model/autocomplete/auto_complete_pattern.dart'; - -import 'tmail_contact_datasource_impl_test.mocks.dart'; - -@GenerateMocks([ContactAPI]) -void main() { - final contact1 = TMailContact( - '2', - '', - '', - 'marie@otherdomain.tld' - ); - - final contact2 = TMailContact( - '4', - 'Marie', - 'Dupond', - 'mdupond@linagora.com' - ); - - group('tmail_contact_datasource_impl_test', () { - late ContactAPI contactAPI; - late TMailContactDataSourceImpl tmailContactDataSourceImpl; - - setUp(() { - contactAPI = MockContactAPI(); - tmailContactDataSourceImpl = TMailContactDataSourceImpl(contactAPI); - }); - - test('getAutoComplete should return success with valid data', () async { - when(contactAPI.getAutoComplete( - AutoCompletePattern( - word: 'marie', - accountId: AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6'))) - )).thenAnswer((_) async => [contact1, contact2]); - - final result = await tmailContactDataSourceImpl.getAutoComplete( - AutoCompletePattern( - word: 'marie', - accountId: AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6'))) - ); - expect(result, [contact1.toEmailAddress(), contact2.toEmailAddress()]); - }); - }); -} \ No newline at end of file diff --git a/lib/features/composer/data/repository/auto_complete_repository_impl.dart b/lib/features/composer/data/repository/auto_complete_repository_impl.dart index b2fe84ec5..b93645d63 100644 --- a/lib/features/composer/data/repository/auto_complete_repository_impl.dart +++ b/lib/features/composer/data/repository/auto_complete_repository_impl.dart @@ -1,9 +1,9 @@ -import 'package:contact/data/datasource/auto_complete_datasource.dart'; import 'package:core/utils/app_logger.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/autocomplete/auto_complete_pattern.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/auto_complete_repository.dart'; +import 'package:tmail_ui_user/features/contact/data/datasource/auto_complete_datasource.dart'; class AutoCompleteRepositoryImpl extends AutoCompleteRepository { diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 5286df0d0..89d5861d2 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -1002,11 +1002,19 @@ class ComposerController extends BaseController if (_getAllAutoCompleteInteractor != null) { return await _getAllAutoCompleteInteractor! .execute(autoCompletePattern) - .then((value) => handleAutoCompleteResultState( - resultState: value, - queryString: queryString, - onFailureCallback: (failure) => consumeState(Stream.value(Left(failure))), - ) + .then( + (value) => handleAutoCompleteResultState( + resultState: value, + queryString: queryString, + onFailureCallback: (failure) { + logError('ComposerController::getAutoCompleteSuggestion:onFailureCallback: $failure'); + consumeState(Stream.value(Left(failure))); + }, + ), + onError: (error) { + logError('ComposerController::getAutoCompleteSuggestion:onError: $error'); + consumeState(Stream.value(Left(error))); + }, ); } else if (_getDeviceContactSuggestionsInteractor != null) { return await _getDeviceContactSuggestionsInteractor! @@ -1022,12 +1030,20 @@ class ComposerController extends BaseController } else { return await _getAutoCompleteInteractor ?.execute(autoCompletePattern) - .then((value) => handleAutoCompleteResultState( - resultState: value, - queryString: queryString, - onFailureCallback: (failure) => consumeState(Stream.value(Left(failure))), - ) - ) ?? []; + .then( + (value) => handleAutoCompleteResultState( + resultState: value, + queryString: queryString, + onFailureCallback: (failure) { + logError('ComposerController::getAutoCompleteSuggestion:onFailureCallback: $failure'); + consumeState(Stream.value(Left(failure))); + }, + ), + onError: (error) { + logError('ComposerController::getAutoCompleteSuggestion:onError: $error'); + consumeState(Stream.value(Left(error))); + }, + ) ?? []; } } diff --git a/contact/lib/data/datasource/auto_complete_datasource.dart b/lib/features/contact/data/datasource/auto_complete_datasource.dart similarity index 100% rename from contact/lib/data/datasource/auto_complete_datasource.dart rename to lib/features/contact/data/datasource/auto_complete_datasource.dart diff --git a/contact/lib/data/datasource_impl/tmail_contact_datasource_impl.dart b/lib/features/contact/data/datasource_impl/tmail_contact_datasource_impl.dart similarity index 59% rename from contact/lib/data/datasource_impl/tmail_contact_datasource_impl.dart rename to lib/features/contact/data/datasource_impl/tmail_contact_datasource_impl.dart index 3d68792fa..ccac6e255 100644 --- a/contact/lib/data/datasource_impl/tmail_contact_datasource_impl.dart +++ b/lib/features/contact/data/datasource_impl/tmail_contact_datasource_impl.dart @@ -1,23 +1,23 @@ import 'package:contact/contact/model/tmail_contact.dart'; -import 'package:contact/data/datasource/auto_complete_datasource.dart'; -import 'package:contact/data/network/contact_api.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/autocomplete/auto_complete_pattern.dart'; +import 'package:tmail_ui_user/features/contact/data/datasource/auto_complete_datasource.dart'; +import 'package:tmail_ui_user/features/contact/data/network/contact_api.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class TMailContactDataSourceImpl extends AutoCompleteDataSource { final ContactAPI _contactAPI; + final ExceptionThrower _exceptionThrower; - TMailContactDataSourceImpl(this._contactAPI); + TMailContactDataSourceImpl(this._contactAPI, this._exceptionThrower); @override Future> getAutoComplete(AutoCompletePattern autoCompletePattern) { return Future.sync(() async { final listContacts = await _contactAPI.getAutoComplete(autoCompletePattern); return listContacts.map((contact) => contact.toEmailAddress()).toList(); - }).catchError((error) { - throw error; - }); + }).catchError(_exceptionThrower.throwException); } } \ No newline at end of file diff --git a/contact/lib/data/network/contact_api.dart b/lib/features/contact/data/network/contact_api.dart similarity index 100% rename from contact/lib/data/network/contact_api.dart rename to lib/features/contact/data/network/contact_api.dart diff --git a/lib/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart index 81061dbda..1d73baffa 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart @@ -1,25 +1,23 @@ -import 'package:contact/data/datasource_impl/tmail_contact_datasource_impl.dart'; -import 'package:contact/data/network/contact_api.dart'; import 'package:get/get.dart'; -import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; import 'package:tmail_ui_user/features/composer/data/repository/auto_complete_repository_impl.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/auto_complete_repository.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_all_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart'; +import 'package:tmail_ui_user/features/contact/data/datasource_impl/tmail_contact_datasource_impl.dart'; +import 'package:tmail_ui_user/features/contact/data/network/contact_api.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; -class TMailAutoCompleteBindings extends BaseBindings { - - @override - void bindingsController() {} - - @override - void bindingsDataSource() {} +class TMailAutoCompleteBindings extends InteractorsBindings { @override void bindingsDataSourceImpl() { - Get.put(TMailContactDataSourceImpl(Get.find())); + Get.put(TMailContactDataSourceImpl( + Get.find(), + Get.find(), + )); } @override @@ -40,4 +38,7 @@ class TMailAutoCompleteBindings extends BaseBindings { void bindingsRepositoryImpl() { Get.put(AutoCompleteRepositoryImpl({Get.find()})); } + + @override + void bindingsDataSource() {} } \ No newline at end of file diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index 6a5cca0d4..618453273 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:contact/data/network/contact_api.dart'; import 'package:core/core.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; @@ -10,6 +9,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_appauth/flutter_appauth.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/http/http_client.dart'; +import 'package:tmail_ui_user/features/contact/data/network/contact_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/mdn_api.dart'; import 'package:tmail_ui_user/features/home/data/network/session_api.dart'; diff --git a/test/features/contact/data/tmail_contact_datasource_impl_test.dart b/test/features/contact/data/tmail_contact_datasource_impl_test.dart new file mode 100644 index 000000000..c7562db4a --- /dev/null +++ b/test/features/contact/data/tmail_contact_datasource_impl_test.dart @@ -0,0 +1,58 @@ +import 'package:contact/contact/model/tmail_contact.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:mockito/mockito.dart'; +import 'package:mockito/annotations.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; +import 'package:tmail_ui_user/features/contact/data/datasource_impl/tmail_contact_datasource_impl.dart'; +import 'package:tmail_ui_user/features/contact/data/network/contact_api.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; + +import 'tmail_contact_datasource_impl_test.mocks.dart'; + +@GenerateMocks([ContactAPI, RemoteExceptionThrower]) +void main() { + final contact1 = TMailContact( + '2', + '', + '', + 'marie@otherdomain.tld', + ); + + final contact2 = TMailContact( + '4', + 'Marie', + 'Dupond', + 'mdupond@linagora.com', + ); + + group('tmail_contact_datasource_impl_test', () { + late ContactAPI contactAPI; + late RemoteExceptionThrower exceptionThrower; + late TMailContactDataSourceImpl tmailContactDataSourceImpl; + + setUp(() { + contactAPI = MockContactAPI(); + exceptionThrower = MockRemoteExceptionThrower(); + tmailContactDataSourceImpl = + TMailContactDataSourceImpl(contactAPI, exceptionThrower); + }); + + test('getAutoComplete should return success with valid data', () async { + when(contactAPI.getAutoComplete(AutoCompletePattern( + word: 'marie', + accountId: AccountId(Id( + '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')), + ))).thenAnswer((_) async => [contact1, contact2]); + + final result = + await tmailContactDataSourceImpl.getAutoComplete(AutoCompletePattern( + word: 'marie', + accountId: AccountId(Id( + '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')), + )); + expect(result, [contact1.toEmailAddress(), contact2.toEmailAddress()]); + }); + }); +}