Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions lib/http/converter/namespace_nullable_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:jmap_dart_client/jmap/mail/mailbox/namespace.dart';
import 'package:json_annotation/json_annotation.dart';

class NamespaceNullableConverter implements JsonConverter<Namespace?, String?> {
const NamespaceNullableConverter();

@override
Namespace? fromJson(String? json) => json != null ? Namespace(json) : null;

@override
String? toJson(Namespace? object) => object?.value;
}
1 change: 1 addition & 0 deletions lib/jmap/core/capability/capability_identifier.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class CapabilityIdentifier with EquatableMixin {
static final jmapWebSocket = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:websocket'));
static final jmapMdn = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:mdn'));
static final jmapQuota = CapabilityIdentifier(Uri.parse('urn:ietf:params:jmap:quota'));
static final jmapTeamMailboxes = CapabilityIdentifier(Uri.parse('urn:apache:james:params:jmap:mail:shares'));

final Uri value;

Expand Down
6 changes: 6 additions & 0 deletions lib/jmap/mail/mailbox/get/get_mailbox_method.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ class GetMailboxMethod extends GetMethod {
CapabilityIdentifier.jmapMail
};

Set<CapabilityIdentifier> get requiredCapabilitiesSupportTeamMailboxes => {
CapabilityIdentifier.jmapCore,
CapabilityIdentifier.jmapMail,
CapabilityIdentifier.jmapTeamMailboxes
};

@override
List<Object?> get props => [methodName, accountId, ids, properties, requiredCapabilities];

Expand Down
13 changes: 12 additions & 1 deletion lib/jmap/mail/mailbox/mailbox.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/http/converter/is_subscribed_converter.dart';
import 'package:jmap_dart_client/http/converter/mailbox_id_nullable_converter.dart';
import 'package:jmap_dart_client/http/converter/mailbox_name_converter.dart';
import 'package:jmap_dart_client/http/converter/namespace_nullable_converter.dart';
import 'package:jmap_dart_client/http/converter/role_converter.dart';
import 'package:jmap_dart_client/http/converter/sort_order_converter.dart';
import 'package:jmap_dart_client/http/converter/total_email_converter.dart';
Expand All @@ -12,10 +13,12 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox_rights.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/namespace.dart';
import 'package:json_annotation/json_annotation.dart';

part 'mailbox.g.dart';

@NamespaceNullableConverter()
@IsSubscribedConverter()
@UnreadThreadsConverter()
@UnreadEmailsConverter()
Expand Down Expand Up @@ -65,6 +68,12 @@ class Mailbox with EquatableMixin {
@JsonKey(includeIfNull: false)
final IsSubscribed? isSubscribed;

@JsonKey(includeIfNull: false)
final Namespace? namespace;

@JsonKey(includeIfNull: false)
final Map<String, List<String>?>? rights;

Mailbox({
this.id,
this.name,
Expand All @@ -76,7 +85,9 @@ class Mailbox with EquatableMixin {
this.totalThreads,
this.unreadThreads,
this.myRights,
this.isSubscribed
this.isSubscribed,
this.namespace,
this.rights
});

factory Mailbox.fromJson(Map<String, dynamic> json) => _$MailboxFromJson(json);
Expand Down
9 changes: 9 additions & 0 deletions lib/jmap/mail/mailbox/mailbox.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions lib/jmap/mail/mailbox/namespace.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

import 'package:equatable/equatable.dart';

class Namespace with EquatableMixin {

final String value;

Namespace(this.value);

@override
List<Object?> get props => [value];
}
258 changes: 258 additions & 0 deletions test/jmap/mailbox/get/get_mailbox_method_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
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/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/jmap_request.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_method.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox_rights.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/namespace.dart';

void main() {
group('test to json get mailbox method', () {
final expectedMailbox1 = Mailbox(
id: MailboxId(Id('f1cef2d0-30a9-11eb-9a8d-254ee97830fe')),
role: Role('inbox'),
name: MailboxName('INBOX'),
sortOrder: SortOrder(sortValue: 10),
totalEmails: TotalEmails(UnsignedInt(1847)),
unreadEmails: UnreadEmails(UnsignedInt(1708)),
totalThreads: TotalThreads(UnsignedInt(1847)),
unreadThreads: UnreadThreads(UnsignedInt(1708)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true,
),
isSubscribed: IsSubscribed(false),
rights: {
"[email protected]": [
"i",
"l",
"r",
"s",
"t",
"w"
]
},
namespace: Namespace('Personal')
);

final expectedMailbox2 = Mailbox(
id: MailboxId(Id('f1cef2d0-30a9-11eb-9a8d-254ee97830fe')),
role: Role('inbox'),
name: MailboxName('INBOX'),
sortOrder: SortOrder(sortValue: 10),
totalEmails: TotalEmails(UnsignedInt(1847)),
unreadEmails: UnreadEmails(UnsignedInt(1708)),
totalThreads: TotalThreads(UnsignedInt(1847)),
unreadThreads: UnreadThreads(UnsignedInt(1708)),
myRights: MailboxRights(
true,
true,
true,
true,
true,
true,
true,
true,
true,
),
isSubscribed: IsSubscribed(false)
);

test('get mailbox method and response parsing has team mailboxes', () async {
final baseOption = BaseOptions(method: 'POST');
final dio = Dio(baseOption)
..options.baseUrl = 'http://domain.com/jmap';
final dioAdapter = DioAdapter(dio: dio);
dioAdapter.onPost(
'',
(server) => server.reply(200, {
"sessionState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943",
"methodResponses": [
[
"Mailbox/get",
{
"accountId": "0d14dbabe6482aff5cbf922e04cef51a40b4eabccbe12d28fe27c97038752555",
"notFound": [

],
"state": "c7b1bb10-80f5-11ed-b960-5773e4d60b2f",
"list": [
{
"totalThreads": 1847,
"name": "INBOX",
"isSubscribed": false,
"role": "inbox",
"totalEmails": 1847,
"unreadThreads": 1708,
"unreadEmails": 1708,
"sortOrder": 10,
"rights": {
"[email protected]": [
"i",
"l",
"r",
"s",
"t",
"w"
]
},
"namespace": "Personal",
"myRights": {
"mayReadItems": true,
"mayAddItems": true,
"mayRemoveItems": true,
"maySetSeen": true,
"maySetKeywords": true,
"mayCreateChild": true,
"mayRename": true,
"mayDelete": true,
"maySubmit": true
},
"id": "f1cef2d0-30a9-11eb-9a8d-254ee97830fe"
}
]
},
"c0"
]
]
}),
data: {
"using": [
"urn:ietf:params:jmap:core",
"urn:ietf:params:jmap:mail",
"urn:apache:james:params:jmap:mail:shares"
],
"methodCalls": [
[
"Mailbox/get",
{
"accountId": "0d14dbabe6482aff5cbf922e04cef51a40b4eabccbe12d28fe27c97038752555"
},
"c0"
]
]
},
headers: {
"accept": "application/json;jmapVersion=rfc-8621",
"content-type": "application/json; charset=utf-8",
"content-length": 228
}
);

final getMailboxMethod = GetMailboxMethod(AccountId(Id('0d14dbabe6482aff5cbf922e04cef51a40b4eabccbe12d28fe27c97038752555')));
final httpClient = HttpClient(dio);
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
final getMailboxInvocation = requestBuilder.invocation(getMailboxMethod);
final response = await (requestBuilder
..usings(getMailboxMethod.requiredCapabilitiesSupportTeamMailboxes))
.build()
.execute();

final getMailboxResponse = response.parse<GetMailboxResponse>(
getMailboxInvocation.methodCallId,
GetMailboxResponse.deserialize);

expect(getMailboxResponse?.list.length, equals(1));
expect(getMailboxResponse?.list, containsAll([expectedMailbox1]));
});

test('get mailbox method and response parsing not have team mailboxes', () async {
final baseOption = BaseOptions(method: 'POST');
final dio = Dio(baseOption)
..options.baseUrl = 'http://domain.com/jmap';
final dioAdapter = DioAdapter(dio: dio);
dioAdapter.onPost(
'',
(server) => server.reply(200, {
"sessionState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943",
"methodResponses": [
[
"Mailbox/get",
{
"accountId": "0d14dbabe6482aff5cbf922e04cef51a40b4eabccbe12d28fe27c97038752555",
"notFound": [

],
"state": "c7b1bb10-80f5-11ed-b960-5773e4d60b2f",
"list": [
{
"totalThreads": 1847,
"name": "INBOX",
"isSubscribed": false,
"role": "inbox",
"totalEmails": 1847,
"unreadThreads": 1708,
"unreadEmails": 1708,
"sortOrder": 10,
"myRights": {
"mayReadItems": true,
"mayAddItems": true,
"mayRemoveItems": true,
"maySetSeen": true,
"maySetKeywords": true,
"mayCreateChild": true,
"mayRename": true,
"mayDelete": true,
"maySubmit": true
},
"id": "f1cef2d0-30a9-11eb-9a8d-254ee97830fe"
}
]
},
"c0"
]
]
}),
data: {
"using": [
"urn:ietf:params:jmap:core",
"urn:ietf:params:jmap:mail"
],
"methodCalls": [
[
"Mailbox/get",
{
"accountId": "0d14dbabe6482aff5cbf922e04cef51a40b4eabccbe12d28fe27c97038752555"
},
"c0"
]
]
},
headers: {
"accept": "application/json;jmapVersion=rfc-8621",
"content-type": "application/json; charset=utf-8",
"content-length": 185
}
);

final getMailboxMethod = GetMailboxMethod(AccountId(Id('0d14dbabe6482aff5cbf922e04cef51a40b4eabccbe12d28fe27c97038752555')));
final httpClient = HttpClient(dio);
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
final getMailboxInvocation = requestBuilder.invocation(getMailboxMethod);
final response = await (requestBuilder
..usings(getMailboxMethod.requiredCapabilities))
.build()
.execute();

final getMailboxResponse = response.parse<GetMailboxResponse>(
getMailboxInvocation.methodCallId,
GetMailboxResponse.deserialize);

expect(getMailboxResponse?.list.length, equals(1));
expect(getMailboxResponse?.list, containsAll([expectedMailbox2]));
});
});
}