Skip to content

Commit 0f3bd09

Browse files
committed
[Fastmail interoperation] Add empty_capability.dart to handle empty capability
1 parent a079c8a commit 0f3bd09

File tree

4 files changed

+173
-1
lines changed

4 files changed

+173
-1
lines changed

lib/http/converter/capabilities_converter.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart
33
import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart';
44
import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart';
55
import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart';
6+
import 'package:jmap_dart_client/jmap/core/capability/empty_capability.dart';
67
import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart';
78
import 'package:jmap_dart_client/jmap/core/capability/mdn_capability.dart';
89
import 'package:jmap_dart_client/jmap/core/capability/submission_capability.dart';
@@ -46,7 +47,11 @@ class CapabilitiesConverter {
4647

4748
final identifier = CapabilityIdentifier(Uri.parse(key));
4849
if (mapCapabilitiesConverter!.containsKey(identifier)) {
49-
return MapEntry(identifier, mapCapabilitiesConverter![identifier]!.call(value));
50+
try {
51+
return MapEntry(identifier, mapCapabilitiesConverter![identifier]!.call(value));
52+
} catch (e) {
53+
return MapEntry(identifier, EmptyCapability());
54+
}
5055
} else {
5156
return MapEntry(identifier, DefaultCapability(value));
5257
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart';
2+
import 'package:json_annotation/json_annotation.dart';
3+
4+
part 'empty_capability.g.dart';
5+
6+
@JsonSerializable()
7+
class EmptyCapability extends CapabilityProperties {
8+
EmptyCapability();
9+
10+
factory EmptyCapability.fromJson(Map<String, dynamic> json) => _$EmptyCapabilityFromJson(json);
11+
12+
Map<String, dynamic> toJson() => _$EmptyCapabilityToJson(this);
13+
14+
@override
15+
List<Object?> get props => [];
16+
}

lib/jmap/core/capability/empty_capability.g.dart

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/jmap/core/session/session_test.dart

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:jmap_dart_client/jmap/core/account/account.dart';
77
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
88
import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart';
99
import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart';
10+
import 'package:jmap_dart_client/jmap/core/capability/empty_capability.dart';
1011
import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart';
1112
import 'package:jmap_dart_client/jmap/core/capability/mdn_capability.dart';
1213
import 'package:jmap_dart_client/jmap/core/capability/submission_capability.dart';
@@ -845,4 +846,141 @@ void main() {
845846
expect(parsedSession.capabilities[TestCapability.testCapabilityIdentifier], equals(testCapability));
846847
});
847848
});
849+
850+
group('get session with empty capability', () {
851+
test('get should ignore parsing empty capability properties', () {
852+
final sessionString = '''{
853+
"capabilities": {
854+
"urn:ietf:params:jmap:submission": {
855+
"maxDelayedSend": 0,
856+
"submissionExtensions": []
857+
},
858+
"urn:ietf:params:jmap:core": {
859+
"maxSizeUpload": 20971520,
860+
"maxConcurrentUpload": 4,
861+
"maxSizeRequest": 10000000,
862+
"maxConcurrentRequests": 4,
863+
"maxCallsInRequest": 16,
864+
"maxObjectsInGet": 500,
865+
"maxObjectsInSet": 500,
866+
"collationAlgorithms": [
867+
"i;unicode-casemap"
868+
]
869+
},
870+
"urn:ietf:params:jmap:mail": {}
871+
},
872+
"accounts": {
873+
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6": {
874+
"name": "[email protected]",
875+
"isPersonal": true,
876+
"isReadOnly": false,
877+
"accountCapabilities": {
878+
"urn:ietf:params:jmap:submission": {
879+
"maxDelayedSend": 0,
880+
"submissionExtensions": []
881+
},
882+
"urn:ietf:params:jmap:core": {
883+
"maxSizeUpload": 20971520,
884+
"maxConcurrentUpload": 4,
885+
"maxSizeRequest": 10000000,
886+
"maxConcurrentRequests": 4,
887+
"maxCallsInRequest": 16,
888+
"maxObjectsInGet": 500,
889+
"maxObjectsInSet": 500,
890+
"collationAlgorithms": [
891+
"i;unicode-casemap"
892+
]
893+
},
894+
"urn:ietf:params:jmap:mail": {
895+
"maxMailboxesPerEmail": 10000000,
896+
"maxMailboxDepth": null,
897+
"maxSizeMailboxName": 200,
898+
"maxSizeAttachmentsPerEmail": 20000000,
899+
"emailQuerySortOptions": [
900+
"receivedAt",
901+
"sentAt",
902+
"size",
903+
"from",
904+
"to",
905+
"subject"
906+
],
907+
"mayCreateTopLevelMailbox": true
908+
}
909+
}
910+
}
911+
},
912+
"primaryAccounts": {
913+
"urn:ietf:params:jmap:submission": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
914+
"urn:ietf:params:jmap:core": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
915+
"urn:ietf:params:jmap:mail": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6"
916+
},
917+
"username": "[email protected]",
918+
"apiUrl": "http://domain.com/jmap",
919+
"downloadUrl": "http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}",
920+
"uploadUrl": "http://domain.com/upload/{accountId}",
921+
"eventSourceUrl": "http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}",
922+
"state": "2c9f1b12-b35a-43e6-9af2-0106fb53a943"
923+
}''';
924+
925+
final Session expectedSession = Session(
926+
{
927+
CapabilityIdentifier.jmapSubmission: SubmissionCapability(UnsignedInt(0), Set()),
928+
CapabilityIdentifier.jmapCore: CoreCapability(
929+
UnsignedInt(20971520),
930+
UnsignedInt(4),
931+
UnsignedInt(10000000),
932+
UnsignedInt(4),
933+
UnsignedInt(16),
934+
UnsignedInt(500),
935+
UnsignedInt(500),
936+
{CollationIdentifier("i;unicode-casemap")}
937+
),
938+
CapabilityIdentifier.jmapMail: EmptyCapability(),
939+
},
940+
{
941+
AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')): Account(
942+
AccountName('[email protected]'),
943+
true,
944+
false,
945+
{
946+
CapabilityIdentifier.jmapSubmission: SubmissionCapability(UnsignedInt(0), Set()),
947+
CapabilityIdentifier.jmapCore: CoreCapability(
948+
UnsignedInt(20971520),
949+
UnsignedInt(4),
950+
UnsignedInt(10000000),
951+
UnsignedInt(4),
952+
UnsignedInt(16),
953+
UnsignedInt(500),
954+
UnsignedInt(500),
955+
{CollationIdentifier("i;unicode-casemap")}
956+
),
957+
CapabilityIdentifier.jmapMail: MailCapability(
958+
UnsignedInt(10000000),
959+
null,
960+
UnsignedInt(200),
961+
UnsignedInt(20000000),
962+
{"receivedAt", "sentAt", "size", "from", "to", "subject"},
963+
true
964+
),
965+
}
966+
)
967+
},
968+
{
969+
CapabilityIdentifier.jmapSubmission: AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
970+
CapabilityIdentifier.jmapCore: AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
971+
CapabilityIdentifier.jmapMail: AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')),
972+
},
973+
UserName('[email protected]'),
974+
Uri.parse('http://domain.com/jmap'),
975+
Uri.parse('http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'),
976+
Uri.parse('http://domain.com/upload/{accountId}'),
977+
Uri.parse('http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'),
978+
State('2c9f1b12-b35a-43e6-9af2-0106fb53a943')
979+
);
980+
981+
final parsedSession = Session.fromJson(json.decode(sessionString));
982+
983+
expect(parsedSession, equals(expectedSession));
984+
});
985+
});
848986
}

0 commit comments

Comments
 (0)