TF-939 Depend on accountCapabilities to delete multiple mailboxes
This commit is contained in:
committed by
Dat H. Pham
parent
3871b18f00
commit
48ae928b4e
@@ -138,9 +138,10 @@ class MailboxAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> deleteMultipleMailbox(Session session, AccountId accountId, List<MailboxId> mailboxIds) async {
|
Future<bool> deleteMultipleMailbox(Session session, AccountId accountId, List<MailboxId> mailboxIds) async {
|
||||||
requireCapability(session, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]);
|
requireCapability(session, accountId, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]);
|
||||||
|
|
||||||
final coreCapability = (session.capabilities[CapabilityIdentifier.jmapCore] as CoreCapability);
|
final coreCapability = session.getCapabilityProperties<CoreCapability>(
|
||||||
|
accountId, CapabilityIdentifier.jmapCore);
|
||||||
final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt();
|
final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt();
|
||||||
|
|
||||||
var finalResult = true;
|
var finalResult = true;
|
||||||
|
|||||||
@@ -20,9 +20,11 @@ class DeleteMultipleMailboxInteractor {
|
|||||||
mailboxIdDeleted,
|
mailboxIdDeleted,
|
||||||
currentMailboxState: currentMailboxState));
|
currentMailboxState: currentMailboxState));
|
||||||
} else {
|
} else {
|
||||||
|
logError('DeleteMultipleMailboxInteractor::execute(): failed');
|
||||||
yield Left<Failure, Success>(DeleteMultipleMailboxFailure(null));
|
yield Left<Failure, Success>(DeleteMultipleMailboxFailure(null));
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
logError('DeleteMultipleMailboxInteractor::execute(): exception: $e');
|
||||||
yield Left<Failure, Success>(DeleteMultipleMailboxFailure(e));
|
yield Left<Failure, Success>(DeleteMultipleMailboxFailure(e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
|
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/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:tmail_ui_user/main/error/request_error.dart';
|
import 'package:tmail_ui_user/main/error/request_error.dart';
|
||||||
|
|
||||||
void requireCapability(Session session, List<CapabilityIdentifier> requiredCapabilities) {
|
void requireCapability(Session session, AccountId accountId, List<CapabilityIdentifier> requiredCapabilities) {
|
||||||
final matchedCapabilities = session.capabilities.keys
|
final account = session.accounts[accountId];
|
||||||
|
if (account == null) {
|
||||||
|
throw const InvalidCapability();
|
||||||
|
}
|
||||||
|
|
||||||
|
final matchedCapabilities = account.accountCapabilities.keys
|
||||||
.fold<Set<CapabilityIdentifier>>(
|
.fold<Set<CapabilityIdentifier>>(
|
||||||
Set<CapabilityIdentifier>(),
|
<CapabilityIdentifier>{},
|
||||||
(previousValue, element) {
|
(previousValue, element) {
|
||||||
if (requiredCapabilities.contains(element)) {
|
if (requiredCapabilities.contains(element)) {
|
||||||
previousValue.add(element);
|
previousValue.add(element);
|
||||||
@@ -14,7 +20,7 @@ void requireCapability(Session session, List<CapabilityIdentifier> requiredCapab
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
final missingCapabilities = requiredCapabilities.toSet().difference(matchedCapabilities);
|
final missingCapabilities = requiredCapabilities.toSet().difference(matchedCapabilities);
|
||||||
if (missingCapabilities.length > 0) {
|
if (missingCapabilities.isNotEmpty) {
|
||||||
throw SessionMissingCapability(missingCapabilities);
|
throw SessionMissingCapability(missingCapabilities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,18 @@
|
|||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||||
|
|
||||||
class SessionMissingCapability extends Equatable implements Exception {
|
class SessionMissingCapability extends InvalidCapability {
|
||||||
final Set<CapabilityIdentifier> capabilityIdentifiers;
|
final Set<CapabilityIdentifier> capabilityIdentifiers;
|
||||||
|
|
||||||
SessionMissingCapability(this.capabilityIdentifiers);
|
const SessionMissingCapability(this.capabilityIdentifiers) : super();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [capabilityIdentifiers];
|
List<Object?> get props => [capabilityIdentifiers];
|
||||||
|
}
|
||||||
|
|
||||||
|
class InvalidCapability extends Equatable implements Exception {
|
||||||
|
const InvalidCapability();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
|
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.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_properties.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/capability/empty_capability.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:uri/uri.dart';
|
import 'package:uri/uri.dart';
|
||||||
|
|
||||||
@@ -25,4 +28,15 @@ extension SessionExtension on Session {
|
|||||||
log('SessionExtension::getUploadUri(): uploadUri: $uploadUri');
|
log('SessionExtension::getUploadUri(): uploadUri: $uploadUri');
|
||||||
return Uri.parse(uploadUri);
|
return Uri.parse(uploadUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
T getCapabilityProperties<T extends CapabilityProperties>(
|
||||||
|
AccountId accountId,
|
||||||
|
CapabilityIdentifier identifier
|
||||||
|
) {
|
||||||
|
var capability = accounts[accountId]!.accountCapabilities[identifier];
|
||||||
|
if (capability is EmptyCapability) {
|
||||||
|
capability = capabilities[identifier] as T;
|
||||||
|
}
|
||||||
|
return (capability as T);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@ import 'package:flutter_test/flutter_test.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/account/account.dart';
|
import 'package:jmap_dart_client/jmap/core/account/account.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/capability/capability_properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart';
|
import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart';
|
import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart';
|
import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart';
|
||||||
@@ -24,7 +25,7 @@ void main() {
|
|||||||
final session = Session(
|
final session = Session(
|
||||||
{
|
{
|
||||||
CapabilityIdentifier.jmapSubmission:
|
CapabilityIdentifier.jmapSubmission:
|
||||||
SubmissionCapability(UnsignedInt(0), Set()),
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
CapabilityIdentifier.jmapMail: MailCapability(
|
CapabilityIdentifier.jmapMail: MailCapability(
|
||||||
UnsignedInt(10000000),
|
UnsignedInt(10000000),
|
||||||
null,
|
null,
|
||||||
@@ -36,10 +37,10 @@ void main() {
|
|||||||
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')),
|
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
CapabilityIdentifier.jmapMdn: MdnCapability()
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
},
|
},
|
||||||
@@ -48,18 +49,9 @@ void main() {
|
|||||||
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
|
||||||
Account(AccountName('bob@domain.tld'), true, false, {
|
Account(AccountName('bob@domain.tld'), true, false, {
|
||||||
CapabilityIdentifier.jmapSubmission:
|
CapabilityIdentifier.jmapSubmission:
|
||||||
SubmissionCapability(UnsignedInt(0), Set()),
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
|
CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
|
||||||
true, Uri.parse('ws://domain.com/jmap/ws')),
|
true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
CapabilityIdentifier.jmapCore: CoreCapability(
|
|
||||||
UnsignedInt(20971520),
|
|
||||||
UnsignedInt(4),
|
|
||||||
UnsignedInt(10000000),
|
|
||||||
UnsignedInt(4),
|
|
||||||
UnsignedInt(16),
|
|
||||||
UnsignedInt(500),
|
|
||||||
UnsignedInt(500),
|
|
||||||
{CollationIdentifier("i;unicode-casemap")}),
|
|
||||||
CapabilityIdentifier.jmapMail: MailCapability(
|
CapabilityIdentifier.jmapMail: MailCapability(
|
||||||
UnsignedInt(10000000),
|
UnsignedInt(10000000),
|
||||||
null,
|
null,
|
||||||
@@ -69,10 +61,10 @@ void main() {
|
|||||||
true),
|
true),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
CapabilityIdentifier.jmapMdn: MdnCapability()
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
})
|
})
|
||||||
@@ -108,15 +100,233 @@ void main() {
|
|||||||
'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'),
|
'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'),
|
||||||
State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'));
|
State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'));
|
||||||
expect(
|
expect(
|
||||||
() => requireCapability(session, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]),
|
() => requireCapability(
|
||||||
throwsA(TypeMatcher<SessionMissingCapability>()));
|
session,
|
||||||
|
AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
[CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]),
|
||||||
|
throwsA(const TypeMatcher<SessionMissingCapability>()));
|
||||||
});
|
});
|
||||||
|
|
||||||
test('when session have all required capabilities exception should throw', () {
|
test('when account capabilities is empty exception should throw', () {
|
||||||
final session = Session(
|
final session = Session(
|
||||||
{
|
{
|
||||||
CapabilityIdentifier.jmapSubmission:
|
CapabilityIdentifier.jmapSubmission:
|
||||||
SubmissionCapability(UnsignedInt(0), Set()),
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
|
CapabilityIdentifier.jmapMail: MailCapability(
|
||||||
|
UnsignedInt(10000000),
|
||||||
|
null,
|
||||||
|
UnsignedInt(200),
|
||||||
|
UnsignedInt(20000000),
|
||||||
|
{"receivedAt", "sentAt", "size", "from", "to", "subject"},
|
||||||
|
true),
|
||||||
|
CapabilityIdentifier.jmapWebSocket:
|
||||||
|
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
|
||||||
|
Account(AccountName('bob@domain.tld'), true, false, <CapabilityIdentifier, CapabilityProperties>{})
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CapabilityIdentifier.jmapSubmission: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapWebSocket: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapCore: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapMail: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse(
|
||||||
|
'urn:apache:james:params:jmap:mail:quota')): AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse(
|
||||||
|
'urn:apache:james:params:jmap:mail:shares')): AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapVacationResponse: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapMdn: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
},
|
||||||
|
UserName('bob@domain.tld'),
|
||||||
|
Uri.parse('http://domain.com/jmap'),
|
||||||
|
Uri.parse(
|
||||||
|
'http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'),
|
||||||
|
Uri.parse('http://domain.com/upload/{accountId}'),
|
||||||
|
Uri.parse(
|
||||||
|
'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'),
|
||||||
|
State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'));
|
||||||
|
expect(
|
||||||
|
() => requireCapability(
|
||||||
|
session,
|
||||||
|
AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
[CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]),
|
||||||
|
throwsA(const TypeMatcher<SessionMissingCapability>()));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('when accounts not have account with invalid accountId capability should throw', () {
|
||||||
|
final invalidId = Id("29883977c13473ae7cb7678ef767cbffabfc8a44a6e463d971d23a65c1dc4af6");
|
||||||
|
final session = Session(
|
||||||
|
{
|
||||||
|
CapabilityIdentifier.jmapSubmission:
|
||||||
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
|
CapabilityIdentifier.jmapMail: MailCapability(
|
||||||
|
UnsignedInt(10000000),
|
||||||
|
null,
|
||||||
|
UnsignedInt(200),
|
||||||
|
UnsignedInt(20000000),
|
||||||
|
{"receivedAt", "sentAt", "size", "from", "to", "subject"},
|
||||||
|
true),
|
||||||
|
CapabilityIdentifier.jmapWebSocket:
|
||||||
|
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
|
||||||
|
Account(AccountName('bob@domain.tld'), true, false, {
|
||||||
|
CapabilityIdentifier.jmapSubmission:
|
||||||
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
|
CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
|
||||||
|
true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
|
CapabilityIdentifier.jmapMail: MailCapability(
|
||||||
|
UnsignedInt(10000000),
|
||||||
|
null,
|
||||||
|
UnsignedInt(200),
|
||||||
|
UnsignedInt(20000000),
|
||||||
|
{"receivedAt", "sentAt", "size", "from", "to", "subject"},
|
||||||
|
true),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CapabilityIdentifier.jmapSubmission: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapWebSocket: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapCore: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapMail: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse(
|
||||||
|
'urn:apache:james:params:jmap:mail:quota')): AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse(
|
||||||
|
'urn:apache:james:params:jmap:mail:shares')): AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapVacationResponse: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapMdn: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
},
|
||||||
|
UserName('bob@domain.tld'),
|
||||||
|
Uri.parse('http://domain.com/jmap'),
|
||||||
|
Uri.parse(
|
||||||
|
'http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'),
|
||||||
|
Uri.parse('http://domain.com/upload/{accountId}'),
|
||||||
|
Uri.parse(
|
||||||
|
'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'),
|
||||||
|
State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'));
|
||||||
|
expect(
|
||||||
|
() => requireCapability(
|
||||||
|
session,
|
||||||
|
AccountId(invalidId),
|
||||||
|
[CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]),
|
||||||
|
throwsA(const TypeMatcher<InvalidCapability>()));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('when accounts empty should throw exception', () {
|
||||||
|
final session = Session(
|
||||||
|
{
|
||||||
|
CapabilityIdentifier.jmapSubmission:
|
||||||
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
|
CapabilityIdentifier.jmapMail: MailCapability(
|
||||||
|
UnsignedInt(10000000),
|
||||||
|
null,
|
||||||
|
UnsignedInt(200),
|
||||||
|
UnsignedInt(20000000),
|
||||||
|
{"receivedAt", "sentAt", "size", "from", "to", "subject"},
|
||||||
|
true),
|
||||||
|
CapabilityIdentifier.jmapWebSocket:
|
||||||
|
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
|
DefaultCapability(<String, dynamic>{}),
|
||||||
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
CapabilityIdentifier.jmapSubmission: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapWebSocket: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapCore: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapMail: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse(
|
||||||
|
'urn:apache:james:params:jmap:mail:quota')): AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier(
|
||||||
|
Uri.parse(
|
||||||
|
'urn:apache:james:params:jmap:mail:shares')): AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapVacationResponse: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
CapabilityIdentifier.jmapMdn: AccountId(Id(
|
||||||
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
},
|
||||||
|
UserName('bob@domain.tld'),
|
||||||
|
Uri.parse('http://domain.com/jmap'),
|
||||||
|
Uri.parse(
|
||||||
|
'http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'),
|
||||||
|
Uri.parse('http://domain.com/upload/{accountId}'),
|
||||||
|
Uri.parse(
|
||||||
|
'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'),
|
||||||
|
State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'));
|
||||||
|
expect(
|
||||||
|
() => requireCapability(
|
||||||
|
session,
|
||||||
|
AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
[CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]),
|
||||||
|
throwsA(const TypeMatcher<InvalidCapability>()));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('when session have all required capabilities exception should not throw', () {
|
||||||
|
final session = Session(
|
||||||
|
{
|
||||||
|
CapabilityIdentifier.jmapSubmission:
|
||||||
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
CapabilityIdentifier.jmapCore: CoreCapability(
|
CapabilityIdentifier.jmapCore: CoreCapability(
|
||||||
UnsignedInt(20971520),
|
UnsignedInt(20971520),
|
||||||
UnsignedInt(4),
|
UnsignedInt(4),
|
||||||
@@ -138,10 +348,10 @@ void main() {
|
|||||||
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')),
|
WebSocketCapability(true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
CapabilityIdentifier.jmapMdn: MdnCapability()
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
},
|
},
|
||||||
@@ -150,7 +360,7 @@ void main() {
|
|||||||
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
|
'29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')):
|
||||||
Account(AccountName('bob@domain.tld'), true, false, {
|
Account(AccountName('bob@domain.tld'), true, false, {
|
||||||
CapabilityIdentifier.jmapSubmission:
|
CapabilityIdentifier.jmapSubmission:
|
||||||
SubmissionCapability(UnsignedInt(0), Set()),
|
SubmissionCapability(UnsignedInt(0), {}),
|
||||||
CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
|
CapabilityIdentifier.jmapWebSocket: WebSocketCapability(
|
||||||
true, Uri.parse('ws://domain.com/jmap/ws')),
|
true, Uri.parse('ws://domain.com/jmap/ws')),
|
||||||
CapabilityIdentifier.jmapCore: CoreCapability(
|
CapabilityIdentifier.jmapCore: CoreCapability(
|
||||||
@@ -171,10 +381,10 @@ void main() {
|
|||||||
true),
|
true),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
Uri.parse('urn:apache:james:params:jmap:mail:quota')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier(
|
CapabilityIdentifier(
|
||||||
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
Uri.parse('urn:apache:james:params:jmap:mail:shares')):
|
||||||
DefaultCapability(Map<String, dynamic>()),
|
DefaultCapability(<String, dynamic>{}),
|
||||||
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
CapabilityIdentifier.jmapVacationResponse: VacationCapability(),
|
||||||
CapabilityIdentifier.jmapMdn: MdnCapability()
|
CapabilityIdentifier.jmapMdn: MdnCapability()
|
||||||
})
|
})
|
||||||
@@ -212,7 +422,10 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
() => requireCapability(session, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]),
|
() => requireCapability(
|
||||||
|
session,
|
||||||
|
AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
|
||||||
|
[CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]),
|
||||||
returnsNormally);
|
returnsNormally);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user