diff --git a/server_settings/lib/server_settings/get/get_server_settings_method.dart b/server_settings/lib/server_settings/get/get_server_settings_method.dart new file mode 100644 index 000000000..c86446837 --- /dev/null +++ b/server_settings/lib/server_settings/get/get_server_settings_method.dart @@ -0,0 +1,40 @@ +import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; +import 'package:jmap_dart_client/http/converter/id_converter.dart'; +import 'package:jmap_dart_client/http/converter/properties_converter.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; +import 'package:jmap_dart_client/jmap/core/method/request/get_method.dart'; +import 'package:jmap_dart_client/jmap/core/request/request_invocation.dart'; +import 'package:jmap_dart_client/jmap/core/request/result_reference.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:server_settings/server_settings/capability_server_settings.dart'; + +part 'get_server_settings_method.g.dart'; + +@JsonSerializable( + explicitToJson: true, + converters: [ + IdConverter(), + AccountIdConverter(), + PropertiesConverter() + ]) +class GetServerSettingsMethod extends GetMethod { + GetServerSettingsMethod(AccountId accountId) : super(accountId); + + @override + MethodName get methodName => MethodName('Settings/get'); + + @override + Set get requiredCapabilities => { + CapabilityIdentifier.jmapCore, + capabilityServerSettings, + }; + + @override + List get props => [methodName, accountId, ids, requiredCapabilities]; + + factory GetServerSettingsMethod.fromJson(Map json) => _$GetServerSettingsMethodFromJson(json); + + @override + Map toJson() => _$GetServerSettingsMethodToJson(this); +} \ No newline at end of file diff --git a/server_settings/lib/server_settings/get/get_server_settings_response.dart b/server_settings/lib/server_settings/get/get_server_settings_response.dart new file mode 100644 index 000000000..7f3d4f519 --- /dev/null +++ b/server_settings/lib/server_settings/get/get_server_settings_response.dart @@ -0,0 +1,33 @@ + +import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; +import 'package:jmap_dart_client/http/converter/id_converter.dart'; +import 'package:jmap_dart_client/http/converter/state_converter.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/method/response/get_response.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; + +part 'get_server_settings_response.g.dart'; + +@JsonSerializable(converters: [ + StateConverter(), + AccountIdConverter(), + IdConverter() +]) +class GetServerSettingsResponse extends GetResponse { + GetServerSettingsResponse(AccountId accountId, State state, List list, List? notFound) : super(accountId, state, list, notFound); + + factory GetServerSettingsResponse.fromJson(Map json) => + _$GetServerSettingsResponseFromJson(json); + + static GetServerSettingsResponse deserialize(Map json) { + return GetServerSettingsResponse.fromJson(json); + } + + Map toJson() => _$GetServerSettingsResponseToJson(this); + + @override + List get props => [accountId, state, list, notFound]; +} \ No newline at end of file diff --git a/server_settings/test/server_settings/get/get_server_settings_method_test.dart b/server_settings/test/server_settings/get/get_server_settings_method_test.dart new file mode 100644 index 000000000..59ea26729 --- /dev/null +++ b/server_settings/test/server_settings/get/get_server_settings_method_test.dart @@ -0,0 +1,94 @@ +import 'package:dio/dio.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:jmap_dart_client/http/http_client.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/jmap_request.dart'; +import 'package:server_settings/server_settings/get/get_server_settings_method.dart'; +import 'package:server_settings/server_settings/get/get_server_settings_response.dart'; +import 'package:server_settings/server_settings/server_settings_id.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; + +void main() { + final expectedResult = TMailServerSettings( + id: ServerSettingsIdExtension.serverSettingsIdSingleton, + settings: TMailServerSettingOptions(alwaysReadReceipts: true), + ); + + group('get server settings method', () { + test('should return expected result', () async { + // arrange + final baseOption = BaseOptions(method: 'POST'); + final dio = Dio(baseOption)..options.baseUrl = 'http://domain.com/jmap'; + final dioAdapter = DioAdapter(dio: dio); + dioAdapter.onPost( + '', + (server) => server.reply(200, { + "sessionState": "abcdefghij", + "methodResponses": [ + [ + "Settings/get", + { + "accountId": "123", + "notFound": [], + "state": "1", + "list": [ + { + "id": "singleton", + "settings": {"read.receipts.always": "true"} + } + ] + }, + "c0" + ] + ] + }), + data: { + "using": [ + "urn:ietf:params:jmap:core", + "com:linagora:params:jmap:settings" + ], + "methodCalls": [ + [ + "Settings/get", + { + "accountId": "123", + "ids": ["singleton"] + }, + "c0" + ] + ] + }, + headers: { + "accept": "application/json;jmapVersion=rfc-8621", + "content-length": 233 + }, + ); + + final httpClient = HttpClient(dio); + final processingInvocation = ProcessingInvocation(); + final requestBuilder = + JmapRequestBuilder(httpClient, processingInvocation); + final accountId = AccountId(Id('123')); + + final getServerSettingsMethod = GetServerSettingsMethod(accountId) + ..addIds({ServerSettingsIdExtension.serverSettingsIdSingleton.id}); + final getServerSettingsInvocation = requestBuilder.invocation(getServerSettingsMethod); + + // act + final response = await (requestBuilder + ..usings(getServerSettingsMethod.requiredCapabilities)) + .build() + .execute(); + + final resultList = response.parse( + getServerSettingsInvocation.methodCallId, + GetServerSettingsResponse.deserialize); + + // assert + expect(resultList?.list.length, equals(1)); + expect(resultList?.list, containsAll({expectedResult})); + }); + }); +}