From 34b6446ee155ba466944b8f57076df40eee40460 Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Sun, 7 Aug 2022 08:02:07 +0700 Subject: [PATCH] change model and write unit test --- .../converter/rule_filter_id_coverter.dart | 13 ++ .../lib/converter/rule_id_converter.dart | 4 +- .../converter/rule_id_nullable_converter.dart | 14 ++ .../lib/get/get_rule_filter_method.dart | 3 + .../lib/get/get_rule_filter_response.dart | 5 +- rule_filter/lib/rule_action.dart | 6 +- rule_filter/lib/rule_append_in.dart | 5 +- rule_filter/lib/rule_condition.dart | 13 +- rule_filter/lib/rule_filter.dart | 23 ++- rule_filter/lib/rule_filter_id.dart | 31 ++++ rule_filter/lib/rule_id.dart | 14 +- .../lib/set/set_rule_filter_method.dart | 35 +++- rule_filter/lib/tmail_rule.dart | 34 ++-- rule_filter/pubspec.yaml | 16 +- .../get_rule_filter_method_test.dart | 126 ++++++++++++++ .../set_rule_filter_method_test.dart | 154 ++++++++++++++++++ rule_filter/test/rule_filter_test.dart | 8 - 17 files changed, 430 insertions(+), 74 deletions(-) create mode 100644 rule_filter/lib/converter/rule_filter_id_coverter.dart create mode 100644 rule_filter/lib/converter/rule_id_nullable_converter.dart create mode 100644 rule_filter/lib/rule_filter_id.dart create mode 100644 rule_filter/test/rule_filter/get_rule_filter_method_test.dart create mode 100644 rule_filter/test/rule_filter/set_rule_filter_method_test.dart delete mode 100644 rule_filter/test/rule_filter_test.dart diff --git a/rule_filter/lib/converter/rule_filter_id_coverter.dart b/rule_filter/lib/converter/rule_filter_id_coverter.dart new file mode 100644 index 000000000..a230869e8 --- /dev/null +++ b/rule_filter/lib/converter/rule_filter_id_coverter.dart @@ -0,0 +1,13 @@ +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:rule_filter/rule_filter_id.dart'; + +class RuleFilterIdConverter implements JsonConverter { + const RuleFilterIdConverter(); + + @override + RuleFilterId fromJson(String json) => RuleFilterId(id: Id(json)); + + @override + String toJson(RuleFilterId object) => object.id.value; +} diff --git a/rule_filter/lib/converter/rule_id_converter.dart b/rule_filter/lib/converter/rule_id_converter.dart index 07f4a660a..e7a9fe5c1 100644 --- a/rule_filter/lib/converter/rule_id_converter.dart +++ b/rule_filter/lib/converter/rule_id_converter.dart @@ -6,8 +6,8 @@ class RuleIdConverter implements JsonConverter { const RuleIdConverter(); @override - RuleId fromJson(String json) => RuleId(Id(json)); + RuleId fromJson(String json) => RuleId(id: Id(json)); @override String toJson(RuleId object) => object.id.value; -} \ No newline at end of file +} diff --git a/rule_filter/lib/converter/rule_id_nullable_converter.dart b/rule_filter/lib/converter/rule_id_nullable_converter.dart new file mode 100644 index 000000000..409e18212 --- /dev/null +++ b/rule_filter/lib/converter/rule_id_nullable_converter.dart @@ -0,0 +1,14 @@ +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:rule_filter/rule_id.dart'; + +class RuleIdNullableConverter implements JsonConverter { + const RuleIdNullableConverter(); + + @override + RuleId? fromJson(String? json) => json != null ? RuleId(id: Id(json)) : null; + + @override + String? toJson(RuleId? object) => object?.id.value; +} diff --git a/rule_filter/lib/get/get_rule_filter_method.dart b/rule_filter/lib/get/get_rule_filter_method.dart index 531fb7519..6eb5310a0 100644 --- a/rule_filter/lib/get/get_rule_filter_method.dart +++ b/rule_filter/lib/get/get_rule_filter_method.dart @@ -8,10 +8,13 @@ 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:rule_filter/capability_rule_filter.dart'; +import 'package:rule_filter/converter/rule_id_converter.dart'; +import 'package:rule_filter/rule_id.dart'; part 'get_rule_filter_method.g.dart'; @IdConverter() +@RuleIdConverter() @AccountIdConverter() @PropertiesConverter() @JsonSerializable(explicitToJson: true) diff --git a/rule_filter/lib/get/get_rule_filter_response.dart b/rule_filter/lib/get/get_rule_filter_response.dart index 1306d22ab..2df037d52 100644 --- a/rule_filter/lib/get/get_rule_filter_response.dart +++ b/rule_filter/lib/get/get_rule_filter_response.dart @@ -6,6 +6,7 @@ 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:rule_filter/rule_filter.dart'; import 'package:rule_filter/tmail_rule.dart'; part 'get_rule_filter_response.g.dart'; @@ -14,8 +15,8 @@ part 'get_rule_filter_response.g.dart'; @AccountIdConverter() @IdConverter() @JsonSerializable() -class GetRuleFilterResponse extends GetResponse { - GetRuleFilterResponse(AccountId accountId, State state, List list, List? notFound) : super(accountId, state, list, notFound); +class GetRuleFilterResponse extends GetResponse { + GetRuleFilterResponse(AccountId accountId, State state, List list, List? notFound) : super(accountId, state, list, notFound); factory GetRuleFilterResponse.fromJson(Map json) => _$GetRuleFilterResponseFromJson(json); diff --git a/rule_filter/lib/rule_action.dart b/rule_filter/lib/rule_action.dart index 1be1fe968..bc4a9b750 100644 --- a/rule_filter/lib/rule_action.dart +++ b/rule_filter/lib/rule_action.dart @@ -4,11 +4,13 @@ import 'package:rule_filter/rule_append_in.dart'; part 'rule_action.g.dart'; -@JsonSerializable() +@JsonSerializable(explicitToJson: true) class RuleAction with EquatableMixin { final RuleAppendIn appendIn; - RuleAction(this.appendIn); + RuleAction({ + required this.appendIn, + }); @override List get props => [ diff --git a/rule_filter/lib/rule_append_in.dart b/rule_filter/lib/rule_append_in.dart index d2aed3473..26cc8f3bf 100644 --- a/rule_filter/lib/rule_append_in.dart +++ b/rule_filter/lib/rule_append_in.dart @@ -10,7 +10,9 @@ part 'rule_append_in.g.dart'; class RuleAppendIn with EquatableMixin { final List mailboxIds; - RuleAppendIn(this.mailboxIds); + RuleAppendIn({ + required this.mailboxIds, + }); @override List get props => [ @@ -21,5 +23,4 @@ class RuleAppendIn with EquatableMixin { _$RuleAppendInFromJson(json); Map toJson() => _$RuleAppendInToJson(this); - } diff --git a/rule_filter/lib/rule_condition.dart b/rule_filter/lib/rule_condition.dart index af26ad959..aa008b2b9 100644 --- a/rule_filter/lib/rule_condition.dart +++ b/rule_filter/lib/rule_condition.dart @@ -3,7 +3,6 @@ import 'package:json_annotation/json_annotation.dart'; part 'rule_condition.g.dart'; -@JsonEnum() enum Field { @JsonValue('from') from, @@ -17,7 +16,6 @@ enum Field { subject, } -@JsonEnum() enum Comparator { @JsonValue('contains') contains, @@ -37,11 +35,11 @@ class RuleCondition extends FilterCondition { final String value; - RuleCondition( - this.field, - this.comparator, - this.value, - ); + RuleCondition({ + required this.field, + required this.comparator, + required this.value, + }); @override List get props => [ @@ -55,5 +53,4 @@ class RuleCondition extends FilterCondition { @override Map toJson() => _$RuleConditionToJson(this); - } diff --git a/rule_filter/lib/rule_filter.dart b/rule_filter/lib/rule_filter.dart index 8d9270511..04229cb81 100644 --- a/rule_filter/lib/rule_filter.dart +++ b/rule_filter/lib/rule_filter.dart @@ -1,17 +1,21 @@ import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:json_annotation/json_annotation.dart'; -import 'package:rule_filter/converter/rule_id_converter.dart'; -import 'package:rule_filter/rule_id.dart'; +import 'package:rule_filter/converter/rule_filter_id_coverter.dart'; +import 'package:rule_filter/rule_filter_id.dart'; +import 'package:rule_filter/tmail_rule.dart'; part 'rule_filter.g.dart'; -@RuleIdConverter() +@RuleFilterIdConverter() @JsonSerializable() class RuleFilter extends Filter { + final RuleFilterId id; + final List rules; - final RuleId id; - - RuleFilter(this.id); + RuleFilter({ + required this.id, + required this.rules, + }); factory RuleFilter.fromJson(Map json) => _$RuleFilterFromJson(json); @@ -20,5 +24,8 @@ class RuleFilter extends Filter { Map toJson() => _$RuleFilterToJson(this); @override - List get props => [id]; -} \ No newline at end of file + List get props => [ + id, + rules, + ]; +} diff --git a/rule_filter/lib/rule_filter_id.dart b/rule_filter/lib/rule_filter_id.dart new file mode 100644 index 000000000..57abe32b1 --- /dev/null +++ b/rule_filter/lib/rule_filter_id.dart @@ -0,0 +1,31 @@ +import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/http/converter/id_converter.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:rule_filter/converter/rule_filter_id_coverter.dart'; + +enum RuleFilterIdType { + singleton('singleton'); + + const RuleFilterIdType(this.value); + + final String value; +} + +@RuleFilterIdConverter() +@IdConverter() +@JsonSerializable() +class RuleFilterId with EquatableMixin { + final Id id; + + RuleFilterId({ + required this.id, + }); + + @override + List get props => [id]; +} + +extension RuleFilterIdSingleton on RuleFilterId { + static RuleFilterId get ruleFilterIdSingleton => RuleFilterId(id: Id(RuleFilterIdType.singleton.value)); +} diff --git a/rule_filter/lib/rule_id.dart b/rule_filter/lib/rule_id.dart index e37e4785e..580efa7f7 100644 --- a/rule_filter/lib/rule_id.dart +++ b/rule_filter/lib/rule_id.dart @@ -3,23 +3,15 @@ import 'package:jmap_dart_client/http/converter/id_converter.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:json_annotation/json_annotation.dart'; -enum RuleIdType { - singleton('singleton'); - const RuleIdType(this.value); - final String value; -} - @JsonSerializable() @IdConverter() class RuleId with EquatableMixin { final Id id; - RuleId(this.id); + RuleId({ + required this.id, + }); @override List get props => [id]; } - -extension RuleIdSingleton on RuleId { - static get ruleIdSingleton => RuleId(Id(RuleIdType.singleton.value)); -} \ No newline at end of file diff --git a/rule_filter/lib/set/set_rule_filter_method.dart b/rule_filter/lib/set/set_rule_filter_method.dart index f6a164e58..bd0f932fd 100644 --- a/rule_filter/lib/set/set_rule_filter_method.dart +++ b/rule_filter/lib/set/set_rule_filter_method.dart @@ -2,12 +2,14 @@ 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/id.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:json_annotation/json_annotation.dart'; import 'package:rule_filter/capability_rule_filter.dart'; import 'package:rule_filter/tmail_rule.dart'; -class SetRuleFilterMethod extends SetMethod { +class SetRuleFilterMethod extends SetMethod> with OptionalUpdateRuleFilter>{ SetRuleFilterMethod(AccountId accountId) : super(accountId); @override @@ -15,8 +17,8 @@ class SetRuleFilterMethod extends SetMethod { @override Set get requiredCapabilities => { - capabilityRuleFilter, - }; + capabilityRuleFilter, + }; @override Map toJson() { @@ -31,12 +33,31 @@ class SetRuleFilterMethod extends SetMethod { } writeNotNull('ifInState', ifInState?.value); - writeNotNull('update', update - ?.map((id, update) => SetMethodPropertiesConverter().fromMapIdToJson(id, update.toJson()))); + writeNotNull( + 'update', + updateRuleFilter?.map((id, update) { + final listJsonUpdatesRuleFilter = update.map((e) => e.toJson()).toList(); + return SetMethodPropertiesConverter() + .fromMapIdToJson(id, listJsonUpdatesRuleFilter); + })); return val; } @override - List get props => [accountId, ifInState, update,]; -} \ No newline at end of file + List get props => [ + accountId, + ifInState, + update, + ]; +} + +mixin OptionalUpdateRuleFilter { + @JsonKey(includeIfNull: false) + Map? updateRuleFilter; + + void addUpdateRuleFilter(Map updatesRuleFilter) { + updateRuleFilter ??= {}; + updateRuleFilter?.addAll(updatesRuleFilter); + } +} diff --git a/rule_filter/lib/tmail_rule.dart b/rule_filter/lib/tmail_rule.dart index 73ddd0174..114187f95 100644 --- a/rule_filter/lib/tmail_rule.dart +++ b/rule_filter/lib/tmail_rule.dart @@ -1,5 +1,7 @@ +import 'package:jmap_dart_client/http/converter/id_converter.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:rule_filter/converter/rule_id_converter.dart'; +import 'package:rule_filter/converter/rule_id_nullable_converter.dart'; import 'package:rule_filter/rule.dart'; import 'package:rule_filter/rule_action.dart'; import 'package:rule_filter/rule_condition.dart'; @@ -7,21 +9,21 @@ import 'package:rule_filter/rule_id.dart'; part 'tmail_rule.g.dart'; -@JsonSerializable() -@RuleIdConverter() +@RuleIdNullableConverter() +@IdConverter() +@JsonSerializable(explicitToJson: true) class TMailRule extends Rule { - - final RuleId id; + final RuleId? id; final String name; final RuleCondition condition; final RuleAction action; - TMailRule( - this.id, - this.name, - this.condition, - this.action, - ); + TMailRule({ + this.id, + required this.name, + required this.condition, + required this.action, + }); factory TMailRule.fromJson(Map json) => _$TMailRuleFromJson(json); @@ -30,9 +32,9 @@ class TMailRule extends Rule { @override List get props => [ - id, - name, - condition, - action, - ]; -} \ No newline at end of file + id, + name, + condition, + action, + ]; +} diff --git a/rule_filter/pubspec.yaml b/rule_filter/pubspec.yaml index 2ae478190..67e5d8b86 100644 --- a/rule_filter/pubspec.yaml +++ b/rule_filter/pubspec.yaml @@ -1,11 +1,11 @@ name: rule_filter -description: rule_filter for tmail -version: 0.0.1 -publish_to: none +description: TMail rule_filter extension +publish_to: 'none' + +version: 1.0.0+1 environment: - sdk: ">=2.17.6 <3.0.0" - flutter: ">=1.17.0" + sdk: ">=2.17.0 <3.0.0" dependencies: flutter: @@ -35,13 +35,13 @@ dev_dependencies: json_serializable: 6.2.0 mockito: 5.2.0 - # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec -# The following section is specific to Flutter packages. +# The following section is specific to Flutter. flutter: + uses-material-design: true # To add assets to your package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg @@ -51,7 +51,7 @@ flutter: # https://flutter.dev/assets-and-images/#from-packages # # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware + # https://flutter.dev/assets-and-images/#resolution-aware. # To add custom fonts to your package, add a fonts section here, # in this "flutter" section. Each entry in this list should have a diff --git a/rule_filter/test/rule_filter/get_rule_filter_method_test.dart b/rule_filter/test/rule_filter/get_rule_filter_method_test.dart new file mode 100644 index 000000000..9f17e5635 --- /dev/null +++ b/rule_filter/test/rule_filter/get_rule_filter_method_test.dart @@ -0,0 +1,126 @@ +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:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:rule_filter/get/get_rule_filter_method.dart'; +import 'package:rule_filter/get/get_rule_filter_response.dart'; +import 'package:rule_filter/rule_action.dart'; +import 'package:rule_filter/rule_append_in.dart'; +import 'package:rule_filter/rule_condition.dart'; +import 'package:rule_filter/rule_filter.dart'; +import 'package:rule_filter/rule_filter_id.dart'; +import 'package:rule_filter/tmail_rule.dart'; + +void main() { + group('test to json get rule filter method', () { + final expectRuleFilter1 = RuleFilter( + id: RuleFilterIdSingleton.ruleFilterIdSingleton, + rules: [ + TMailRule( + name: 'My first rule', + condition: RuleCondition( + value: 'question', + comparator: Comparator.contains, + field: Field.subject, + ), + action: RuleAction( + appendIn: RuleAppendIn( + mailboxIds: [ + MailboxId(Id('42')), + ], + ), + ), + ) + ], + ); + + test('get rule_filter method and response parsing', () async { + final baseOption = BaseOptions(method: 'POST'); + final dio = Dio(baseOption)..options.baseUrl = 'http://domain.com'; + final dioAdapter = DioAdapter(dio: dio); + dioAdapter.onPost( + '/jmap', + (server) => server.reply(200, { + "sessionState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943", + "methodResponses": [ + [ + "Filter/get", + { + "accountId": + "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + "state": "0", + "list": [ + { + "id": "singleton", + "rules": [ + { + "name": "My first rule", + "condition": { + "field": "subject", + "comparator": "contains", + "value": "question" + }, + "action": { + "appendIn": { + "mailboxIds": ["42"] + } + } + } + ] + } + ], + "notFound": [] + }, + "c0" + ] + ] + }), + data: { + "using": ["com:linagora:params:jmap:filter"], + "methodCalls": [ + [ + "Filter/get", + { + "accountId": + "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + "ids": ["singleton"] + }, + "c0" + ] + ] + }, + headers: { + "accept": "application/json;jmapVersion=rfc-8621", + "content-type": "application/json; charset=utf-8", + "content-length": 182 + }); + + final httpClient = HttpClient(dio); + final processingInvocation = ProcessingInvocation(); + final requestBuilder = + JmapRequestBuilder(httpClient, processingInvocation); + final accountId = AccountId(Id( + '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')); + + final getRuleFilterMethod = GetRuleFilterMethod(accountId) + ..addIds({RuleFilterIdSingleton.ruleFilterIdSingleton.id}); + final getRuleFilterInvocation = + requestBuilder.invocation(getRuleFilterMethod); + final response = await (requestBuilder + ..usings(getRuleFilterMethod.requiredCapabilities)) + .build() + .execute(); + + final resultList = response.parse( + getRuleFilterInvocation.methodCallId, + GetRuleFilterResponse.deserialize); + + expect(resultList?.list.length, equals(1)); + expect(resultList?.list, containsAll({expectRuleFilter1})); + }); + }); +} diff --git a/rule_filter/test/rule_filter/set_rule_filter_method_test.dart b/rule_filter/test/rule_filter/set_rule_filter_method_test.dart new file mode 100644 index 000000000..96ba2d82f --- /dev/null +++ b/rule_filter/test/rule_filter/set_rule_filter_method_test.dart @@ -0,0 +1,154 @@ +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/identities/identity.dart'; +import 'package:jmap_dart_client/jmap/identities/set/set_identity_method.dart'; +import 'package:jmap_dart_client/jmap/identities/set/set_identity_response.dart'; +import 'package:jmap_dart_client/jmap/jmap_request.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:rule_filter/rule_action.dart'; +import 'package:rule_filter/rule_append_in.dart'; +import 'package:rule_filter/rule_condition.dart'; +import 'package:rule_filter/rule_filter.dart'; +import 'package:rule_filter/rule_id.dart'; +import 'package:rule_filter/set/set_rule_filter_method.dart'; +import 'package:rule_filter/set/set_rule_filter_response.dart'; +import 'package:rule_filter/tmail_rule.dart'; + +void main() { + group('test to json set identity method', () { + final expectedUpdated = TMailRule( + id: RuleId(id: Id('1')), + name: 'My first rule', + condition: RuleCondition( + value: 'question', + comparator: Comparator.contains, + field: Field.subject, + ), + action: RuleAction( + appendIn: RuleAppendIn( + mailboxIds: [ + MailboxId(Id('42')), + ], + ), + ), + ); + + test('set rule_filter method and response parsing', () async { + final baseOption = BaseOptions(method: 'POST'); + final dio = Dio(baseOption)..options.baseUrl = 'http://domain.com'; + final dioAdapter = DioAdapter(dio: dio); + dioAdapter.onPost( + '/jmap', + (server) => server.reply(200, { + "sessionState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943", + "methodResponses": [ + [ + "Filter/set", + { + "accountId": + "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + "oldState": "-1", + "newState": "0", + "updated": { + "singleton": { + "id": "1", + "name": "My first rule", + "condition": { + "field": "subject", + "comparator": "contains", + "value": "question" + }, + "action": { + "appendIn": { + "mailboxIds": ["42"] + } + } + } + } + }, + "c0" + ], + ] + }), + data: { + "using": ["com:linagora:params:jmap:filter"], + "methodCalls": [ + [ + "Filter/set", + { + "accountId": + "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + "update": { + "singleton": [ + { + "id": "1", + "name": "My first rule", + "condition": { + "field": "subject", + "comparator": "contains", + "value": "question" + }, + "action": { + "appendIn": { + "mailboxIds": ["42"] + } + } + } + ] + } + }, + "c0" + ], + ] + }, + headers: { + "accept": "application/json;jmapVersion=rfc-8621", + "content-type": "application/json; charset=utf-8", + "content-length": 340 + }); + + final setRuleFilterMethod = SetRuleFilterMethod(AccountId(Id( + '29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6'))) + ..addUpdateRuleFilter({ + Id('singleton'): [ + TMailRule( + id: RuleId(id: Id('1')), + name: 'My first rule', + condition: RuleCondition( + value: 'question', + comparator: Comparator.contains, + field: Field.subject, + ), + action: RuleAction( + appendIn: RuleAppendIn( + mailboxIds: [ + MailboxId(Id('42')), + ], + ), + ), + ) + ], + }); + + final httpClient = HttpClient(dio); + final requestBuilder = + JmapRequestBuilder(httpClient, ProcessingInvocation()); + final setRuleFilterInvocation = + requestBuilder.invocation(setRuleFilterMethod); + final response = await (requestBuilder + ..usings(setRuleFilterMethod.requiredCapabilities)) + .build() + .execute(); + + final setRuleFilterResponse = response.parse( + setRuleFilterInvocation.methodCallId, + SetRuleFilterResponse.deserialize); + expect(setRuleFilterResponse!.updated?.values, + contains(expectedUpdated)); + }); + }); +} diff --git a/rule_filter/test/rule_filter_test.dart b/rule_filter/test/rule_filter_test.dart deleted file mode 100644 index 4c13a02d5..000000000 --- a/rule_filter/test/rule_filter_test.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:rule_filter/rule_filter.dart'; - -void main() { - test('adds one to input values', () { - }); -}