change model and write unit test

This commit is contained in:
ManhNTX
2022-08-07 08:02:07 +07:00
committed by Dat H. Pham
parent 42bd1f365d
commit 34b6446ee1
17 changed files with 430 additions and 74 deletions
@@ -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<RuleFilterId, String> {
const RuleFilterIdConverter();
@override
RuleFilterId fromJson(String json) => RuleFilterId(id: Id(json));
@override
String toJson(RuleFilterId object) => object.id.value;
}
@@ -6,7 +6,7 @@ class RuleIdConverter implements JsonConverter<RuleId, String> {
const RuleIdConverter(); const RuleIdConverter();
@override @override
RuleId fromJson(String json) => RuleId(Id(json)); RuleId fromJson(String json) => RuleId(id: Id(json));
@override @override
String toJson(RuleId object) => object.id.value; String toJson(RuleId object) => object.id.value;
@@ -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<RuleId?, String?> {
const RuleIdNullableConverter();
@override
RuleId? fromJson(String? json) => json != null ? RuleId(id: Id(json)) : null;
@override
String? toJson(RuleId? object) => object?.id.value;
}
@@ -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:jmap_dart_client/jmap/core/request/result_reference.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:rule_filter/capability_rule_filter.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'; part 'get_rule_filter_method.g.dart';
@IdConverter() @IdConverter()
@RuleIdConverter()
@AccountIdConverter() @AccountIdConverter()
@PropertiesConverter() @PropertiesConverter()
@JsonSerializable(explicitToJson: true) @JsonSerializable(explicitToJson: true)
@@ -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/method/response/get_response.dart';
import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:rule_filter/rule_filter.dart';
import 'package:rule_filter/tmail_rule.dart'; import 'package:rule_filter/tmail_rule.dart';
part 'get_rule_filter_response.g.dart'; part 'get_rule_filter_response.g.dart';
@@ -14,8 +15,8 @@ part 'get_rule_filter_response.g.dart';
@AccountIdConverter() @AccountIdConverter()
@IdConverter() @IdConverter()
@JsonSerializable() @JsonSerializable()
class GetRuleFilterResponse extends GetResponse<TMailRule> { class GetRuleFilterResponse extends GetResponse<RuleFilter> {
GetRuleFilterResponse(AccountId accountId, State state, List<TMailRule> list, List<Id>? notFound) : super(accountId, state, list, notFound); GetRuleFilterResponse(AccountId accountId, State state, List<RuleFilter> list, List<Id>? notFound) : super(accountId, state, list, notFound);
factory GetRuleFilterResponse.fromJson(Map<String, dynamic> json) => _$GetRuleFilterResponseFromJson(json); factory GetRuleFilterResponse.fromJson(Map<String, dynamic> json) => _$GetRuleFilterResponseFromJson(json);
+4 -2
View File
@@ -4,11 +4,13 @@ import 'package:rule_filter/rule_append_in.dart';
part 'rule_action.g.dart'; part 'rule_action.g.dart';
@JsonSerializable() @JsonSerializable(explicitToJson: true)
class RuleAction with EquatableMixin { class RuleAction with EquatableMixin {
final RuleAppendIn appendIn; final RuleAppendIn appendIn;
RuleAction(this.appendIn); RuleAction({
required this.appendIn,
});
@override @override
List<Object?> get props => [ List<Object?> get props => [
+3 -2
View File
@@ -10,7 +10,9 @@ part 'rule_append_in.g.dart';
class RuleAppendIn with EquatableMixin { class RuleAppendIn with EquatableMixin {
final List<MailboxId> mailboxIds; final List<MailboxId> mailboxIds;
RuleAppendIn(this.mailboxIds); RuleAppendIn({
required this.mailboxIds,
});
@override @override
List<Object?> get props => [ List<Object?> get props => [
@@ -21,5 +23,4 @@ class RuleAppendIn with EquatableMixin {
_$RuleAppendInFromJson(json); _$RuleAppendInFromJson(json);
Map<String, dynamic> toJson() => _$RuleAppendInToJson(this); Map<String, dynamic> toJson() => _$RuleAppendInToJson(this);
} }
+5 -8
View File
@@ -3,7 +3,6 @@ import 'package:json_annotation/json_annotation.dart';
part 'rule_condition.g.dart'; part 'rule_condition.g.dart';
@JsonEnum()
enum Field { enum Field {
@JsonValue('from') @JsonValue('from')
from, from,
@@ -17,7 +16,6 @@ enum Field {
subject, subject,
} }
@JsonEnum()
enum Comparator { enum Comparator {
@JsonValue('contains') @JsonValue('contains')
contains, contains,
@@ -37,11 +35,11 @@ class RuleCondition extends FilterCondition {
final String value; final String value;
RuleCondition( RuleCondition({
this.field, required this.field,
this.comparator, required this.comparator,
this.value, required this.value,
); });
@override @override
List<Object?> get props => [ List<Object?> get props => [
@@ -55,5 +53,4 @@ class RuleCondition extends FilterCondition {
@override @override
Map<String, dynamic> toJson() => _$RuleConditionToJson(this); Map<String, dynamic> toJson() => _$RuleConditionToJson(this);
} }
+14 -7
View File
@@ -1,17 +1,21 @@
import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:rule_filter/converter/rule_id_converter.dart'; import 'package:rule_filter/converter/rule_filter_id_coverter.dart';
import 'package:rule_filter/rule_id.dart'; import 'package:rule_filter/rule_filter_id.dart';
import 'package:rule_filter/tmail_rule.dart';
part 'rule_filter.g.dart'; part 'rule_filter.g.dart';
@RuleIdConverter() @RuleFilterIdConverter()
@JsonSerializable() @JsonSerializable()
class RuleFilter extends Filter { class RuleFilter extends Filter {
final RuleFilterId id;
final List<TMailRule> rules;
final RuleId id; RuleFilter({
required this.id,
RuleFilter(this.id); required this.rules,
});
factory RuleFilter.fromJson(Map<String, dynamic> json) => factory RuleFilter.fromJson(Map<String, dynamic> json) =>
_$RuleFilterFromJson(json); _$RuleFilterFromJson(json);
@@ -20,5 +24,8 @@ class RuleFilter extends Filter {
Map<String, dynamic> toJson() => _$RuleFilterToJson(this); Map<String, dynamic> toJson() => _$RuleFilterToJson(this);
@override @override
List<Object?> get props => [id]; List<Object?> get props => [
id,
rules,
];
} }
+31
View File
@@ -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<Object?> get props => [id];
}
extension RuleFilterIdSingleton on RuleFilterId {
static RuleFilterId get ruleFilterIdSingleton => RuleFilterId(id: Id(RuleFilterIdType.singleton.value));
}
+3 -11
View File
@@ -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:jmap_dart_client/jmap/core/id.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
enum RuleIdType {
singleton('singleton');
const RuleIdType(this.value);
final String value;
}
@JsonSerializable() @JsonSerializable()
@IdConverter() @IdConverter()
class RuleId with EquatableMixin { class RuleId with EquatableMixin {
final Id id; final Id id;
RuleId(this.id); RuleId({
required this.id,
});
@override @override
List<Object?> get props => [id]; List<Object?> get props => [id];
} }
extension RuleIdSingleton on RuleId {
static get ruleIdSingleton => RuleId(Id(RuleIdType.singleton.value));
}
@@ -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/http/converter/set/set_method_properties_converter.dart';
import 'package:jmap_dart_client/jmap/account_id.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/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/method/request/set_method.dart';
import 'package:jmap_dart_client/jmap/core/request/request_invocation.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/capability_rule_filter.dart';
import 'package:rule_filter/tmail_rule.dart'; import 'package:rule_filter/tmail_rule.dart';
class SetRuleFilterMethod extends SetMethod<TMailRule> { class SetRuleFilterMethod extends SetMethod<List<TMailRule>> with OptionalUpdateRuleFilter<List<TMailRule>>{
SetRuleFilterMethod(AccountId accountId) : super(accountId); SetRuleFilterMethod(AccountId accountId) : super(accountId);
@override @override
@@ -15,8 +17,8 @@ class SetRuleFilterMethod extends SetMethod<TMailRule> {
@override @override
Set<CapabilityIdentifier> get requiredCapabilities => { Set<CapabilityIdentifier> get requiredCapabilities => {
capabilityRuleFilter, capabilityRuleFilter,
}; };
@override @override
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@@ -31,12 +33,31 @@ class SetRuleFilterMethod extends SetMethod<TMailRule> {
} }
writeNotNull('ifInState', ifInState?.value); writeNotNull('ifInState', ifInState?.value);
writeNotNull('update', update writeNotNull(
?.map((id, update) => SetMethodPropertiesConverter().fromMapIdToJson(id, update.toJson()))); 'update',
updateRuleFilter?.map((id, update) {
final listJsonUpdatesRuleFilter = update.map((e) => e.toJson()).toList();
return SetMethodPropertiesConverter()
.fromMapIdToJson(id, listJsonUpdatesRuleFilter);
}));
return val; return val;
} }
@override @override
List<Object?> get props => [accountId, ifInState, update,]; List<Object?> get props => [
accountId,
ifInState,
update,
];
}
mixin OptionalUpdateRuleFilter<T> {
@JsonKey(includeIfNull: false)
Map<Id, T>? updateRuleFilter;
void addUpdateRuleFilter(Map<Id, T> updatesRuleFilter) {
updateRuleFilter ??= <Id, T>{};
updateRuleFilter?.addAll(updatesRuleFilter);
}
} }
+17 -15
View File
@@ -1,5 +1,7 @@
import 'package:jmap_dart_client/http/converter/id_converter.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:rule_filter/converter/rule_id_converter.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.dart';
import 'package:rule_filter/rule_action.dart'; import 'package:rule_filter/rule_action.dart';
import 'package:rule_filter/rule_condition.dart'; import 'package:rule_filter/rule_condition.dart';
@@ -7,21 +9,21 @@ import 'package:rule_filter/rule_id.dart';
part 'tmail_rule.g.dart'; part 'tmail_rule.g.dart';
@JsonSerializable() @RuleIdNullableConverter()
@RuleIdConverter() @IdConverter()
@JsonSerializable(explicitToJson: true)
class TMailRule extends Rule { class TMailRule extends Rule {
final RuleId? id;
final RuleId id;
final String name; final String name;
final RuleCondition condition; final RuleCondition condition;
final RuleAction action; final RuleAction action;
TMailRule( TMailRule({
this.id, this.id,
this.name, required this.name,
this.condition, required this.condition,
this.action, required this.action,
); });
factory TMailRule.fromJson(Map<String, dynamic> json) => factory TMailRule.fromJson(Map<String, dynamic> json) =>
_$TMailRuleFromJson(json); _$TMailRuleFromJson(json);
@@ -30,9 +32,9 @@ class TMailRule extends Rule {
@override @override
List<Object?> get props => [ List<Object?> get props => [
id, id,
name, name,
condition, condition,
action, action,
]; ];
} }
+8 -8
View File
@@ -1,11 +1,11 @@
name: rule_filter name: rule_filter
description: rule_filter for tmail description: TMail rule_filter extension
version: 0.0.1 publish_to: 'none'
publish_to: none
version: 1.0.0+1
environment: environment:
sdk: ">=2.17.6 <3.0.0" sdk: ">=2.17.0 <3.0.0"
flutter: ">=1.17.0"
dependencies: dependencies:
flutter: flutter:
@@ -35,13 +35,13 @@ dev_dependencies:
json_serializable: 6.2.0 json_serializable: 6.2.0
mockito: 5.2.0 mockito: 5.2.0
# For information on the generic Dart part of this file, see the # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages. # The following section is specific to Flutter.
flutter: flutter:
uses-material-design: true
# To add assets to your package, add an assets section, like this: # To add assets to your package, add an assets section, like this:
# assets: # assets:
# - images/a_dot_burr.jpeg # - images/a_dot_burr.jpeg
@@ -51,7 +51,7 @@ flutter:
# https://flutter.dev/assets-and-images/#from-packages # https://flutter.dev/assets-and-images/#from-packages
# #
# An image asset can refer to one or more resolution-specific "variants", see # 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, # To add custom fonts to your package, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a # in this "flutter" section. Each entry in this list should have a
@@ -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<GetRuleFilterResponse>(
getRuleFilterInvocation.methodCallId,
GetRuleFilterResponse.deserialize);
expect(resultList?.list.length, equals(1));
expect(resultList?.list, containsAll({expectRuleFilter1}));
});
});
}
@@ -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<SetRuleFilterResponse>(
setRuleFilterInvocation.methodCallId,
SetRuleFilterResponse.deserialize);
expect(setRuleFilterResponse!.updated?.values,
contains(expectedUpdated));
});
});
}
-8
View File
@@ -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', () {
});
}