TF-939 Depend on accountCapabilities to delete multiple mailboxes

This commit is contained in:
Dat PHAM HOANG
2022-09-13 16:41:00 +07:00
committed by Dat H. Pham
parent 3871b18f00
commit 48ae928b4e
6 changed files with 276 additions and 33 deletions
@@ -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));
} }
} }
+10 -4
View File
@@ -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);
} }
} }
+9 -2
View File
@@ -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);
}
} }
+238 -25
View File
@@ -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);
}); });
}); });