diff --git a/lib/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart b/lib/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart new file mode 100644 index 000000000..66010effa --- /dev/null +++ b/lib/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart @@ -0,0 +1,28 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; +import 'package:tmail_ui_user/features/server_settings/data/datasource/server_settings_data_source.dart'; +import 'package:tmail_ui_user/features/server_settings/data/network/server_settings_api.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class RemoteServerSettingsDataSourceImpl implements ServerSettingsDataSource { + final ServerSettingsAPI _serverSettingsAPI; + final ExceptionThrower _exceptionThrower; + + RemoteServerSettingsDataSourceImpl( + this._serverSettingsAPI, + this._exceptionThrower); + + @override + Future getServerSettings(AccountId accountId) { + return Future.sync(() async { + return await _serverSettingsAPI.getServerSettings(accountId); + }).catchError(_exceptionThrower.throwException); + } + + @override + Future updateServerSettings(AccountId accountId, TMailServerSettings serverSettings) { + return Future.sync(() async { + return await _serverSettingsAPI.updateServerSettings(accountId, serverSettings); + }).catchError(_exceptionThrower.throwException); + } +} \ No newline at end of file diff --git a/test/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl_test.dart b/test/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl_test.dart new file mode 100644 index 000000000..bd2ef0ad4 --- /dev/null +++ b/test/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl_test.dart @@ -0,0 +1,83 @@ +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/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:server_settings/server_settings/server_settings_id.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; +import 'package:tmail_ui_user/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart'; +import 'package:tmail_ui_user/features/server_settings/data/network/server_settings_api.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/exceptions/server_settings_exception.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; + +import 'remote_server_settings_data_source_impl_test.mocks.dart'; + +@GenerateNiceMocks([MockSpec()]) +void main() { + final serverSettings = TMailServerSettings( + id: ServerSettingsId(id: Id('123')), + settings: TMailServerSettingOptions(alwaysReadReceipts: true), + ); + final accountId = AccountId(Id('321')); + final serverSettingsAPI = MockServerSettingsAPI(); + final remoteServerSettingsDataSource = RemoteServerSettingsDataSourceImpl( + serverSettingsAPI, + RemoteExceptionThrower(), + ); + + group('remote server settings data source', () { + group('get server settings', () { + test('should return value when ServerSettingsAPI returns value',() async { + // arrange + when(serverSettingsAPI.getServerSettings(any)) + .thenAnswer((_) async => serverSettings); + + // act + final result = await remoteServerSettingsDataSource + .getServerSettings(accountId); + + // assert + expect(result, serverSettings); + }); + + test('should rethrow exception when ServerSettingsAPI throws exception',() async { + // arrange + when(serverSettingsAPI.getServerSettings(any)) + .thenThrow(NotFoundServerSettingsException()); + + // assert + expect( + () => remoteServerSettingsDataSource.getServerSettings(accountId), + throwsA(const TypeMatcher())); + }); + }); + + group('update server settings', () { + test('should return value when ServerSettingsAPI returns value',() async { + // arrange + when(serverSettingsAPI.updateServerSettings(any, any)) + .thenAnswer((_) async => serverSettings); + + // act + final result = await remoteServerSettingsDataSource + .updateServerSettings(accountId, serverSettings); + + // assert + expect(result, serverSettings); + }); + + test('should rethrow exception when ServerSettingsAPI throws exception',() async { + // arrange + when(serverSettingsAPI.updateServerSettings(any, any)) + .thenThrow(CanNotUpdateServerSettingsException()); + + // assert + expect( + () => remoteServerSettingsDataSource.updateServerSettings( + accountId, + serverSettings), + throwsA(const TypeMatcher())); + }); + }); + }); +} \ No newline at end of file