From 3b2d0227e66ee75ef742929082f9be4ac45418e9 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 15 Nov 2022 16:24:40 +0700 Subject: [PATCH] TF-1204 Add `FirebaseRegistration/get` method/response and write unit test --- .../get/firebase_registration_get_method.dart | 35 ++++++ .../firebase_registration_get_response.dart | 31 ++++++ fcm/lib/model/type_name.dart | 3 + fcm/lib/utils/fcm_utils.dart | 6 - fcm/lib/utils/firebase_utils.dart | 6 + fcm/pubspec.lock | 14 +++ fcm/pubspec.yaml | 3 + ...firebase_registration_get_method_test.dart | 104 ++++++++++++++++++ 8 files changed, 196 insertions(+), 6 deletions(-) create mode 100644 fcm/lib/method/get/firebase_registration_get_method.dart create mode 100644 fcm/lib/method/get/firebase_registration_get_response.dart delete mode 100644 fcm/lib/utils/fcm_utils.dart create mode 100644 fcm/lib/utils/firebase_utils.dart create mode 100644 fcm/test/method/firebase_registration_get_method_test.dart diff --git a/fcm/lib/method/get/firebase_registration_get_method.dart b/fcm/lib/method/get/firebase_registration_get_method.dart new file mode 100644 index 000000000..5f2298184 --- /dev/null +++ b/fcm/lib/method/get/firebase_registration_get_method.dart @@ -0,0 +1,35 @@ +import 'package:fcm/utils/firebase_utils.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/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'; + +part 'firebase_registration_get_method.g.dart'; + +@IdConverter() +@PropertiesConverter() +@JsonSerializable(explicitToJson: true) +class FirebaseRegistrationGetMethod extends GetMethodNoNeedAccountId { + + FirebaseRegistrationGetMethod() : super(); + + @override + MethodName get methodName => MethodName('FirebaseRegistration/get'); + + @override + Set get requiredCapabilities => { + CapabilityIdentifier.jmapCore, + FirebaseUtils.capabilityLinagoraFirebase, + }; + + @override + List get props => [methodName, ids, requiredCapabilities]; + + factory FirebaseRegistrationGetMethod.fromJson(Map json) => _$FirebaseRegistrationGetMethodFromJson(json); + + @override + Map toJson() => _$FirebaseRegistrationGetMethodToJson(this); +} \ No newline at end of file diff --git a/fcm/lib/method/get/firebase_registration_get_response.dart b/fcm/lib/method/get/firebase_registration_get_response.dart new file mode 100644 index 000000000..5cf04d62c --- /dev/null +++ b/fcm/lib/method/get/firebase_registration_get_response.dart @@ -0,0 +1,31 @@ +import 'package:fcm/model/firebase_registration.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/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/method/response/get_response.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'firebase_registration_get_response.g.dart'; + +@StateConverter() +@IdConverter() +@JsonSerializable(explicitToJson: true) +class FirebaseRegistrationGetResponse extends GetResponseNoAccountId { + + FirebaseRegistrationGetResponse( + List list, + List? notFound + ) : super(list, notFound); + + factory FirebaseRegistrationGetResponse.fromJson(Map json) => + _$FirebaseRegistrationGetResponseFromJson(json); + + static FirebaseRegistrationGetResponse deserialize(Map json) { + return FirebaseRegistrationGetResponse.fromJson(json); + } + + Map toJson() => _$FirebaseRegistrationGetResponseToJson(this); + + @override + List get props => [list, notFound]; +} \ No newline at end of file diff --git a/fcm/lib/model/type_name.dart b/fcm/lib/model/type_name.dart index fe752a71c..cae043199 100644 --- a/fcm/lib/model/type_name.dart +++ b/fcm/lib/model/type_name.dart @@ -2,6 +2,9 @@ import 'package:equatable/equatable.dart'; class TypeName with EquatableMixin { + static final mailboxType = TypeName('Mailbox'); + static final emailType = TypeName('Email'); + static final emailDelivery = TypeName('EmailDelivery'); final String value; diff --git a/fcm/lib/utils/fcm_utils.dart b/fcm/lib/utils/fcm_utils.dart deleted file mode 100644 index e9dae5fb9..000000000 --- a/fcm/lib/utils/fcm_utils.dart +++ /dev/null @@ -1,6 +0,0 @@ - -import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; - -class FCMUtils { - static final capabilityFCM = CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:firebase:push')); -} \ No newline at end of file diff --git a/fcm/lib/utils/firebase_utils.dart b/fcm/lib/utils/firebase_utils.dart new file mode 100644 index 000000000..4866fa0df --- /dev/null +++ b/fcm/lib/utils/firebase_utils.dart @@ -0,0 +1,6 @@ + +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; + +class FirebaseUtils { + static final capabilityLinagoraFirebase = CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:firebase:push')); +} \ No newline at end of file diff --git a/fcm/pubspec.lock b/fcm/pubspec.lock index d97b2c75f..a5bc31b73 100644 --- a/fcm/pubspec.lock +++ b/fcm/pubspec.lock @@ -235,6 +235,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.2.0" + http_mock_adapter: + dependency: "direct main" + description: + name: http_mock_adapter + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" http_multi_server: dependency: transitive description: @@ -328,6 +335,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + mockito: + dependency: "direct dev" + description: + name: mockito + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.0" package_config: dependency: transitive description: diff --git a/fcm/pubspec.yaml b/fcm/pubspec.yaml index 13eb6fbaa..ab0ec8064 100644 --- a/fcm/pubspec.yaml +++ b/fcm/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: url: https://github.com/linagora/jmap-dart-client.git ref: master + http_mock_adapter: 0.3.2 + dev_dependencies: flutter_test: sdk: flutter @@ -30,6 +32,7 @@ dev_dependencies: json_serializable: 6.2.0 + mockito: 5.2.0 flutter: uses-material-design: true \ No newline at end of file diff --git a/fcm/test/method/firebase_registration_get_method_test.dart b/fcm/test/method/firebase_registration_get_method_test.dart new file mode 100644 index 000000000..a228d5527 --- /dev/null +++ b/fcm/test/method/firebase_registration_get_method_test.dart @@ -0,0 +1,104 @@ +import 'package:dio/dio.dart'; +import 'package:fcm/method/get/firebase_registration_get_method.dart'; +import 'package:fcm/method/get/firebase_registration_get_response.dart'; +import 'package:fcm/model/device_client_id.dart'; +import 'package:fcm/model/firebase_expired_time.dart'; +import 'package:fcm/model/firebase_registration.dart'; +import 'package:fcm/model/firebase_registration_id.dart'; +import 'package:fcm/model/type_name.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/id.dart'; +import 'package:jmap_dart_client/jmap/core/utc_date.dart'; +import 'package:jmap_dart_client/jmap/jmap_request.dart'; + +void main() { + group('test to json firebase registration get method', () { + final expectFirebaseRegistration1 = FirebaseRegistration( + id: FirebaseRegistrationId(Id('e50b2c1d-9553-41a3-b0a7-a7d26b599ee1')), + deviceClientId: DeviceClientId('b37ff8001ca0'), + expires: FirebaseExpiredTime(UTCDate(DateTime.parse('2018-07-31T00:13:21Z'))), + types: [TypeName.mailboxType], + ); + + final expectFirebaseRegistration2 = FirebaseRegistration( + id: FirebaseRegistrationId(Id('f2d0aab5-e976-4e8b-ad4b-b380a5b987e4')), + deviceClientId: DeviceClientId('X8980fc'), + expires: FirebaseExpiredTime(UTCDate(DateTime.parse('2018-07-12T05:55:00Z'))), + types: [TypeName.mailboxType, TypeName.emailType, TypeName.emailDelivery], + ); + + test('firebase registration get 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", + "methodResponses": [ + [ + "FirebaseRegistration/get", + { + "notFound": [], + "list": [ + { + "id": "e50b2c1d-9553-41a3-b0a7-a7d26b599ee1", + "deviceClientId": "b37ff8001ca0", + "expires": "2018-07-31T00:13:21Z", + "types": ["Mailbox"] + }, + { + "id": "f2d0aab5-e976-4e8b-ad4b-b380a5b987e4", + "deviceClientId": "X8980fc", + "expires": "2018-07-12T05:55:00Z", + "types": ["Mailbox", "Email", "EmailDelivery"] + } + ] + }, + "c0" + ] + ] + }), + data: { + "using": [ + "urn:ietf:params:jmap:core", + "com:linagora:params:jmap:firebase:push" + ], + "methodCalls": [ + [ + "FirebaseRegistration/get", + {}, + "c0" + ] + ] + }, + headers: { + "accept": "application/json;jmapVersion=rfc-8621", + "content-type": "application/json; charset=utf-8", + "content-length": 133 + } + ); + + final httpClient = HttpClient(dio); + final processingInvocation = ProcessingInvocation(); + final requestBuilder = JmapRequestBuilder(httpClient, processingInvocation); + + final firebaseRegistrationGetMethod = FirebaseRegistrationGetMethod(); + final firebaseRegistrationGetInvocation = requestBuilder.invocation(firebaseRegistrationGetMethod); + final response = await (requestBuilder + ..usings(firebaseRegistrationGetMethod.requiredCapabilities)) + .build() + .execute(); + + final resultList = response.parse( + firebaseRegistrationGetInvocation.methodCallId, + FirebaseRegistrationGetResponse.deserialize + ); + + expect(resultList?.list.length, equals(2)); + expect(resultList?.list, containsAll([expectFirebaseRegistration1, expectFirebaseRegistration2])); + }); + }); +} \ No newline at end of file