TF-3752 Add more test case for SetForwardMethod unit test
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -4,11 +4,18 @@ import 'package:forward/forward/forward_id.dart';
|
|||||||
import 'package:forward/forward/get/get_forward_method.dart';
|
import 'package:forward/forward/get/get_forward_method.dart';
|
||||||
import 'package:forward/forward/get/get_forward_response.dart';
|
import 'package:forward/forward/get/get_forward_response.dart';
|
||||||
import 'package:forward/forward/set/set_forward_method.dart';
|
import 'package:forward/forward/set/set_forward_method.dart';
|
||||||
|
import 'package:forward/forward/set/set_forward_response.dart';
|
||||||
import 'package:forward/forward/tmail_forward.dart';
|
import 'package:forward/forward/tmail_forward.dart';
|
||||||
import 'package:http_mock_adapter/http_mock_adapter.dart';
|
import 'package:http_mock_adapter/http_mock_adapter.dart';
|
||||||
import 'package:jmap_dart_client/http/http_client.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/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/error/method/exception/error_method_response_exception.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/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/request/request_invocation.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
import 'package:jmap_dart_client/jmap/jmap_request.dart';
|
import 'package:jmap_dart_client/jmap/jmap_request.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
@@ -135,4 +142,792 @@ void main() {
|
|||||||
expect(getForwardResponse.list, containsAll({expectedUpdated}));
|
expect(getForwardResponse.list, containsAll({expectedUpdated}));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
group('set forward method test:', () {
|
||||||
|
const String baseUrl = 'http://domain.com/jmap';
|
||||||
|
|
||||||
|
late final Dio dio;
|
||||||
|
late final DioAdapter dioAdapter;
|
||||||
|
|
||||||
|
final methodCallId = MethodCallId('c0');
|
||||||
|
final bobAccountId = AccountId(Id('bob'));
|
||||||
|
final sessionState = State('sessionState');
|
||||||
|
final newState = State('newState');
|
||||||
|
final tmailForward = TMailForward(
|
||||||
|
id: ForwardIdSingleton.forwardIdSingleton,
|
||||||
|
localCopy: true,
|
||||||
|
forwards: {'targetA@domain.org', 'targetB@domain.org'},
|
||||||
|
);
|
||||||
|
|
||||||
|
setUpAll(() {
|
||||||
|
dio = Dio(BaseOptions(method: 'POST'))..options.baseUrl = baseUrl;
|
||||||
|
dioAdapter = DioAdapter(dio: dio);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should fail when wrong account id', () async {
|
||||||
|
// Arrange
|
||||||
|
final unknownAccountId = AccountId(Id('unknownAccountId'));
|
||||||
|
final setForwardMethod = SetForwardMethod(unknownAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id : tmailForward
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"type": "accountNotFound",
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": unknownAccountId.id.value,
|
||||||
|
"update": {tmailForward.id!.id.value: tmailForward.toJson()}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
() => responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
),
|
||||||
|
throwsA(ErrorMethodResponseException(AccountNotFoundMethodResponse())),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should return unknown method when missing one capability', () async {
|
||||||
|
// Arrange
|
||||||
|
final listCapabilitiesUsed = {CapabilityIdentifier.jmapCore};
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id : tmailForward
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"type": "unknownMethod",
|
||||||
|
"description":
|
||||||
|
"Missing capability(ies): com:linagora:params:jmap:forward"
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": listCapabilitiesUsed
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {tmailForward.id!.id.value: tmailForward.toJson()}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(listCapabilitiesUsed))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
() => responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
),
|
||||||
|
throwsA(ErrorMethodResponseException(UnknownMethodResponse(
|
||||||
|
description:
|
||||||
|
'Missing capability(ies): com:linagora:params:jmap:forward',
|
||||||
|
))),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should return unknown method when missing all capabilities',
|
||||||
|
() async {
|
||||||
|
// Arrange
|
||||||
|
final listCapabilitiesUsed = <CapabilityIdentifier>{};
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id : tmailForward
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"type": "unknownMethod",
|
||||||
|
"description":
|
||||||
|
"Missing capability(ies): urn:ietf:params:jmap:core, com:linagora:params:jmap:forward"
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": listCapabilitiesUsed
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {tmailForward.id!.id.value: tmailForward.toJson()}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(listCapabilitiesUsed))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
() => responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
),
|
||||||
|
throwsA(ErrorMethodResponseException(UnknownMethodResponse(
|
||||||
|
description:
|
||||||
|
'Missing capability(ies): urn:ietf:params:jmap:core, com:linagora:params:jmap:forward',
|
||||||
|
))),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should return success', () async {
|
||||||
|
// Arrange
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id : tmailForward
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"Forward/set",
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"newState": newState.value,
|
||||||
|
"updated": {tmailForward.id!.id.value: {}}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {tmailForward.id!.id.value: tmailForward.toJson()}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setForwardResponse = responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.updated,
|
||||||
|
isNotEmpty,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notCreated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notDestroyed,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should fail when missing forwards', () async {
|
||||||
|
// Arrange
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id : TMailForward(
|
||||||
|
localCopy: true,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"Forward/set",
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"newState": newState.value,
|
||||||
|
"notUpdated": {
|
||||||
|
tmailForward.id!.id.value: {
|
||||||
|
"type": "invalidArguments",
|
||||||
|
"description": "Missing '/forwards' property"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {
|
||||||
|
tmailForward.id!.id.value: {"localCopy": true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setForwardResponse = responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.updated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.type,
|
||||||
|
SetError.invalidArguments,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.description,
|
||||||
|
'Missing \'/forwards\' property',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should fail when missing localCopy', () async {
|
||||||
|
// Arrange
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id : TMailForward(
|
||||||
|
forwards: {},
|
||||||
|
)
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"Forward/set",
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"newState": newState.value,
|
||||||
|
"notUpdated": {
|
||||||
|
tmailForward.id!.id.value: {
|
||||||
|
"type": "invalidArguments",
|
||||||
|
"description": "Missing '/localCopy' property"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {
|
||||||
|
tmailForward.id!.id.value: {"forwards": []}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setForwardResponse = responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.updated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.type,
|
||||||
|
SetError.invalidArguments,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.description,
|
||||||
|
'Missing \'/localCopy\' property',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should fail when invalid key', () async {
|
||||||
|
// Arrange
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
Id('invalidKey'): tmailForward
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"Forward/set",
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"newState": newState.value,
|
||||||
|
"notUpdated": {
|
||||||
|
"invalidKey": {
|
||||||
|
"type": "invalidArguments",
|
||||||
|
"description": "id invalidKey must be singleton"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {
|
||||||
|
"invalidKey": tmailForward.toJson(),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setForwardResponse = responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.updated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.type,
|
||||||
|
SetError.invalidArguments,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.description,
|
||||||
|
'id invalidKey must be singleton',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should fail when invalid forwards', () async {
|
||||||
|
// Arrange
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id: tmailForward.copyWith(
|
||||||
|
forwards: {"123\$#%\$#invalid"}
|
||||||
|
)
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"Forward/set",
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"newState": newState.value,
|
||||||
|
"notUpdated": {
|
||||||
|
tmailForward.id!.id.value: {
|
||||||
|
"type": "invalidArguments",
|
||||||
|
"description":
|
||||||
|
"'/forwards(0)' property is not valid: Invalid mailAddress: Out of data at position 1 in '123\$\$#%\$\$#invalid'"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {
|
||||||
|
tmailForward.id!.id.value: tmailForward.copyWith(
|
||||||
|
forwards: {"123\$#%\$#invalid"}
|
||||||
|
).toJson(),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setForwardResponse = responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.updated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.type,
|
||||||
|
SetError.invalidArguments,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated?.values.firstOrNull?.description,
|
||||||
|
'\'/forwards(0)\' property is not valid: Invalid mailAddress: Out of data at position 1 in \'123\$\$#%\$\$#invalid\'',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should noop when empty map', () async {
|
||||||
|
// Arrange
|
||||||
|
final setForwardMethod = SetForwardMethod(bobAccountId)
|
||||||
|
..addUpdatesSingleton({});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"Forward/set",
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"newState": newState.value
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": bobAccountId.id.value,
|
||||||
|
"update": {},
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setForwardResponse = responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.updated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
setForwardResponse?.notUpdated,
|
||||||
|
isNull,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should reject from delegated account', () async {
|
||||||
|
// Arrange
|
||||||
|
final aliceAccountId = AccountId(Id('Alice'));
|
||||||
|
final setForwardMethod = SetForwardMethod(aliceAccountId)
|
||||||
|
..addUpdatesSingleton({
|
||||||
|
tmailForward.id!.id: tmailForward,
|
||||||
|
});
|
||||||
|
final requestBuilder = JmapRequestBuilder(
|
||||||
|
HttpClient(dio),
|
||||||
|
ProcessingInvocation(),
|
||||||
|
);
|
||||||
|
final invocation = requestBuilder.invocation(
|
||||||
|
setForwardMethod,
|
||||||
|
methodCallId: methodCallId,
|
||||||
|
);
|
||||||
|
dioAdapter.onPost(
|
||||||
|
'',
|
||||||
|
(server) => server.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
"sessionState": sessionState.value,
|
||||||
|
"methodResponses": [
|
||||||
|
[
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"type": "forbidden",
|
||||||
|
"description":
|
||||||
|
"Access to other accounts settings is forbidden"
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
),
|
||||||
|
data: {
|
||||||
|
"using": setForwardMethod.requiredCapabilities
|
||||||
|
.map((capability) => capability.value.toString())
|
||||||
|
.toList(),
|
||||||
|
"methodCalls": [
|
||||||
|
[
|
||||||
|
setForwardMethod.methodName.value,
|
||||||
|
{
|
||||||
|
"accountId": aliceAccountId.id.value,
|
||||||
|
"update": {
|
||||||
|
tmailForward.id!.id.value: tmailForward.toJson(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methodCallId.value,
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final responseObject = await (requestBuilder
|
||||||
|
..usings(setForwardMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(
|
||||||
|
() => responseObject.parse<SetForwardResponse>(
|
||||||
|
invocation.methodCallId,
|
||||||
|
SetForwardResponse.deserialize,
|
||||||
|
),
|
||||||
|
throwsA(ErrorMethodResponseException(ForbiddenMethodResponse(
|
||||||
|
description: 'Access to other accounts settings is forbidden'))),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user