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,8 +6,8 @@ class RuleIdConverter implements JsonConverter<RuleId, String> {
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;
}
}
@@ -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: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)
@@ -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<TMailRule> {
GetRuleFilterResponse(AccountId accountId, State state, List<TMailRule> list, List<Id>? notFound) : super(accountId, state, list, notFound);
class GetRuleFilterResponse extends GetResponse<RuleFilter> {
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);
+4 -2
View File
@@ -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<Object?> get props => [
+3 -2
View File
@@ -10,7 +10,9 @@ part 'rule_append_in.g.dart';
class RuleAppendIn with EquatableMixin {
final List<MailboxId> mailboxIds;
RuleAppendIn(this.mailboxIds);
RuleAppendIn({
required this.mailboxIds,
});
@override
List<Object?> get props => [
@@ -21,5 +23,4 @@ class RuleAppendIn with EquatableMixin {
_$RuleAppendInFromJson(json);
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';
@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<Object?> get props => [
@@ -55,5 +53,4 @@ class RuleCondition extends FilterCondition {
@override
Map<String, dynamic> toJson() => _$RuleConditionToJson(this);
}
+15 -8
View File
@@ -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<TMailRule> rules;
final RuleId id;
RuleFilter(this.id);
RuleFilter({
required this.id,
required this.rules,
});
factory RuleFilter.fromJson(Map<String, dynamic> json) =>
_$RuleFilterFromJson(json);
@@ -20,5 +24,8 @@ class RuleFilter extends Filter {
Map<String, dynamic> toJson() => _$RuleFilterToJson(this);
@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: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<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/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<TMailRule> {
class SetRuleFilterMethod extends SetMethod<List<TMailRule>> with OptionalUpdateRuleFilter<List<TMailRule>>{
SetRuleFilterMethod(AccountId accountId) : super(accountId);
@override
@@ -15,8 +17,8 @@ class SetRuleFilterMethod extends SetMethod<TMailRule> {
@override
Set<CapabilityIdentifier> get requiredCapabilities => {
capabilityRuleFilter,
};
capabilityRuleFilter,
};
@override
Map<String, dynamic> toJson() {
@@ -31,12 +33,31 @@ class SetRuleFilterMethod extends SetMethod<TMailRule> {
}
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<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);
}
}
+18 -16
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: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<String, dynamic> json) =>
_$TMailRuleFromJson(json);
@@ -30,9 +32,9 @@ class TMailRule extends Rule {
@override
List<Object?> get props => [
id,
name,
condition,
action,
];
}
id,
name,
condition,
action,
];
}
+8 -8
View File
@@ -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
@@ -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', () {
});
}