diff --git a/.github/workflows/analyze-test.yaml b/.github/workflows/analyze-test.yaml index 05a824dc0..5ac5f2ca1 100644 --- a/.github/workflows/analyze-test.yaml +++ b/.github/workflows/analyze-test.yaml @@ -21,6 +21,7 @@ jobs: - forward - rule_filter - fcm + - email_recovery fail-fast: false steps: diff --git a/email_recovery/lib/email_recovery/converter/email_recovery_action_id_converter.dart b/email_recovery/lib/email_recovery/converter/email_recovery_action_id_converter.dart deleted file mode 100644 index 751fe4915..000000000 --- a/email_recovery/lib/email_recovery/converter/email_recovery_action_id_converter.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; -import 'package:jmap_dart_client/jmap/core/id.dart'; -import 'package:json_annotation/json_annotation.dart'; - -class EmailRecoveryActionIdConverter implements JsonConverter { - const EmailRecoveryActionIdConverter(); - - @override - EmailRecoveryActionId fromJson(String json) => EmailRecoveryActionId(Id(json)); - - @override - String toJson(EmailRecoveryActionId object) => object.id.value; -} \ No newline at end of file diff --git a/email_recovery/lib/email_recovery/converter/email_recovery_action_id_nullable_converter.dart b/email_recovery/lib/email_recovery/converter/email_recovery_action_id_nullable_converter.dart new file mode 100644 index 000000000..150a51390 --- /dev/null +++ b/email_recovery/lib/email_recovery/converter/email_recovery_action_id_nullable_converter.dart @@ -0,0 +1,13 @@ +import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:json_annotation/json_annotation.dart'; + +class EmailRecoveryActionIdNullableConverter implements JsonConverter { + const EmailRecoveryActionIdNullableConverter(); + + @override + EmailRecoveryActionId? fromJson(String? json) => json != null ? EmailRecoveryActionId(Id(json)) : null; + + @override + String? toJson(EmailRecoveryActionId? object) => object?.id.value; +} \ No newline at end of file diff --git a/email_recovery/lib/email_recovery/converter/status_converter.dart b/email_recovery/lib/email_recovery/converter/status_converter.dart deleted file mode 100644 index b9ade979b..000000000 --- a/email_recovery/lib/email_recovery/converter/status_converter.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:email_recovery/email_recovery/status.dart'; -import 'package:json_annotation/json_annotation.dart'; - -class StatusConverter implements JsonConverter { - const StatusConverter(); - - @override - Status fromJson(String json) => Status(json); - - @override - String toJson(Status object) => object.value; -} \ No newline at end of file diff --git a/email_recovery/lib/email_recovery/email_recovery_action.dart b/email_recovery/lib/email_recovery/email_recovery_action.dart index 63413277c..4433078a5 100644 --- a/email_recovery/lib/email_recovery/email_recovery_action.dart +++ b/email_recovery/lib/email_recovery/email_recovery_action.dart @@ -1,9 +1,8 @@ -import 'package:email_recovery/email_recovery/converter/status_converter.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; -import 'package:email_recovery/email_recovery/status.dart'; +import 'package:email_recovery/email_recovery/email_recovery_status.dart.dart'; import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; -import 'package:email_recovery/email_recovery/converter/email_recovery_action_id_converter.dart'; +import 'package:email_recovery/email_recovery/converter/email_recovery_action_id_nullable_converter.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/http/converter/utc_date_nullable_converter.dart'; @@ -11,10 +10,9 @@ import 'package:jmap_dart_client/http/converter/unsigned_int_nullable_converter. part 'email_recovery_action.g.dart'; -@EmailRecoveryActionIdConverter() +@EmailRecoveryActionIdNullableConverter() @UTCDateNullableConverter() @UnsignedIntNullableConverter() -@StatusConverter() @JsonSerializable(explicitToJson: true, includeIfNull: false) class EmailRecoveryAction with EquatableMixin { final EmailRecoveryActionId? id; @@ -28,7 +26,7 @@ class EmailRecoveryAction with EquatableMixin { final List? recipients; final UnsignedInt? successfulRestoreCount; final UnsignedInt? errorRestoreCount; - final Status? status; + final EmailRecoveryStatus? status; EmailRecoveryAction({ this.id, @@ -50,36 +48,7 @@ class EmailRecoveryAction with EquatableMixin { Map toJson() => _$EmailRecoveryActionToJson(this); - EmailRecoveryAction copyWith({ - EmailRecoveryActionId? id, - UTCDate? deletedBefore, - UTCDate? deletedAfter, - UTCDate? receivedBefore, - UTCDate? receivedAfter, - bool? hasAttachment, - String? subject, - String? sender, - List? recipients, - UnsignedInt? successfulRestoreCount, - UnsignedInt? errorRestoreCount, - Status? status, - }) { - return EmailRecoveryAction( - id: id ?? this.id, - deletedBefore: deletedBefore ?? this.deletedBefore, - deletedAfter: deletedAfter ?? this.deletedAfter, - receivedBefore: receivedBefore ?? this.receivedBefore, - receivedAfter: receivedAfter ?? this.receivedAfter, - hasAttachment: hasAttachment ?? this.hasAttachment, - subject: subject ?? this.subject, - sender: sender ?? this.sender, - recipients: recipients ?? this.recipients, - successfulRestoreCount: successfulRestoreCount ?? this.successfulRestoreCount, - errorRestoreCount: errorRestoreCount ?? this.errorRestoreCount, - status: status ?? this.status, - ); - } - + @override List get props => [ id, deletedBefore, diff --git a/email_recovery/lib/email_recovery/email_recovery_action_id.dart b/email_recovery/lib/email_recovery/email_recovery_action_id.dart index 0875a58ac..4fc8241a3 100644 --- a/email_recovery/lib/email_recovery/email_recovery_action_id.dart +++ b/email_recovery/lib/email_recovery/email_recovery_action_id.dart @@ -1,9 +1,7 @@ -import 'package:email_recovery/email_recovery/converter/email_recovery_action_id_converter.dart'; import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/http/converter/id_converter.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; -@EmailRecoveryActionIdConverter() @IdConverter() class EmailRecoveryActionId with EquatableMixin { final Id id; diff --git a/email_recovery/lib/email_recovery/email_recovery_status.dart.dart b/email_recovery/lib/email_recovery/email_recovery_status.dart.dart new file mode 100644 index 000000000..e58330fe8 --- /dev/null +++ b/email_recovery/lib/email_recovery/email_recovery_status.dart.dart @@ -0,0 +1,7 @@ +enum EmailRecoveryStatus { + waiting, + inProgress, + completed, + failed, + canceled, +} \ No newline at end of file diff --git a/email_recovery/lib/email_recovery/get/get_email_recovery_action_response.dart b/email_recovery/lib/email_recovery/get/get_email_recovery_action_response.dart index 2a6bad130..75af66b42 100644 --- a/email_recovery/lib/email_recovery/get/get_email_recovery_action_response.dart +++ b/email_recovery/lib/email_recovery/get/get_email_recovery_action_response.dart @@ -4,7 +4,6 @@ import 'package:jmap_dart_client/jmap/core/method/response/get_response.dart'; import 'package:jmap_dart_client/http/converter/id_converter.dart'; import 'package:json_annotation/json_annotation.dart'; - part 'get_email_recovery_action_response.g.dart'; @IdConverter() diff --git a/email_recovery/lib/email_recovery/set/set_email_recovery_action_method.dart b/email_recovery/lib/email_recovery/set/set_email_recovery_action_method.dart index 18f8aeb9f..70a60b3d5 100644 --- a/email_recovery/lib/email_recovery/set/set_email_recovery_action_method.dart +++ b/email_recovery/lib/email_recovery/set/set_email_recovery_action_method.dart @@ -6,7 +6,7 @@ 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'; -class SetEmailRecoveryActionMethod extends SetMethodNoNeedAccountId with OptionalCreate { +class SetEmailRecoveryActionMethod extends SetMethodNoNeedAccountId { SetEmailRecoveryActionMethod() : super(); @override diff --git a/email_recovery/lib/email_recovery/status.dart b/email_recovery/lib/email_recovery/status.dart deleted file mode 100644 index fe2313961..000000000 --- a/email_recovery/lib/email_recovery/status.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:equatable/equatable.dart'; - -class Status with EquatableMixin { - static final waiting = Status('waiting'); - static final inProgress = Status('inProgress'); - static final completed = Status('completed'); - static final failed = Status('failed'); - static final canceled = Status('canceled'); - - final String value; - - Status(this.value); - - @override - List get props => [value]; -} \ No newline at end of file diff --git a/email_recovery/test/method/get_email_recovery_action_method_test.dart b/email_recovery/test/method/get_email_recovery_action_method_test.dart index d7e725128..42e383ce6 100644 --- a/email_recovery/test/method/get_email_recovery_action_method_test.dart +++ b/email_recovery/test/method/get_email_recovery_action_method_test.dart @@ -1,9 +1,9 @@ import 'package:dio/dio.dart'; import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; +import 'package:email_recovery/email_recovery/email_recovery_status.dart.dart'; import 'package:email_recovery/email_recovery/get/get_email_recovery_action_method.dart'; import 'package:email_recovery/email_recovery/get/get_email_recovery_action_response.dart'; -import 'package:email_recovery/email_recovery/status.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:http_mock_adapter/src/adapters/dio_adapter.dart'; @@ -14,7 +14,7 @@ void main() { group('test to json email recovery action get method', () { final expectEmailRecoveryAction = EmailRecoveryAction( id: EmailRecoveryActionId(Id('2034-495-05857-57abcd-0876664')), - status: Status.inProgress + status: EmailRecoveryStatus.inProgress, ); test('email recovery action get method and response parsing', () async { diff --git a/email_recovery/test/method/set_email_recovery_action_method_test.dart b/email_recovery/test/method/set_email_recovery_action_method_test.dart index 18118962e..ba4e6a2ce 100644 --- a/email_recovery/test/method/set_email_recovery_action_method_test.dart +++ b/email_recovery/test/method/set_email_recovery_action_method_test.dart @@ -1,12 +1,15 @@ import 'package:dio/dio.dart'; import 'package:email_recovery/email_recovery/email_recovery_action.dart'; import 'package:email_recovery/email_recovery/email_recovery_action_id.dart'; +import 'package:email_recovery/email_recovery/email_recovery_status.dart.dart'; import 'package:email_recovery/email_recovery/set/set_email_recovery_action_method.dart'; import 'package:email_recovery/email_recovery/set/set_email_recovery_action_response.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/core/error/set_error.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/patch_object.dart'; import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; @@ -106,4 +109,94 @@ void main() { ); }); }); + + group('test to json email recovery action set method not updated error', () { + final updateRequestTaskId = Id('2034-495-05857-57abcd-0876664'); + final notUpdatedError = SetError( + SetError.notFound, + description: 'Task not found' + ); + + final expectNotUpdatedError = {updateRequestTaskId: notUpdatedError}; + + test('email recovery action set method and response parsing', () async { + 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": "2c9f1b12-b35a-43e6-9af2-0106fb53a943", + "methodResponses": [ + [ + "EmailRecoveryAction/set", + { + "notUpdated": { + "2034-495-05857-57abcd-0876664": { + "type": "notFound", + "description": "Task not found" + } + } + }, + "c0" + ] + ] + }), + data: { + "using": [ + "urn:ietf:params:jmap:core", + "com:linagora:params:jmap:messages:vault" + ], + "methodCalls": [ + [ + "EmailRecoveryAction/set", + { + "update": { + "2034-495-05857-57abcd-0876664": { + "status": "canceled" + } + } + }, + "c0" + ] + ] + }, + headers: { + "accept": "application/json;jmapVersion=rfc-8621", + "content-length": 256 + } + ); + + final pathObjectEmailRecoveryAction = PatchObject( + EmailRecoveryAction( + status: EmailRecoveryStatus.canceled + ).toJson() + ); + + final emailRecoveryActionSetMethod = SetEmailRecoveryActionMethod() + ..addUpdates({updateRequestTaskId: pathObjectEmailRecoveryAction}); + + final httpClient = HttpClient(dio); + final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation()); + final emailRecoveryActionSetInvocation = requestBuilder.invocation(emailRecoveryActionSetMethod); + final response = await (requestBuilder + ..usings(emailRecoveryActionSetMethod.requiredCapabilities)) + .build() + .execute(); + + final emailRecoveryActionSetResponse = response.parse( + emailRecoveryActionSetInvocation.methodCallId, + SetEmailRecoveryActionResponse.deserialize + ); + + expect( + emailRecoveryActionSetResponse!.notUpdated![updateRequestTaskId]!.type, + equals(expectNotUpdatedError[updateRequestTaskId]!.type) + ); + expect( + emailRecoveryActionSetResponse.notUpdated![updateRequestTaskId]!.description, + equals(expectNotUpdatedError[updateRequestTaskId]!.description) + ); + }); + }); } \ No newline at end of file diff --git a/prebuild.sh b/prebuild.sh index 9ad7105a2..a2365b17a 100644 --- a/prebuild.sh +++ b/prebuild.sh @@ -26,6 +26,9 @@ flutter pub get && dart run build_runner build --delete-conflicting-outputs cd ../fcm flutter pub get && dart run build_runner build --delete-conflicting-outputs +cd ../email_recovery +flutter pub get && dart run build_runner build --delete-conflicting-outputs + cd .. flutter pub get \ && dart run build_runner build --delete-conflicting-outputs \ diff --git a/pubspec.lock b/pubspec.lock index 183a5c8e1..b9f7426d2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -393,6 +393,13 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + email_recovery: + dependency: "direct main" + description: + path: email_recovery + relative: true + source: path + version: "1.0.0+1" enough_html_editor: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7537b9453..c6db4b36d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,6 +45,9 @@ dependencies: fcm: path: fcm + email_recovery: + path: email_recovery + ### Dependencies from git ### rich_text_composer: git: