JAMES-1785 Adding tests for GetMessages on message in multiple mailboxes
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/bd6bd223 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/bd6bd223 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/bd6bd223 Branch: refs/heads/master Commit: bd6bd22379434ca494ea774fad9b70f68d607c37 Parents: d409d2b Author: Benoit Tellier <btell...@linagora.com> Authored: Wed Jan 18 09:40:07 2017 +0700 Committer: Quynh Nguyen <qngu...@linagora.com> Committed: Tue Jan 24 09:58:20 2017 +0700 ---------------------------------------------------------------------- .../james/jmap/methods/GetMessagesMethod.java | 22 +++++++--- .../apache/james/jmap/methods/JmapResponse.java | 2 +- .../james/jmap/model/GetMessagesResponse.java | 7 ++++ .../org/apache/james/jmap/model/Message.java | 7 ++++ .../apache/james/jmap/model/MessageFactory.java | 26 +++++++----- .../jmap/methods/GetMessagesMethodTest.java | 42 ++++++++++++++++++++ 6 files changed, 90 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/bd6bd223/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java index 15fbceb..41f68ae 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java @@ -39,7 +39,9 @@ import org.apache.james.jmap.model.MessageProperties.HeaderProperty; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageIdManager; import org.apache.james.mailbox.model.FetchGroupImpl; +import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; +import org.apache.james.mailbox.model.MessageResult; import com.fasterxml.jackson.databind.ser.PropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; @@ -104,7 +106,7 @@ public class GetMessagesMethod implements Method { } private GetMessagesResponse getMessagesResponse(MailboxSession mailboxSession, GetMessagesRequest getMessagesRequest) { - getMessagesRequest.getAccountId().ifPresent(GetMessagesMethod::notImplemented); + getMessagesRequest.getAccountId().ifPresent((input) -> notImplemented()); Function<MessageId, Stream<MetaDataWithContent>> loadMessages = loadMessage(mailboxSession); Function<MetaDataWithContent, Message> convertToJmapMessage = Throwing.function(messageFactory::fromMetaDataWithContent).sneakyThrow(); @@ -117,18 +119,28 @@ public class GetMessagesMethod implements Method { return GetMessagesResponse.builder().messages(result).expectedMessageIds(getMessagesRequest.getIds()).build(); } - private static void notImplemented(String input) { + private static void notImplemented() { throw new NotImplementedException(); } private Function<MessageId, Stream<MetaDataWithContent>> loadMessage(MailboxSession mailboxSession) { - ThrowingFunction<MessageId, Stream<MetaDataWithContent>> toMetaDataWithContentStream = (MessageId messageId) -> { - return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.FULL_CONTENT, mailboxSession) + ThrowingFunction<MessageId, Stream<MetaDataWithContent>> toMetaDataWithContentStream = + (MessageId messageId) -> { + ImmutableList<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.FULL_CONTENT, mailboxSession) .stream() + .collect(Guavate.toImmutableList()); + List<MailboxId> mailboxIds = messageResults.stream() + .map(MessageResult::getMailboxId) + .collect(Guavate.toImmutableList()); + return messageResults.stream() + .findFirst() + .map(Stream::of) + .orElse(Stream.of()) .map(Throwing.function(MetaDataWithContent::builderFromMessageResult).sneakyThrow()) .map(builder -> builder.messageId(messageId)) + .map(builder -> builder.mailboxIds(mailboxIds)) .map(MetaDataWithContent.Builder::build); - }; + }; return Throwing.function(toMetaDataWithContentStream).sneakyThrow(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/bd6bd223/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java index bab4dbc..6a80c43 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java @@ -118,7 +118,7 @@ public class JmapResponse { return method; } - public Object getResponse() { + public Method.Response getResponse() { return response; } http://git-wip-us.apache.org/repos/asf/james-project/blob/bd6bd223/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMessagesResponse.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMessagesResponse.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMessagesResponse.java index e09335b..a561d29 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMessagesResponse.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMessagesResponse.java @@ -25,6 +25,7 @@ import java.util.stream.Collectors; import org.apache.james.jmap.methods.Method; import org.apache.james.mailbox.model.MessageId; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -47,6 +48,12 @@ public class GetMessagesResponse implements Method.Response { this.messages = ImmutableList.of(); } + @JsonIgnore + public Builder message(Message message) { + this.messages = ImmutableList.of(message); + return this; + } + public Builder messages(List<Message> messages) { this.messages = ImmutableList.copyOf(messages); return this; http://git-wip-us.apache.org/repos/asf/james-project/blob/bd6bd223/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java index 6b673bd..f504871 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.model; import java.time.ZonedDateTime; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Optional; @@ -31,6 +32,7 @@ import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import com.google.common.annotations.VisibleForTesting; @@ -101,6 +103,11 @@ public class Message { return this.mailboxIds(ImmutableList.of(mailboxId)); } + @JsonIgnore + public Builder mailboxIds(MailboxId... mailboxIds) { + return this.mailboxIds(Arrays.asList((mailboxIds))); + } + public Builder mailboxIds(List<MailboxId> mailboxIds) { this.mailboxIds = ImmutableList.copyOf(mailboxIds); return this; http://git-wip-us.apache.org/repos/asf/james-project/blob/bd6bd223/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java index 1bb5942..bc92fc5 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java @@ -55,6 +55,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; import com.google.common.collect.Multimaps; public class MessageFactory { @@ -80,7 +81,7 @@ public class MessageFactory { .id(message.getMessageId()) .blobId(BlobId.of(String.valueOf(message.getUid().asLong()))) .threadId(message.getMessageId().serialize()) - .mailboxIds(ImmutableList.of(message.getMailboxId())) + .mailboxIds(message.getMailboxIds()) .inReplyToMessageId(getHeader(mimeMessage, "in-reply-to")) .isUnread(! message.getFlags().contains(Flags.Flag.SEEN)) .isFlagged(message.getFlags().contains(Flags.Flag.FLAGGED)) @@ -234,7 +235,7 @@ public class MessageFactory { private InputStream content; private SharedInputStream sharedContent; private List<MessageAttachment> attachments; - private MailboxId mailboxId; + private List<MailboxId> mailboxIds = Lists.newArrayList(); private MessageId messageId; public Builder uid(MessageUid uid) { @@ -278,7 +279,12 @@ public class MessageFactory { } public Builder mailboxId(MailboxId mailboxId) { - this.mailboxId = mailboxId; + this.mailboxIds.add(mailboxId); + return this; + } + + public Builder mailboxIds(List<MailboxId> mailboxIds) { + this.mailboxIds.addAll(mailboxIds); return this; } @@ -297,9 +303,9 @@ public class MessageFactory { Preconditions.checkArgument(internalDate != null); Preconditions.checkArgument(content != null ^ sharedContent != null); Preconditions.checkArgument(attachments != null); - Preconditions.checkArgument(mailboxId != null); + Preconditions.checkArgument(mailboxIds != null); Preconditions.checkArgument(messageId != null); - return new MetaDataWithContent(uid, modSeq, flags, size, internalDate, content, sharedContent, attachments, mailboxId, messageId); + return new MetaDataWithContent(uid, modSeq, flags, size, internalDate, content, sharedContent, attachments, mailboxIds, messageId); } } @@ -311,10 +317,10 @@ public class MessageFactory { private final InputStream content; private final SharedInputStream sharedContent; private final List<MessageAttachment> attachments; - private final MailboxId mailboxId; + private final List<MailboxId> mailboxIds; private final MessageId messageId; - private MetaDataWithContent(MessageUid uid, long modSeq, Flags flags, long size, Date internalDate, InputStream content, SharedInputStream sharedContent, List<MessageAttachment> attachments, MailboxId mailboxId, MessageId messageId) { + private MetaDataWithContent(MessageUid uid, long modSeq, Flags flags, long size, Date internalDate, InputStream content, SharedInputStream sharedContent, List<MessageAttachment> attachments, List<MailboxId> mailboxIds, MessageId messageId) { this.uid = uid; this.modSeq = modSeq; this.flags = flags; @@ -323,7 +329,7 @@ public class MessageFactory { this.content = content; this.sharedContent = sharedContent; this.attachments = attachments; - this.mailboxId = mailboxId; + this.mailboxIds = mailboxIds; this.messageId = messageId; } @@ -364,8 +370,8 @@ public class MessageFactory { return attachments; } - public MailboxId getMailboxId() { - return mailboxId; + public List<MailboxId> getMailboxIds() { + return mailboxIds; } public MessageId getMessageId() { http://git-wip-us.apache.org/repos/asf/james-project/blob/bd6bd223/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java index 1147240..dbd34ec 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; +import java.time.ZonedDateTime; import java.util.Date; import java.util.List; import java.util.Locale; @@ -45,13 +46,21 @@ import org.apache.james.jmap.model.MessagePreviewGenerator; import org.apache.james.jmap.model.MessageProperties.MessageProperty; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageIdManager; import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.acl.GroupMembershipResolver; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.inmemory.InMemoryMessageIdManager; import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources; import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.ComposedMessageId; +import org.apache.james.mailbox.model.FetchGroupImpl; +import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.model.MessageResult; +import org.apache.james.mailbox.store.MessageResultImpl; +import org.apache.james.mailbox.store.mail.MessageIdMapper; import org.assertj.core.api.Condition; import org.assertj.core.data.MapEntry; import org.assertj.core.groups.Tuple; @@ -105,6 +114,7 @@ public class GetMessagesMethodTest { private MailboxSession session; private MailboxPath inboxPath; + private MailboxPath customMailboxPath; private ClientId clientId; @Before @@ -121,7 +131,9 @@ public class GetMessagesMethodTest { session = new MockMailboxSession(ROBERT.username); inboxPath = MailboxPath.inbox(session); + customMailboxPath = new MailboxPath(inboxPath, "custom"); mailboxManager.createMailbox(inboxPath, session); + mailboxManager.createMailbox(customMailboxPath, session); testee = new GetMessagesMethod(messageFactory, inMemoryIntegrationResources.createMessageIdManager(mailboxManager)); } @@ -346,4 +358,34 @@ public class GetMessagesMethodTest { String response = objectMapper.writer().writeValueAsString(result.get(0)); assertThat(JsonPath.parse(response).<Map<String, String>>read("$.response.list[0].headers")).containsOnly(MapEntry.entry("From", "u...@domain.tld"), MapEntry.entry("HEADer2", "Header2Content")); } + + @Test + public void processShouldReturnOneMessageWhenMessageInSeveralMailboxes() throws Exception { + MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); + Date now = new Date(); + ByteArrayInputStream message1Content = new ByteArrayInputStream(("From: u...@domain.tld\r\n" + + "header1: Header1Content\r\n" + + "HEADer2: Header2Content\r\n" + + "Subject: message 1 subject\r\n\r\nmy message").getBytes(Charsets.UTF_8)); + ComposedMessageId message1 = inbox.appendMessage(message1Content, now, session, false, null); + MessageIdManager messageIdManager = new InMemoryMessageIdManager(mailboxManager); + MailboxId customMailboxId = mailboxManager.getMailbox(customMailboxPath, session).getId(); + messageIdManager.setInMailboxes(message1.getMessageId(), + ImmutableList.of(message1.getMailboxId(), customMailboxId), + session); + + GetMessagesRequest request = GetMessagesRequest.builder() + .ids(ImmutableList.of(message1.getMessageId())) + .properties(ImmutableList.of("mailboxIds")) + .build(); + + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); + + assertThat(result).hasSize(1); + Method.Response response = result.get(0).getResponse(); + assertThat(response).isInstanceOf(GetMessagesResponse.class); + GetMessagesResponse getMessagesResponse = (GetMessagesResponse) response; + assertThat(getMessagesResponse.list()).hasSize(1); + assertThat(getMessagesResponse.list().get(0).getMailboxIds()).containsOnly(customMailboxId, message1.getMailboxId()); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org