JAMES-1785 GetMessages with multiple mailboxes integration tests Also includes builder enhancements
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9875a46b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9875a46b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9875a46b Branch: refs/heads/master Commit: 9875a46b7920371a9103eeb60306f3d54563d154 Parents: bd6bd22 Author: Benoit Tellier <btell...@linagora.com> Authored: Wed Jan 18 10:25:04 2017 +0700 Committer: Quynh Nguyen <qngu...@linagora.com> Committed: Tue Jan 24 09:58:20 2017 +0700 ---------------------------------------------------------------------- .../org/apache/james/utils/JmapGuiceProbe.java | 23 ++++++++++++++- .../cucumber/GetMessagesMethodStepdefs.java | 31 ++++++++++++++++++++ .../test/resources/cucumber/GetMessages.feature | 9 ++++++ .../james/jmap/methods/GetMessagesMethod.java | 1 + .../org/apache/james/jmap/model/Message.java | 8 +++-- .../apache/james/jmap/model/MessageFactory.java | 11 +++---- .../james/jmap/model/MessageFactoryTest.java | 2 +- .../apache/james/jmap/model/MessageTest.java | 24 +++++++-------- .../jmap/model/SetMessagesResponseTest.java | 4 +-- 9 files changed, 89 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/JmapGuiceProbe.java ---------------------------------------------------------------------- diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/JmapGuiceProbe.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/JmapGuiceProbe.java index cfbbbb6..05e1646 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/JmapGuiceProbe.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/JmapGuiceProbe.java @@ -19,6 +19,8 @@ package org.apache.james.utils; +import java.util.Arrays; + import javax.inject.Inject; import org.apache.james.jmap.JMAPServer; @@ -26,16 +28,30 @@ import org.apache.james.jmap.api.vacation.AccountId; import org.apache.james.jmap.api.vacation.Vacation; import org.apache.james.jmap.api.vacation.VacationPatch; import org.apache.james.jmap.api.vacation.VacationRepository; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageIdManager; +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.MailboxId; +import org.apache.james.mailbox.model.MessageId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class JmapGuiceProbe implements GuiceProbe { + private static final Logger LOGGER = LoggerFactory.getLogger(JmapGuiceProbe.class); + private final VacationRepository vacationRepository; private final JMAPServer jmapServer; + private final MessageIdManager messageIdManager; + private final MailboxManager mailboxManager; @Inject - private JmapGuiceProbe(VacationRepository vacationRepository, JMAPServer jmapServer) { + private JmapGuiceProbe(VacationRepository vacationRepository, JMAPServer jmapServer, MessageIdManager messageIdManager, MailboxManager mailboxManager) { this.vacationRepository = vacationRepository; this.jmapServer = jmapServer; + this.messageIdManager = messageIdManager; + this.mailboxManager = mailboxManager; } public int getJmapPort() { @@ -49,4 +65,9 @@ public class JmapGuiceProbe implements GuiceProbe { public Vacation retrieveVacation(AccountId accountId) { return vacationRepository.retrieveVacation(accountId).join(); } + + public void setInMailboxes(MessageId messageId, String username, MailboxId... mailboxIds) throws MailboxException { + MailboxSession mailboxSession = mailboxManager.createSystemSession(username, LOGGER); + messageIdManager.setInMailboxes(messageId, Arrays.asList(mailboxIds), mailboxSession); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java index 26b1e29..85c38d8 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java @@ -41,13 +41,16 @@ import org.apache.http.HttpResponse; import org.apache.http.client.fluent.Request; import org.apache.james.jmap.methods.integration.cucumber.util.TableRow; import org.apache.james.mailbox.model.MailboxConstants; +import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MessageId; import org.javatuples.Pair; +import com.github.fge.lambdas.Throwing; import com.github.steveash.guavate.Guavate; import com.google.common.base.Charsets; import com.google.common.base.Joiner; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.DocumentContext; @@ -59,6 +62,7 @@ import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.runtime.java.guice.ScenarioScoped; +import net.minidev.json.JSONArray; @ScenarioScoped public class GetMessagesMethodStepdefs { @@ -87,6 +91,16 @@ public class GetMessagesMethodStepdefs { this.messageIdsByName = new HashMap<>(); } + @Given("^the user has a message \"([^\"]*)\" in \"([^\"]*)\" and \"([^\"]*)\" mailboxes with subject \"([^\"]*)\", content \"([^\"]*)\"$") + public void appendMessageInTwoMailboxes(String messageName, String mailbox1, String mailbox2, String subject, String content) throws Throwable { + MessageId id = appendMessage(mailbox1, ContentType.noContentType(), subject, content, NO_HEADERS); + MailboxId mailboxId1 = mainStepdefs.jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, userStepdefs.lastConnectedUser, mailbox1).getMailboxId(); + MailboxId mailboxId2 = mainStepdefs.jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, userStepdefs.lastConnectedUser, mailbox2).getMailboxId(); + + mainStepdefs.jmapServer.getJmapProbe().setInMailboxes(id, userStepdefs.lastConnectedUser, mailboxId1, mailboxId2); + messageIdsByName.put(messageName, id); + } + @Given("^the user has a message \"([^\"]*)\" in \"([^\"]*)\" mailbox with subject \"([^\"]*)\", content \"([^\"]*)\"$") public void appendMessage(String messageName, String mailbox, String subject, String content) throws Throwable { MessageId id = appendMessage(mailbox, ContentType.noContentType(), subject, content, NO_HEADERS); @@ -315,6 +329,23 @@ public class GetMessagesMethodStepdefs { assertThat(jsonPath.<String>read(FIRST_MESSAGE + ".id")).isEqualTo(id.serialize()); } + @Then("^the message is in \"([^\"]*)\" mailboxes") + public void assertMailboxIdsOfTheFirstMessage(String mailboxIds) throws Throwable { + List<String> values = Splitter.on(",") + .splitToList(mailboxIds).stream() + .map(Throwing.function(name -> mainStepdefs.jmapServer + .serverProbe() + .getMailbox(MailboxConstants.USER_NAMESPACE, userStepdefs.lastConnectedUser, name) + .getMailboxId() + .serialize())) + .distinct() + .collect(Guavate.toImmutableList()); + + assertThat(jsonPath.<JSONArray>read(FIRST_MESSAGE + ".mailboxIds")) + .hasSize(2) + .containsOnlyElementsOf(values); + } + @Then("^the threadId of the message is \"([^\"]*)\"$") public void assertThreadIdOfTheFirstMessage(String threadId) throws Throwable { MessageId id = messageIdsByName.get(threadId); http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature index a559e08..d06a81a 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature @@ -7,6 +7,15 @@ Feature: GetMessages method And a connected user "usern...@domain.tld" And "usern...@domain.tld" has a mailbox "inbox" + Scenario: Retrieving a message in several mailboxes should return a single message in these mailboxes + Given "usern...@domain.tld" has a mailbox "custom" + And the user has a message "m1" in "inbox" and "custom" mailboxes with subject "my test subject", content "testmail" + When the user ask for messages "m1" + Then no error is returned + And the list should contain 1 message + And the id of the message is "m1" + And the message is in "custom,inbox" mailboxes + Scenario: Retrieving messages with a non null accountId should return a NotSupported error When the user ask for messages using its accountId Then an error "Not yet implemented" is returned http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/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 41f68ae..404e404 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 @@ -131,6 +131,7 @@ public class GetMessagesMethod implements Method { .collect(Guavate.toImmutableList()); List<MailboxId> mailboxIds = messageResults.stream() .map(MessageResult::getMailboxId) + .distinct() .collect(Guavate.toImmutableList()); return messageResults.stream() .findFirst() http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/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 f504871..5937560 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 @@ -21,6 +21,7 @@ package org.apache.james.jmap.model; import java.time.ZonedDateTime; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -99,16 +100,17 @@ public class Message { return this; } + @JsonIgnore public Builder mailboxId(MailboxId mailboxId) { - return this.mailboxIds(ImmutableList.of(mailboxId)); + return this.fluentMailboxIds(mailboxId); } @JsonIgnore - public Builder mailboxIds(MailboxId... mailboxIds) { + public Builder fluentMailboxIds(MailboxId... mailboxIds) { return this.mailboxIds(Arrays.asList((mailboxIds))); } - public Builder mailboxIds(List<MailboxId> mailboxIds) { + public Builder mailboxIds(Collection<MailboxId> mailboxIds) { this.mailboxIds = ImmutableList.copyOf(mailboxIds); return this; } http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/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 bc92fc5..9dc1acf 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 @@ -27,6 +27,7 @@ import java.util.Date; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.TimeZone; import java.util.function.Function; import java.util.stream.Collectors; @@ -55,8 +56,8 @@ 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; +import com.google.common.collect.Sets; public class MessageFactory { @@ -235,7 +236,7 @@ public class MessageFactory { private InputStream content; private SharedInputStream sharedContent; private List<MessageAttachment> attachments; - private List<MailboxId> mailboxIds = Lists.newArrayList(); + private Set<MailboxId> mailboxIds = Sets.newHashSet(); private MessageId messageId; public Builder uid(MessageUid uid) { @@ -317,10 +318,10 @@ public class MessageFactory { private final InputStream content; private final SharedInputStream sharedContent; private final List<MessageAttachment> attachments; - private final List<MailboxId> mailboxIds; + private final Set<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, List<MailboxId> mailboxIds, MessageId messageId) { + private MetaDataWithContent(MessageUid uid, long modSeq, Flags flags, long size, Date internalDate, InputStream content, SharedInputStream sharedContent, List<MessageAttachment> attachments, Set<MailboxId> mailboxIds, MessageId messageId) { this.uid = uid; this.modSeq = modSeq; this.flags = flags; @@ -370,7 +371,7 @@ public class MessageFactory { return attachments; } - public List<MailboxId> getMailboxIds() { + public Set<MailboxId> getMailboxIds() { return mailboxIds; } http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java index 9381043..c0bd1f3 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java @@ -148,7 +148,7 @@ public class MessageFactoryTest { .id(TestMessageId.of(2)) .blobId(BlobId.of("2")) .threadId("2") - .mailboxIds(ImmutableList.of(MAILBOX_ID)) + .mailboxId(MAILBOX_ID) .inReplyToMessageId("<snt124-w2664003139c1e520cf4f6787...@phx.gbl>") .headers(headersMap) .from(user) http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java index 7cb3db2..0407c36 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java @@ -60,41 +60,41 @@ public class MessageTest { @Test(expected=IllegalStateException.class) public void buildShouldThrowWhenHeadersIsNull() { - Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").mailboxIds(ImmutableList.of()).build(); + Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().build(); } @Test(expected=IllegalStateException.class) public void buildShouldThrowWhenSubjectIsNull() { - Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").mailboxIds(ImmutableList.of()).headers(ImmutableMap.of()).build(); + Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()).build(); } @Test(expected=IllegalStateException.class) public void buildShouldThrowWhenSubjectIsEmpty() { - Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").mailboxIds(ImmutableList.of()).headers(ImmutableMap.of()) + Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()) .subject("").build(); } @Test(expected=IllegalStateException.class) public void buildShouldThrowWhenSizeIsNull() { - Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").mailboxIds(ImmutableList.of()).headers(ImmutableMap.of()) + Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()) .subject("subject").build(); } @Test(expected=IllegalStateException.class) public void buildShouldThrowWhenDateIsNull() { - Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").mailboxIds(ImmutableList.of()).headers(ImmutableMap.of()) + Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()) .subject("subject").size(123).build(); } @Test(expected=IllegalStateException.class) public void buildShouldThrowWhenPreviewIsNull() { - Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").mailboxIds(ImmutableList.of()).headers(ImmutableMap.of()) + Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()) .subject("subject").size(123).date(ZonedDateTime.now()).build(); } @Test(expected=IllegalStateException.class) public void buildShouldThrowWhenPreviewIsEmpty() { - Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").mailboxIds(ImmutableList.of()).headers(ImmutableMap.of()) + Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()) .subject("subject").size(123).date(ZonedDateTime.now()).preview("").build(); } @@ -107,7 +107,7 @@ public class MessageTest { .id(TestMessageId.of(1)) .blobId(BlobId.of("blobId")) .threadId("threadId") - .mailboxIds(ImmutableList.of(InMemoryId.of(456))) + .mailboxId(InMemoryId.of(456)) .headers(ImmutableMap.of("key", "value")) .subject("subject") .size(123) @@ -131,7 +131,7 @@ public class MessageTest { .id(TestMessageId.of(1)) .blobId(BlobId.of("blobId")) .threadId("threadId") - .mailboxIds(ImmutableList.of(InMemoryId.of(456))) + .mailboxId(InMemoryId.of(456)) .headers(ImmutableMap.of("key", "value")) .subject("subject") .size(123) @@ -187,7 +187,7 @@ public class MessageTest { .id(TestMessageId.of(1)) .blobId(BlobId.of("blobId")) .threadId("threadId") - .mailboxIds(ImmutableList.of(InMemoryId.of(456))) + .mailboxId(InMemoryId.of(456)) .inReplyToMessageId("inReplyToMessageId") .isUnread(true) .isFlagged(true) @@ -217,7 +217,7 @@ public class MessageTest { .id(TestMessageId.of(1)) .blobId(BlobId.of("blobId")) .threadId("threadId") - .mailboxIds(ImmutableList.of(InMemoryId.of(456))) + .mailboxId(InMemoryId.of(456)) .headers(ImmutableMap.of("key", "value")) .subject("subject") .size(1) @@ -237,7 +237,7 @@ public class MessageTest { .id(TestMessageId.of(1)) .blobId(BlobId.of("blobId")) .threadId("threadId") - .mailboxIds(ImmutableList.of(InMemoryId.of(456))) + .mailboxId(InMemoryId.of(456)) .headers(ImmutableMap.of("key", "value")) .subject("subject") .size(1) http://git-wip-us.apache.org/repos/asf/james-project/blob/9875a46b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/SetMessagesResponseTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/SetMessagesResponseTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/SetMessagesResponseTest.java index 9340c7a..b75b47c 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/SetMessagesResponseTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/SetMessagesResponseTest.java @@ -61,7 +61,7 @@ public class SetMessagesResponseTest { .id(TestMessageId.of(1)) .blobId(BlobId.of("blobId")) .threadId("threadId") - .mailboxIds(ImmutableList.of(InMemoryId.of(123))) + .mailboxId(InMemoryId.of(123)) .headers(ImmutableMap.of("key", "value")) .subject("subject") .size(123) @@ -111,7 +111,7 @@ public class SetMessagesResponseTest { .id(messageId) .blobId(BlobId.of("blobId")) .threadId("threadId") - .mailboxIds(ImmutableList.of()) + .fluentMailboxIds() .headers(ImmutableMap.of()) .subject("subject") .size(0) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org