JAMES-2110 IT for getMessages which return keywords of imap flags
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/41e3d15d Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/41e3d15d Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/41e3d15d Branch: refs/heads/master Commit: 41e3d15d299a7d86dcc70a47eaab69f0d2c9c58c Parents: 37cf8ff Author: quynhn <[email protected]> Authored: Tue Aug 15 16:48:11 2017 +0700 Committer: Raphael Ouazana <[email protected]> Committed: Thu Aug 24 15:47:28 2017 +0200 ---------------------------------------------------------------------- .../cucumber/GetMessagesMethodStepdefs.java | 38 +++++- .../test/resources/cucumber/GetMessages.feature | 33 +++++ .../jmap/methods/GetMessagesMethodTest.java | 135 ++++++++++++++++++- 3 files changed, 193 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/41e3d15d/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 13200f9..f42a071 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 @@ -42,6 +42,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.fluent.Request; import org.apache.james.jmap.DefaultMailboxes; import org.apache.james.jmap.methods.integration.cucumber.util.TableRow; +import org.apache.james.jmap.model.Keywords; import org.apache.james.jmap.model.MessagePreviewGenerator; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxId; @@ -84,11 +85,11 @@ public class GetMessagesMethodStepdefs { private final MainStepdefs mainStepdefs; private final UserStepdefs userStepdefs; private final Map<String, MessageId> messageIdsByName; - + private HttpResponse response; private DocumentContext jsonPath; private List<MessageId> requestedMessageIds; - + @Inject private GetMessagesMethodStepdefs(MainStepdefs mainStepdefs, UserStepdefs userStepdefs) { this.mainStepdefs = mainStepdefs; @@ -147,9 +148,9 @@ public class GetMessagesMethodStepdefs { private MessageId appendMessage(String mailbox, ContentType contentType, String subject, String content, Optional<Map<String, String>> headers) throws Exception { ZonedDateTime dateTime = ZonedDateTime.parse("2014-10-30T14:12:00Z"); - return mainStepdefs.jmapServer.getProbe(MailboxProbeImpl.class).appendMessage(userStepdefs.lastConnectedUser, + return mainStepdefs.jmapServer.getProbe(MailboxProbeImpl.class).appendMessage(userStepdefs.lastConnectedUser, new MailboxPath(MailboxConstants.USER_NAMESPACE, userStepdefs.lastConnectedUser, mailbox), - new ByteArrayInputStream(message(contentType, subject, content, headers).getBytes(Charsets.UTF_8)), + new ByteArrayInputStream(message(contentType, subject, content, headers).getBytes(Charsets.UTF_8)), Date.from(dateTime.toInstant()), false, new Flags()).getMessageId(); } @@ -246,6 +247,25 @@ public class GetMessagesMethodStepdefs { appendMessage(messageName, "eml/htmlWithLongAndComplicatedContent.eml"); } + @Given("^the user has a message \"([^\"]*)\" in the \"([^\"]*)\" mailbox with flags \"([^\"]*)\"$") + public void appendMessageWithFlags(String messageName, String mailbox, List<String> keywords) throws Exception { + Flags flags = Keywords.factory() + .fromList(keywords) + .asFlags(); + appendMessage(messageName, flags); + } + + private void appendMessage(String messageName, Flags flags) throws Exception { + ZonedDateTime dateTime = ZonedDateTime.parse("2014-10-30T14:12:00Z"); + boolean isRecent = flags.contains(Flags.Flag.RECENT); + MessageId id = mainStepdefs.jmapServer.getProbe(MailboxProbeImpl.class).appendMessage(userStepdefs.lastConnectedUser, + new MailboxPath(MailboxConstants.USER_NAMESPACE, userStepdefs.lastConnectedUser, DefaultMailboxes.INBOX), + new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), + Date.from(dateTime.toInstant()), isRecent, flags) + .getMessageId(); + messageIdsByName.put(messageName, id); + } + private void appendMessage(String messageName, String emlFileName) throws Exception { ZonedDateTime dateTime = ZonedDateTime.parse("2014-10-30T14:12:00Z"); MessageId id = mainStepdefs.jmapServer.getProbe(MailboxProbeImpl.class).appendMessage(userStepdefs.lastConnectedUser, @@ -377,12 +397,12 @@ public class GetMessagesMethodStepdefs { assertThat(jsonPath.<List<String>>read(ARGUMENTS + ".notFound")).containsExactlyElementsOf(elements); } - + @Then("^the list should contain (\\d+) message$") public void assertListContains(int numberOfMessages) throws Exception { assertThat(jsonPath.<List<String>>read(ARGUMENTS + ".list")).hasSize(numberOfMessages); } - + @Then("^the id of the message is \"([^\"]*)\"$") public void assertIdOfTheFirstMessage(String messageName) throws Exception { MessageId id = messageIdsByName.get(messageName); @@ -503,6 +523,12 @@ public class GetMessagesMethodStepdefs { assertThat(actual).contains(preview); } + @Then("^the keywords of the message is (.*)$") + public void assertKeywordsOfMessageShouldDisplay(List<String> keywords) throws Exception { + assertThat(jsonPath.<Map<String, Boolean>>read(FIRST_MESSAGE + ".keywords").keySet()) + .containsOnlyElementsOf(keywords); + } + private void assertAttachment(String attachment, DataTable attachmentProperties) { attachmentProperties.asList(TableRow.class) .forEach(entry -> assertThat(jsonPath.<Object>read(attachment + "." + entry.getKey())).isEqualTo(entry.getValue())); http://git-wip-us.apache.org/repos/asf/james-project/blob/41e3d15d/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 9f0255f..78addb9 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 @@ -318,3 +318,36 @@ Feature: GetMessages method Examples: |content-type |tranfer-encoding |content |preview | |"text/html; charset=iso-8859-1" |quoted-printable |"Dans le cadre du stage effectu=E9 Mlle 2017, =E0 sign=E9e d=E8s que possible, =E0, tr=E8s, journ=E9e.." |effectué, à , signée dès, très, journée | + + Scenario Outline: Retrieving message should display keywords as jmap flag + Given the user has a message "m1" in the "inbox" mailbox with flags <flags> + When the user ask for messages "m1" + Then no error is returned + And the list should contain 1 message + And the keywords of the message is <keyword> + + Examples: + |flags |keyword | + |"$Flagged,$Answered,$Draft" |$Flagged,$Answered,$Draft | + + Scenario Outline: Retrieving message should display keywords without unsupported jmap flag + Given the user has a message "m1" in the "inbox" mailbox with flags <flags> + When the user ask for messages "m1" + Then no error is returned + And the list should contain 1 message + And the keywords of the message is <keyword> + + Examples: + |flags |keyword | + |"$Flagged,$Answered,$Deleted,$Recent" |$Flagged,$Answered | + + Scenario Outline: Retrieving message should display keywords with custom user jmap flag + Given the user has a message "m1" in the "inbox" mailbox with flags <flags> + When the user ask for messages "m1" + Then no error is returned + And the list should contain 1 message + And the keywords of the message is <keyword> + + Examples: + |flags |keyword | + |"$Flagged,$Forwarded" |$Forwarded,$Flagged | http://git-wip-us.apache.org/repos/asf/james-project/blob/41e3d15d/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 c403251..6d7b06a 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 @@ -23,7 +23,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - import java.io.ByteArrayInputStream; import java.util.Date; import java.util.List; @@ -34,6 +33,7 @@ import java.util.Set; import java.util.stream.Collectors; import javax.mail.Flags; +import javax.mail.Flags.Flag; import com.google.common.collect.ImmutableSet; import org.apache.commons.lang.NotImplementedException; @@ -46,6 +46,7 @@ import org.apache.james.jmap.model.MessagePreviewGenerator; import org.apache.james.jmap.model.MessageProperties.MessageProperty; import org.apache.james.jmap.utils.HtmlTextExtractor; import org.apache.james.jmap.utils.JsoupHtmlTextExtractor; +import org.apache.james.mailbox.FlagsBuilder; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageIdManager; @@ -60,11 +61,6 @@ import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.metrics.logger.DefaultMetricFactory; import org.apache.james.util.mime.MessageContentExtractor; -import org.assertj.core.api.Condition; -import org.assertj.core.data.MapEntry; -import org.assertj.core.groups.Tuple; -import org.junit.Before; -import org.junit.Test; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; @@ -72,11 +68,18 @@ import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.github.steveash.guavate.Guavate; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import com.jayway.jsonpath.JsonPath; -public class GetMessagesMethodTest { +import org.assertj.core.api.Condition; +import org.assertj.core.data.MapEntry; +import org.assertj.core.groups.Tuple; +import org.junit.Before; +import org.junit.Test; +public class GetMessagesMethodTest { + private final static String FORWARDED = "forwarded"; public static final Flags FLAGS = null; public static final boolean NOT_RECENT = false; private MessageIdManager messageIdManager; @@ -495,4 +498,122 @@ public class GetMessagesMethodTest { GetMessagesResponse getMessagesResponse = (GetMessagesResponse) response; assertThat(getMessagesResponse.list()).hasSize(1); } + + @Test + public void processShouldReturnKeywordsForMessageFlags() throws MailboxException { + Flags flags = FlagsBuilder.builder() + .add(Flag.ANSWERED, Flag.DRAFT) + .build(); + MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); + Date now = new Date(); + ByteArrayInputStream message1Content = new ByteArrayInputStream("Subject: message 1 subject\r\n\r\nmy message".getBytes(Charsets.UTF_8)); + ComposedMessageId message1 = inbox.appendMessage(message1Content, now, session, false, flags); + ByteArrayInputStream message2Content = new ByteArrayInputStream("Subject: message 2 subject\r\n\r\nmy message".getBytes(Charsets.UTF_8)); + ComposedMessageId message2 = inbox.appendMessage(message2Content, now, session, false, flags); + ByteArrayInputStream message3Content = new ByteArrayInputStream("Great-Header: message 3 subject\r\n\r\nmy message".getBytes(Charsets.UTF_8)); + ComposedMessageId message3 = inbox.appendMessage(message3Content, now, session, false, flags); + + GetMessagesRequest request = GetMessagesRequest.builder() + .ids(ImmutableList.of(message1.getMessageId(), + message2.getMessageId(), + message3.getMessageId())) + .build(); + + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); + + assertThat(result).hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMessagesResponse.class) + .extracting(GetMessagesResponse.class::cast) + .flatExtracting(GetMessagesResponse::list) + .extracting(Message::getKeywords) + .containsOnly( + ImmutableMap.of( + "$Answered", true, + "$Draft", true), + ImmutableMap.of( + "$Answered", true, + "$Draft", true), + ImmutableMap.of( + "$Answered", true, + "$Draft", true)); + + } + + + @Test + public void processShouldReturnKeywordsWithoutUnsupportedKeywordsForMessageFlags() throws MailboxException { + Flags flags1 = FlagsBuilder.builder() + .add(Flag.ANSWERED, Flag.DRAFT, Flag.DELETED) + .build(); + Flags flags2 = FlagsBuilder.builder() + .add(Flag.ANSWERED, Flag.DRAFT) + .build(); + Flags flags3 = FlagsBuilder.builder() + .add(Flag.ANSWERED, Flag.DRAFT, Flag.RECENT) + .build(); + MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); + Date now = new Date(); + ByteArrayInputStream message1Content = new ByteArrayInputStream("Subject: message 1 subject\r\n\r\nmy message".getBytes(Charsets.UTF_8)); + ComposedMessageId message1 = inbox.appendMessage(message1Content, now, session, false, flags1); + ByteArrayInputStream message2Content = new ByteArrayInputStream("Subject: message 2 subject\r\n\r\nmy message".getBytes(Charsets.UTF_8)); + ComposedMessageId message2 = inbox.appendMessage(message2Content, now, session, false, flags2); + ByteArrayInputStream message3Content = new ByteArrayInputStream("Great-Header: message 3 subject\r\n\r\nmy message".getBytes(Charsets.UTF_8)); + ComposedMessageId message3 = inbox.appendMessage(message3Content, now, session, false, flags3); + + GetMessagesRequest request = GetMessagesRequest.builder() + .ids(ImmutableList.of(message1.getMessageId(), + message2.getMessageId(), + message3.getMessageId())) + .build(); + + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); + + assertThat(result).hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMessagesResponse.class) + .extracting(GetMessagesResponse.class::cast) + .flatExtracting(GetMessagesResponse::list) + .extracting(Message::getKeywords) + .containsOnly( + ImmutableMap.of( + "$Answered", true, + "$Draft", true), + ImmutableMap.of( + "$Answered", true, + "$Draft", true), + ImmutableMap.of( + "$Answered", true, + "$Draft", true)); + + } + + @Test + public void processShouldReturnKeywordsWithoutForwardedWhenForwardedUserFlagsMessages() throws MailboxException { + Flags flags = FlagsBuilder.builder() + .add(Flag.ANSWERED, Flag.DELETED) + .add(FORWARDED) + .build(); + MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); + Date now = new Date(); + ByteArrayInputStream message1Content = new ByteArrayInputStream("Subject: message 1 subject\r\n\r\nmy message".getBytes(Charsets.UTF_8)); + ComposedMessageId message1 = inbox.appendMessage(message1Content, now, session, false, flags); + + GetMessagesRequest request = GetMessagesRequest.builder() + .ids(ImmutableList.of(message1.getMessageId())) + .build(); + + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); + + assertThat(result).hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMessagesResponse.class) + .extracting(GetMessagesResponse.class::cast) + .flatExtracting(GetMessagesResponse::list) + .extracting(Message::getKeywords) + .containsOnly( + ImmutableMap.of( + "$Answered", true, + FORWARDED, true)); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
