JAMES-1965 Add more testings for "Compute textBody when htmlBody is available"
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4b70df97 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4b70df97 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4b70df97 Branch: refs/heads/master Commit: 4b70df973b518d0d739c47f749b76813ced4ad4d Parents: 0678047 Author: Quynh Nguyen <qngu...@linagora.com> Authored: Wed Mar 15 11:16:34 2017 +0700 Committer: Quynh Nguyen <qngu...@linagora.com> Committed: Thu Mar 23 16:03:17 2017 +0700 ---------------------------------------------------------------------- .../integration/GetMessageListMethodTest.java | 30 +++++- .../cucumber/GetMessagesMethodStepdefs.java | 5 + .../test/resources/cucumber/GetMessages.feature | 10 +- .../resources/eml/noTextBodyButHtmlBody.eml | 84 +++++++++++++++ .../jmap/methods/GetMessagesMethodTest.java | 103 +++++++++++++++++-- 5 files changed, 223 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/4b70df97/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java index bf49a2f..c455813 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java @@ -50,8 +50,8 @@ import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.probe.MailboxProbe; import org.apache.james.modules.MailboxProbeImpl; import org.apache.james.probe.DataProbe; -import org.apache.james.utils.JmapGuiceProbe; import org.apache.james.utils.DataProbeImpl; +import org.apache.james.utils.JmapGuiceProbe; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -1054,6 +1054,34 @@ public abstract class GetMessageListMethodTest { .body("[1][1].list[0].id", equalTo(message.getMessageId().serialize())); } + @Test + public void getMessageListShouldComputeTextBodyWhenNoTextBodyButHtmlBody() throws Exception { + mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); + + String mailContent = "Content-Type: text/html\r\n" + + "Subject: message 1 subject\r\n" + + "\r\n" + + "Hello <b>someone</b>, and thank you for joining example.com!"; + LocalDate date = LocalDate.now(); + mailboxProbe.appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"), + new ByteArrayInputStream(mailContent.getBytes()), convertToDate(date.plusDays(1)), false, new Flags()); + await(); + + given() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"fetchMessages\": true, \"fetchMessageProperties\": [\"htmlBody\", \"textBody\"]}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body("[0][0]", equalTo("messageList")) + .body("[1][0]", equalTo("messages")) + .body("[0][1].messageIds", hasSize(1)) + .body("[1][1].list[0].htmlBody", equalTo("Hello <b>someone</b>, and thank you for joining example.com!")) + .body("[1][1].list[0].textBody", equalTo("Hello someone, and thank you for joining example.com!")) + ; + } + private Date convertToDate(LocalDate localDate) { return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant()); } http://git-wip-us.apache.org/repos/asf/james-project/blob/4b70df97/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 23afc1d..070b219 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 @@ -203,6 +203,11 @@ public class GetMessagesMethodStepdefs { appendMessage(messageName, "eml/textInMainMultipartHtmlInInnerMultipart.eml"); } + @Given("^the user has a message \"([^\"]*)\" in \"([^\"]*)\" mailbox with html body and no text body$") + public void appendMessageWithNoTextButHtml(String messageName, String mailbox) throws Throwable { + appendMessage(messageName, "eml/noTextBodyButHtmlBody.eml"); + } + 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, http://git-wip-us.apache.org/repos/asf/james-project/blob/4b70df97/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 3a72bf8..c8d1050 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 @@ -239,4 +239,12 @@ Feature: GetMessages method Then no error is returned And the list should contain 1 message And the textBody of the message is "/blabla/\r\n*bloblo*\r\n" - And the htmlBody of the message is "<i>blabla</i>\r\n<b>bloblo</b>\r\n" \ No newline at end of file + And the htmlBody of the message is "<i>blabla</i>\r\n<b>bloblo</b>\r\n" + + Scenario: Retrieving message should compute text body from html body + Given the user has a message "m1" in "INBOX" mailbox with html body and no text body + When the user ask for messages "m1" + Then no error is returned + And the list should contain 1 message + And the textBody of the message is "The Test User created an issue" + And the htmlBody of the message is "<a>The Test User</a> <strong>created</strong> an issue" \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/4b70df97/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/noTextBodyButHtmlBody.eml ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/noTextBodyButHtmlBody.eml b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/noTextBodyButHtmlBody.eml new file mode 100644 index 0000000..8a503c7 --- /dev/null +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/noTextBodyButHtmlBody.eml @@ -0,0 +1,84 @@ +Return-Path: <returnPath> +Received: from localhost (localhost [127.0.0.1]) + by localhost (Postfix) with ESMTP id 27358B3A09; + Tue, 11 Oct 2016 11:59:12 +0200 (CEST) +X-Sieve: CMU Sieve 2.2 +Date: Tue, 14 Mar 2017 16:47:05 +0100 (CET) +From: "Test User (JIRA)" <test@localhost> +To: you@localhost +Message-ID: <jira.18278.1489506415000.375139.1489506425...@atlassian.jira> +In-Reply-To: <jira.18278.1489506415...@atlassian.jira> +References: <jira.18278.1489506415...@atlassian.jira> <JIRA.18278.1489506415104@localhost> +Subject: [JIRA] (CHAT-338) Update + icon +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_Part_370449_1340169331.1489506420401" +X-JIRA-FingerPrint: 2cc56fe0b6c36a47776991d4aa5e9674 +Auto-Submitted: auto-generated +Precedence: bulk + +------=_Part_370449_1340169331.1489506420401 +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +<a>The Test User</a> <strong>created</strong> an issue +------=_Part_370449_1340169331.1489506420401 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Disposition: inline +Content-ID: <jira-generated-image-static-major-2aab6bf2-4155-47c6-9c0b-b0ec1fdeaf9a> + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX////QRDfQRDfQRDfQRDfQ +RDcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFHZsIAAAABXRSTlMAEZnM3Uchgx8AAAAb +dEVYdGppcmEtc3lzdGVtLWltYWdlLXR5cGUAaWNvbroqOUUAAABESURBVHjaY2BAAsKGQIKJgYFR +SUkAzBBSYFIEMRiVHvwDCjExMMk9+PdIgYGF4f+9D//v8YJ1sQZAdEEACuP/BwYSAQCDPg0vvqNM +LwAAAABJRU5ErkJggu2YDBYHBhIBAEDzBgwy4Sb4AAAAAElFTkSuQmCC +------=_Part_370449_1340169331.1489506420401 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Disposition: inline +Content-ID: <jira-generated-image-static-comment-icon-d374d5f6-0597-421c-a4ef-50f59dbc5d33> + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEX///+1tbWzs7OysrKrq6um +pqalpaWdnZ2ZmZn///+VlZWPj4/7+/vu7u7p6enn5+fl5eXk5OTh4eHW1tbT09PMzMzJycm6urq5 +ubm1tbWzs7OysrKrq6upqamlpaWKioqFhYWRkZGKioqHh4eDg4OAgIB/f398fHx6enp4eHh2dnZ0 +dHRycnJwcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +gg== +------=_Part_370449_1340169331.1489506420401 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Disposition: inline +Content-ID: <jira-generated-image-avatar-da8398c1-34c5-42a8-886f-d6628dead0f6> + +iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAHXRFWHRqaXJhLXN5c3RlbS1pbWFn +ZS10eXBlAGF2YXRhcuQCGmEAAAdtSURBVHjaTdfFD5ZXEwXwZ0mBBHdoIbhT3Iq7tTgUh1KcFoq7 +Oy3W4pZAsA0JsIIFWxYECQk7Vvwf8+U3X27Txc19H7vnzJkzc+9b9evXL4YMGRLjx4+PoUOHxuDB +g6Nt27bRqlWraNSoUbRu3TqfGT/88EPMmTMn3rx5E69fv44HDx7EzZs34+rVq3HlypX4+++/4+LF +i3HhwoX8fe3atbhz507cv38/bt26FWvWrImRI0fGtGnTYvfu3XH58uWoXHz//ffRu3fv6Nq1a3Tr +rkJggg== +------=_Part_370449_1340169331.1489506420401 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Disposition: inline +Content-ID: <jira-generated-image-static-task-f154c5ed-6f31-40fe-9282-434de712f077> + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEX///+1tbWzs7OwsLD////7 ++/v5+fn6+Pbx7enm39jZ2dnW1tbT09PPz8+9qZiwmIOojninjXaLi4uliXKjh2+egWeBgYF7e3ty +cnJwcHCIZEWGYkOFYECDXj2CXDyBXDuBWzoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AwO/ydzq3Plz9/gBVQQxEb0tW8YAAAAASUVORK5CYII= +------=_Part_370449_1340169331.1489506420401 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Disposition: inline +Content-ID: <jira-generated-image-static-footer-desktop-logo-a08425e9-9554-4b52-8ae2-e2527647f29b> + +iVBORw0KGgoAAAANSUhEUgAAAKkAAAAkCAYAAADy+xopAAAAG3RFWHRqaXJhLXN5c3RlbS1pbWFn +ZS10eXBlAGxvZ287MIqNAAAFV0lEQVR42u2cLbPrIBCGq1A4VFQUqg4VhUKh4qKizt89+U3ntjNk +LpcB9oOkac9F7ExFwkd4uru8S3Lbvr/XYOZh4mG3C02EcexjunX73fbz8wPa88LlYV/BnmBMD5Mv +HqwM/a7RWOa+iB3SHdKn93IRHLv5h+kTvesTzHuAMe17egOv3u2NIN1tTLzqV+LVpnCNbIByDO3M +hX6e/Q998TqkJUh3M0nYLZkPNoV7Upuia6C2luC1+8J1SFGQ7imArnjWo2zucHZIuZDGpoJXPArY +JbSn+iJ1OwrSNK/UUShfEUDuKYG+QDXo9sshHYOdOchX9NGi2d6TPPv+yyDJzU98EqSxdmoDTK0T +nvfbckn7YgAAAABJRU5ErkJggg== +------=_Part_370449_1340169331.1489506420401-- http://git-wip-us.apache.org/repos/asf/james-project/blob/4b70df97/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 45b6d76..0c231ba 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 @@ -49,7 +49,9 @@ 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.extractor.TextExtractor; import org.apache.james.mailbox.inmemory.InMemoryMessageIdManager; +import org.apache.james.mailbox.inmemory.JsoupTextExtractor; import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources; import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.ComposedMessageId; @@ -119,7 +121,8 @@ public class GetMessagesMethodTest { when(messagePreview.forHTMLBody(any())).thenReturn("html preview"); when(messagePreview.forTextBody(any())).thenReturn("text preview"); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); - MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor); + TextExtractor textExtractor = new JsoupTextExtractor(); + MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); InMemoryIntegrationResources inMemoryIntegrationResources = new InMemoryIntegrationResources(); GroupMembershipResolver groupMembershipResolver = inMemoryIntegrationResources.createGroupMembershipResolver(); mailboxManager = inMemoryIntegrationResources.createMailboxManager(groupMembershipResolver); @@ -182,9 +185,9 @@ public class GetMessagesMethodTest { .flatExtracting(GetMessagesResponse::list) .extracting(Message::getId, Message::getSubject, Message::getTextBody) .containsOnly( - Tuple.tuple(message1.getMessageId(), "message 1 subject", Optional.of("my message")), - Tuple.tuple(message2.getMessageId(), "message 2 subject", Optional.of("my message")), - Tuple.tuple(message3.getMessageId(), "", Optional.of("my message"))); + Tuple.tuple(message1.getMessageId(), "message 1 subject", Optional.of("my message")), + Tuple.tuple(message2.getMessageId(), "message 2 subject", Optional.of("my message")), + Tuple.tuple(message3.getMessageId(), "", Optional.of("my message"))); } @Test @@ -208,8 +211,8 @@ public class GetMessagesMethodTest { .hasOnlyElementsOfType(GetMessagesResponse.class) .extracting(GetMessagesResponse.class::cast) .flatExtracting(GetMessagesResponse::list) - .extracting(Message::getId, Message::getTextBody, Message::getHtmlBody) - .containsOnly(Tuple.tuple(message.getMessageId(), Optional.empty(), Optional.of("my <b>HTML</b> message"))); + .extracting(Message::getId, Message::getHtmlBody) + .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my <b>HTML</b> message"))); } @Test @@ -298,7 +301,93 @@ public class GetMessagesMethodTest { .asList() .containsOnlyElementsOf(expected); } - + + @Test + public void processShouldReturnTextBodyWhenEmptyTextBodyAndNotEmptyHtmlBody() throws MailboxException { + MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); + Date now = new Date(); + ByteArrayInputStream messageContent = new ByteArrayInputStream(("Content-Type: text/html\r\n" + + "Subject: message 1 subject\r\n" + + "\r\n" + + "my <b>HTML</b> message").getBytes(Charsets.UTF_8)); + ComposedMessageId message = inbox.appendMessage(messageContent, now, session, false, null); + + GetMessagesRequest request = GetMessagesRequest.builder() + .ids(ImmutableList.of(message.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::getId, Message::getTextBody, Message::getHtmlBody) + .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my HTML message"), Optional.of("my <b>HTML</b> message"))); + } + + @Test + public void processShouldEmptyTextBodyAndHtmlBodyWhenThoseAreEmpty() throws MailboxException { + MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); + Date now = new Date(); + ByteArrayInputStream messageContent = new ByteArrayInputStream(("Content-Type: text/html\r\n" + + "Subject: message 1 subject\r\n" + + "\r\n").getBytes(Charsets.UTF_8)); + ComposedMessageId message = inbox.appendMessage(messageContent, now, session, false, null); + + GetMessagesRequest request = GetMessagesRequest.builder() + .ids(ImmutableList.of(message.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::getId, Message::getTextBody, Message::getHtmlBody) + .containsOnly(Tuple.tuple(message.getMessageId(), Optional.empty(), Optional.empty())); + } + + @Test + public void processShouldNotOverrideTextBodyWhenItIsThere() throws MailboxException { + MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); + Date now = new Date(); + ByteArrayInputStream messageContent = new ByteArrayInputStream(("Subject\n" + + "MIME-Version: 1.0\n" + + "Content-Type: multipart/alternative;\n" + + "\tboundary=\"----=_Part_370449_1340169331.1489506420401\"\n" + + "\n" + + "------=_Part_370449_1340169331.1489506420401\n" + + "Content-Type: text/plain; charset=UTF-8\n" + + "Content-Transfer-Encoding: 7bit\n" + + "\n" + + "My plain message\n" + + "------=_Part_370449_1340169331.1489506420401\n" + + "Content-Type: text/html; charset=UTF-8\n" + + "Content-Transfer-Encoding: 7bit\n" + + "\n" + + "<a>The </a> <strong>HTML</strong> message" + ).getBytes(Charsets.UTF_8)); + ComposedMessageId message = inbox.appendMessage(messageContent, now, session, false, null); + + GetMessagesRequest request = GetMessagesRequest.builder() + .ids(ImmutableList.of(message.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::getId, Message::getTextBody, Message::getHtmlBody) + .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("My plain message"), Optional.of("<a>The </a> <strong>HTML</strong> message"))); + } + @Test public void processShouldReturnHeadersFieldWhenSpecificHeadersRequestedInPropertyList() throws MailboxException { MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org