diff --git a/server_settings/lib/server_settings/set/set_server_settings_method.dart b/server_settings/lib/server_settings/set/set_server_settings_method.dart new file mode 100644 index 000000000..a7241027d --- /dev/null +++ b/server_settings/lib/server_settings/set/set_server_settings_method.dart @@ -0,0 +1,43 @@ +import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; +import 'package:jmap_dart_client/http/converter/set/set_method_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/set_method.dart'; +import 'package:jmap_dart_client/jmap/core/request/request_invocation.dart'; +import 'package:server_settings/server_settings/capability_server_settings.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; + +class SetServerSettingsMethod extends SetMethod with OptionalUpdateSingleton{ + SetServerSettingsMethod(AccountId accountId) : super(accountId); + + @override + MethodName get methodName => MethodName('Settings/set'); + + @override + Set get requiredCapabilities => { + CapabilityIdentifier.jmapCore, + capabilityServerSettings, + }; + + @override + Map toJson() { + final val = { + 'accountId': const AccountIdConverter().toJson(accountId), + }; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('ifInState', ifInState?.value); + writeNotNull('update', updateSingleton + ?.map((id, update) => SetMethodPropertiesConverter().fromMapIdToJson(id, update.toJson()))); + + return val; + } + + @override + List get props => [accountId, ifInState, update]; +} \ No newline at end of file diff --git a/server_settings/lib/server_settings/set/set_server_settings_response.dart b/server_settings/lib/server_settings/set/set_server_settings_response.dart new file mode 100644 index 000000000..c38c83f17 --- /dev/null +++ b/server_settings/lib/server_settings/set/set_server_settings_response.dart @@ -0,0 +1,78 @@ +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_nullable_converter.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/error/set_error.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/method/response/set_response.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; + +class SetServerSettingsResponse extends SetResponse { + + SetServerSettingsResponse( + AccountId accountId, + { + State? newState, + State? oldState, + Map? created, + Map? updated, + Set? destroyed, + Map? notCreated, + Map? notUpdated, + Map? notDestroyed + } + ) : super( + accountId, + newState: newState, + oldState: oldState, + created: created, + updated: updated, + destroyed: destroyed, + notCreated: notCreated, + notUpdated: notUpdated, + notDestroyed: notDestroyed + ); + + static SetServerSettingsResponse deserialize(Map json) { + return SetServerSettingsResponse( + const AccountIdConverter().fromJson(json['accountId'] as String), + newState: const StateNullableConverter().fromJson(json['newState'] as String?), + oldState: const StateNullableConverter().fromJson(json['oldState'] as String?), + created: (json['created'] as Map?) + ?.map((key, value) => MapEntry( + const IdConverter().fromJson(key), + TMailServerSettings.fromJson(value as Map))), + updated: (json['updated'] as Map?) + ?.map((key, value) => MapEntry( + const IdConverter().fromJson(key), + value != null ? TMailServerSettings.fromJson(value as Map) : null)), + destroyed: (json['destroyed'] as List?) + ?.map((id) => const IdConverter().fromJson(id)).toSet(), + notCreated: (json['notCreated'] as Map?) + ?.map((key, value) => MapEntry( + const IdConverter().fromJson(key), + SetError.fromJson(value))), + notUpdated: (json['notUpdated'] as Map?) + ?.map((key, value) => MapEntry( + const IdConverter().fromJson(key), + SetError.fromJson(value))), + notDestroyed: (json['notDestroyed'] as Map?) + ?.map((key, value) => MapEntry( + const IdConverter().fromJson(key), + SetError.fromJson(value))), + ); + } + + @override + List get props => [ + oldState, + newState, + created, + updated, + destroyed, + notCreated, + notUpdated, + notDestroyed + ]; +} \ No newline at end of file diff --git a/server_settings/test/server_settings/set/set_server_settings_method_test.dart b/server_settings/test/server_settings/set/set_server_settings_method_test.dart new file mode 100644 index 000000000..678d57e63 --- /dev/null +++ b/server_settings/test/server_settings/set/set_server_settings_method_test.dart @@ -0,0 +1,127 @@ +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/set/set_server_settings_method.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; + +void main() { + final expectedResult = TMailServerSettings( + id: ServerSettingsIdExtension.serverSettingsIdSingleton, + settings: TMailServerSettingOptions(alwaysReadReceipts: true), + ); + + group('set 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/set", + { + "accountId": "123", + "newState": "1", + "updated": {"singleton": {}} + }, + "c0" + ], + [ + "Settings/get", + { + "accountId": "123", + "notFound": [], + "state": "1", + "list": [ + { + "id": "singleton", + "settings": {"read.receipts.always": "true"} + } + ] + }, + "c1" + ] + ] + }, + ), + data: { + "using": [ + "urn:ietf:params:jmap:core", + "com:linagora:params:jmap:settings" + ], + "methodCalls": [ + [ + "Settings/set", + { + "accountId": "123", + "update": { + "singleton": { + "id": "singleton", + "settings": {"read.receipts.always": "true"} + } + } + }, + "c0" + ], + [ + "Settings/get", + { + "accountId": "123", + "ids": ["singleton"] + }, + "c1" + ] + ] + }, + headers: { + "accept": "application/json;jmapVersion=rfc-8621", + "content-length": 503 + }, + ); + + final httpClient = HttpClient(dio); + final processingInvocation = ProcessingInvocation(); + final accountId = AccountId(Id('123')); + + final setServerSettingsMethod = SetServerSettingsMethod(accountId) + ..addUpdatesSingleton({ + ServerSettingsIdExtension.serverSettingsIdSingleton.id: expectedResult, + }); + final requestBuilder = + JmapRequestBuilder(httpClient, processingInvocation) + ..invocation(setServerSettingsMethod); + final getServerSettingsMethod = GetServerSettingsMethod(accountId) + ..addIds({ServerSettingsIdExtension.serverSettingsIdSingleton.id}); + final getServerSettingsInvocation = + requestBuilder.invocation(getServerSettingsMethod); + + // act + final response = await (requestBuilder + ..usings(setServerSettingsMethod.requiredCapabilities)) + .build() + .execute(); + + final setServerSettingsResponse = + response.parse( + getServerSettingsInvocation.methodCallId, + GetServerSettingsResponse.deserialize); + + // assert + expect(setServerSettingsResponse!.list.length, equals(1)); + expect(setServerSettingsResponse.list, containsAll({expectedResult})); + }); + }); +}