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

Reply via email to