JAMES-1965 Simplify MessageFactory
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a5207133 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a5207133 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a5207133 Branch: refs/heads/master Commit: a52071339affde909dd6f193eee972c96ccc58c2 Parents: 030ed62 Author: Quynh Nguyen <qngu...@linagora.com> Authored: Tue Mar 21 15:07:12 2017 +0700 Committer: Quynh Nguyen <qngu...@linagora.com> Committed: Thu Mar 23 16:03:18 2017 +0700 ---------------------------------------------------------------------- .../apache/james/jmap/model/MessageFactory.java | 50 ++--- .../jmap/model/MessagePreviewGenerator.java | 32 +--- .../jmap/methods/GetMessagesMethodTest.java | 17 +- .../SetMessagesCreationProcessorTest.java | 7 +- .../james/jmap/model/MessageFactoryTest.java | 182 ++++++++++++++++++- .../jmap/model/MessagePreviewGeneratorTest.java | 155 ++-------------- .../apache/james/jmap/send/MailFactoryTest.java | 7 +- 7 files changed, 224 insertions(+), 226 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/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 b49e3dc..53c9d7f 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 @@ -18,7 +18,6 @@ ****************************************************************/ package org.apache.james.jmap.model; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.time.ZoneId; @@ -39,9 +38,9 @@ import javax.mail.Flags; import javax.mail.internet.SharedInputStream; import org.apache.james.jmap.model.MessageContentExtractor.MessageContent; +import org.apache.james.jmap.utils.HtmlTextExtractor; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; -import org.apache.james.mailbox.extractor.TextExtractor; import org.apache.james.mailbox.model.Cid; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageAttachment; @@ -68,26 +67,24 @@ public class MessageFactory { private static final ZoneId UTC_ZONE_ID = ZoneId.of("Z"); - private static final String HTML_CONTENT = "text/html"; - - private static final String EMPTY_FILE_NAME = ""; - private final MessagePreviewGenerator messagePreview; private final MessageContentExtractor messageContentExtractor; - private final TextExtractor textExtractor; + private final HtmlTextExtractor htmlTextExtractor; @Inject - public MessageFactory(MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor, TextExtractor textExtractor) { + public MessageFactory(MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor, HtmlTextExtractor htmlTextExtractor) { this.messagePreview = messagePreview; this.messageContentExtractor = messageContentExtractor; - this.textExtractor = textExtractor; + this.htmlTextExtractor = htmlTextExtractor; } public Message fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException { org.apache.james.mime4j.dom.Message mimeMessage = parse(message); MessageContent messageContent = extractContent(mimeMessage); Optional<String> htmlBody = messageContent.getHtmlBody(); - Optional<String> textBody = textBodyAndComputeFromHtmlBodyIfNeeded(htmlBody, messageContent.getTextBody()); + Optional<String> mainTextContent = mainTextContent(messageContent); + Optional<String> textBody = computeTextBodyIfNeeded(messageContent, mainTextContent); + String preview = messagePreview.compute(mainTextContent); return Message.builder() .id(message.getMessageId()) .blobId(BlobId.of(String.valueOf(message.getUid().asLong()))) @@ -109,23 +106,23 @@ public class MessageFactory { .date(message.getInternalDateAsZonedDateTime()) .textBody(textBody) .htmlBody(htmlBody) - .preview(getPreview(messageContent, textBody)) + .preview(preview) .attachments(getAttachments(message.getAttachments())) .build(); } - private Optional<String> textBodyAndComputeFromHtmlBodyIfNeeded(Optional<String> htmlBody, Optional<String> textBody) { - if (textBody.isPresent()) { - return textBody; - } - if (!htmlBody.isPresent()) { - return Optional.empty(); - } - try { - return Optional.of(textExtractor.extractContent(new ByteArrayInputStream(htmlBody.get().getBytes()), HTML_CONTENT, EMPTY_FILE_NAME).getTextualContent()); - } catch (Exception e) { - return Optional.empty(); - } + private Optional<String> computeTextBodyIfNeeded(MessageContent messageContent, Optional<String> mainTextContent) { + return messageContent.getTextBody() + .map(Optional::of) + .orElse(mainTextContent); + } + + private Optional<String> mainTextContent(MessageContent messageContent) { + return messageContent.getHtmlBody() + .map(htmlTextExtractor::toPlainText) + .filter(s -> !Strings.isNullOrEmpty(s)) + .map(Optional::of) + .orElse(messageContent.getTextBody()); } private org.apache.james.mime4j.dom.Message parse(MetaDataWithContent message) throws MailboxException { @@ -149,13 +146,6 @@ public class MessageFactory { } } - private String getPreview(MessageContent messageContent, Optional<String> computedTextBody) { - if (messageContent.getHtmlBody().isPresent() && messageContent.getTextBody().isPresent()) { - return messagePreview.forHTMLBody(messageContent.getHtmlBody()); - } - return messagePreview.forTextBody(computedTextBody); - } - private Emailer firstFromMailboxList(MailboxList list) { if (list == null) { return null; http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java index 5a162cd..b5a15ea 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java @@ -21,46 +21,20 @@ package org.apache.james.jmap.model; import java.util.Optional; -import javax.inject.Inject; - import org.apache.commons.lang3.StringUtils; -import org.apache.james.jmap.utils.HtmlTextExtractor; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; public class MessagePreviewGenerator { public static final String NO_BODY = "(Empty)"; public static final int MAX_PREVIEW_LENGTH = 256; - private final HtmlTextExtractor htmlTextExtractor; - - @Inject - public MessagePreviewGenerator(HtmlTextExtractor htmlTextExtractor) { - this.htmlTextExtractor = htmlTextExtractor; - } - - public String forHTMLBody(Optional<String> body) { - return body.filter(text -> !text.isEmpty()) - .map(this::asText) - .map(this::abbreviate) - .orElse(NO_BODY); - } - - public String forTextBody(Optional<String> body) { - return body.filter(text -> !text.isEmpty()) + public String compute(Optional<String> textBody) { + return textBody.filter(text -> !text.isEmpty()) .map(this::abbreviate) .orElse(NO_BODY); } - @VisibleForTesting String asText(String body) throws IllegalArgumentException { - Preconditions.checkArgument(body != null); - return htmlTextExtractor.toPlainText(body); - } - - @VisibleForTesting String abbreviate(String body) { + private String abbreviate(String body) { return StringUtils.abbreviate(body, MAX_PREVIEW_LENGTH); } - } http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/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 4686c3a..15873ee 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 @@ -20,9 +20,7 @@ package org.apache.james.jmap.methods; import static org.assertj.core.api.Assertions.assertThat; 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; @@ -43,20 +41,21 @@ import org.apache.james.jmap.model.MessageContentExtractor; import org.apache.james.jmap.model.MessageFactory; 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.MailboxBasedHtmlTextExtractor; 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.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; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.tika.extractor.TikaTextExtractor; import org.apache.james.metrics.logger.DefaultMetricFactory; import org.assertj.core.api.Condition; import org.assertj.core.data.MapEntry; @@ -117,12 +116,10 @@ public class GetMessagesMethodTest { @Before public void setup() throws Exception { clientId = ClientId.of("#0"); - MessagePreviewGenerator messagePreview = mock(MessagePreviewGenerator.class); - when(messagePreview.forHTMLBody(any())).thenReturn("html preview"); - when(messagePreview.forTextBody(any())).thenReturn("text preview"); + HtmlTextExtractor htmlTextExtractor = new MailboxBasedHtmlTextExtractor(new TikaTextExtractor()); + MessagePreviewGenerator messagePreview = new MessagePreviewGenerator(); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); - TextExtractor textExtractor = new JsoupTextExtractor(); - MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); + MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor, htmlTextExtractor); InMemoryIntegrationResources inMemoryIntegrationResources = new InMemoryIntegrationResources(); GroupMembershipResolver groupMembershipResolver = inMemoryIntegrationResources.createGroupMembershipResolver(); mailboxManager = inMemoryIntegrationResources.createMailboxManager(groupMembershipResolver); @@ -248,7 +245,6 @@ public class GetMessagesMethodTest { .build(); Stream<JmapResponse> result = testee.process(request, clientId, session); - assertThat(result).hasSize(1) .extracting(JmapResponse::getProperties) .flatExtracting(Optional::get) @@ -271,7 +267,6 @@ public class GetMessagesMethodTest { Set<MessageProperty> expected = Sets.newHashSet(MessageProperty.id, MessageProperty.subject); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); - assertThat(result).hasSize(1) .extracting(JmapResponse::getProperties) .flatExtracting(Optional::get) http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java index bf9de1b..3d06a3b 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java @@ -53,6 +53,7 @@ import org.apache.james.jmap.model.mailbox.Role; import org.apache.james.jmap.send.MailFactory; import org.apache.james.jmap.send.MailMetadata; import org.apache.james.jmap.send.MailSpool; +import org.apache.james.jmap.utils.HtmlTextExtractor; import org.apache.james.jmap.utils.SystemMailboxesProvider; import org.apache.james.mailbox.AttachmentManager; import org.apache.james.mailbox.MailboxSession; @@ -117,11 +118,11 @@ public class SetMessagesCreationProcessorTest { @Before public void setUp() throws MailboxException { + HtmlTextExtractor htmlTextExtractor = mock(HtmlTextExtractor.class); MessagePreviewGenerator messagePreview = mock(MessagePreviewGenerator.class); - TextExtractor textExtractor = mock(TextExtractor.class); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); - when(messagePreview.forTextBody(any())).thenReturn("text preview"); - messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); + when(messagePreview.compute(any())).thenReturn("text preview"); + messageFactory = new MessageFactory(messagePreview, messageContentExtractor, htmlTextExtractor); mockedMailSpool = mock(MailSpool.class); mockedMailFactory = mock(MailFactory.class); mockedAttachmentManager = mock(AttachmentManager.class); http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/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 74dad6f..1e0130c 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 @@ -19,8 +19,6 @@ package org.apache.james.jmap.model; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.hamcrest.CoreMatchers.is; import java.io.ByteArrayInputStream; import java.time.ZoneId; @@ -35,14 +33,14 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent; import org.apache.james.jmap.utils.HtmlTextExtractor; +import org.apache.james.jmap.utils.MailboxBasedHtmlTextExtractor; import org.apache.james.mailbox.MessageUid; -import org.apache.james.mailbox.extractor.TextExtractor; import org.apache.james.mailbox.inmemory.InMemoryId; -import org.apache.james.mailbox.inmemory.JsoupTextExtractor; import org.apache.james.mailbox.model.AttachmentId; import org.apache.james.mailbox.model.Cid; import org.apache.james.mailbox.model.MessageAttachment; import org.apache.james.mailbox.model.TestMessageId; +import org.apache.james.mailbox.tika.extractor.TikaTextExtractor; import org.junit.Before; import org.junit.Test; @@ -62,13 +60,12 @@ public class MessageFactoryTest { @Before public void setUp() { - htmlTextExtractor = mock(HtmlTextExtractor.class); - TextExtractor textExtractor = new JsoupTextExtractor(); + htmlTextExtractor = new MailboxBasedHtmlTextExtractor(new TikaTextExtractor()); - messagePreview = new MessagePreviewGenerator(htmlTextExtractor); + messagePreview = new MessagePreviewGenerator(); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); - messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); + messageFactory = new MessageFactory(messagePreview, messageContentExtractor, htmlTextExtractor); } @Test public void emptyMailShouldBeLoadedIntoMessage() throws Exception { @@ -193,6 +190,42 @@ public class MessageFactoryTest { } @Test + public void textBodyShouldNotOverrideWhenItIsThere() throws Exception { + 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)); + + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .internalDate(INTERNAL_DATE) + .size(1000) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee.getTextBody()) + .isPresent() + .isEqualTo(Optional.of("My plain message")); + } + + @Test public void previewShouldBeLimitedTo256Length() throws Exception { String headers = "Subject: test subject\n"; String body300 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" @@ -365,4 +398,137 @@ public class MessageFactoryTest { assertThat(testee.getHtmlBody()).contains(""); assertThat(testee.getTextBody()).isEmpty(); } + + @Test + public void previewBodyShouldReturnTruncatedStringWithoutHtmlTagWhenHtmlBodyContainTags() throws Exception { + String body = "This is a <b>HTML</b> mail containing <u>underlined part</u>, <i>italic part</i> and <u><i>underlined AND italic part</i></u>9999999999" + + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" + + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" + + "000000000011111111112222222222333333333344444444445555555"; + String expected = "This is a HTML mail containing underlined part, italic part and underlined AND italic part9999999999" + + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" + + "00000000001111111111222222222233333333334444444444555..."; + + ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/html\r\n" + + "Subject: message 1 subject\r\n" + + "\r\n" + + body).getBytes(Charsets.UTF_8)); + + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .size(messageContent.read()) + .internalDate(INTERNAL_DATE) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee.getPreview()).isEqualTo(expected); + } + + @Test + public void previewBodyShouldReturnTextBodyWhenNoHtmlBody() throws Exception { + ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/plain\r\n" + + "Subject: message 1 subject\r\n" + + "\r\n" + + "My plain text").getBytes(Charsets.UTF_8)); + + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .size(messageContent.read()) + .internalDate(INTERNAL_DATE) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee.getPreview()).isEqualTo("My plain text"); + } + + @Test + public void previewBodyShouldReturnStringEmptyWhenNoHtmlBodyAndNoTextBody() throws Exception { + ByteArrayInputStream messageContent = new ByteArrayInputStream(("Subject: message 1 subject\r\n").getBytes(Charsets.UTF_8)); + + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .size(messageContent.read()) + .internalDate(INTERNAL_DATE) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee) + .extracting(Message::getPreview, Message::getHtmlBody, Message::getTextBody) + .containsExactly(MessagePreviewGenerator.NO_BODY, Optional.empty(), Optional.of("")); + } + + @Test + public void previewBodyShouldReturnStringEmptyWhenNoMeaningHtmlBodyAndNoTextBody() throws Exception { + ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/html\r\n" + + "Subject: message 1 subject\r\n" + + "\r\n" + + "<html><body></body></html>").getBytes(Charsets.UTF_8)); + + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .size(messageContent.read()) + .internalDate(INTERNAL_DATE) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee) + .extracting(Message::getPreview, Message::getHtmlBody, Message::getTextBody) + .containsExactly(MessagePreviewGenerator.NO_BODY, Optional.of("<html><body></body></html>"), Optional.empty()); + } + + @Test + public void previewBodyShouldReturnTextBodyWhenNoMeaningHtmlBodyAndTextBody() throws Exception { + 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" + + "<html></html>" + ).getBytes(Charsets.UTF_8)); + + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .size(messageContent.read()) + .internalDate(INTERNAL_DATE) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee) + .extracting(Message::getPreview, Message::getHtmlBody, Message::getTextBody) + .containsExactly("My plain message", Optional.of("<html></html>"), Optional.of("My plain message")); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java index f9ae3b3..7874117 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java @@ -20,168 +20,39 @@ package org.apache.james.jmap.model; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import java.util.Optional; -import org.apache.james.jmap.utils.HtmlTextExtractor; +import org.apache.commons.lang3.StringUtils; import org.junit.Before; import org.junit.Test; public class MessagePreviewGeneratorTest { private MessagePreviewGenerator testee; - private HtmlTextExtractor htmlTextExtractor; - + @Before public void setUp() { - htmlTextExtractor = mock(HtmlTextExtractor.class); - testee = new MessagePreviewGenerator(htmlTextExtractor); + testee = new MessagePreviewGenerator(); } @Test - public void forHTMLBodyShouldReturnTruncatedStringWithoutHtmlTagWhenStringContainTagsAndIsLongerThan256Characters() { - //Given - String body = "This is a <b>HTML</b> mail containing <u>underlined part</u>, <i>italic part</i> and <u><i>underlined AND italic part</i></u>9999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "000000000011111111112222222222333333333344444444445555555"; - String bodyWithoutTags = "This is a HTML mail containing underlined part, italic part and underlined AND italic part9999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "000000000011111111112222222222333333333344444444445555555"; - String expected = "This is a HTML mail containing underlined part, italic part and underlined AND italic part9999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "00000000001111111111222222222233333333334444444444555..."; - //When - when(htmlTextExtractor.toPlainText(body)) - .thenReturn(bodyWithoutTags); - String actual = testee.forHTMLBody(Optional.of(body)); - //Then - assertThat(actual).isEqualTo(expected); + public void computeShouldReturnStringEmptyWhenEmptyTextBody() throws Exception { + assertThat(testee.compute(Optional.empty())).isEqualTo(MessagePreviewGenerator.NO_BODY); } @Test - public void forHTMLBodyShouldReturnStringContainingEmptyWhenEmptyString() { - //Given - String body = "" ; - String expected = "(Empty)" ; - //When - when(htmlTextExtractor.toPlainText(body)) - .thenReturn(expected); - String actual = testee.forHTMLBody(Optional.of(body)); - //Then - assertThat(actual).isEqualTo(expected); + public void computeShouldReturnStringEmptyWhenStringEmptyTextBody() throws Exception { + assertThat(testee.compute(Optional.of(""))).isEqualTo(MessagePreviewGenerator.NO_BODY); } @Test - public void forTextBodyShouldReturnTruncatedStringWhenStringContainTagsAndIsLongerThan256Characters() { - //Given - String body = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "This is a <b>HTML</b> mail containing <u>underlined part</u>, <i>italic part</i>88888888889999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "000000000011111111112222222222333333333344444444445555555"; - String expected = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "This is a <b>HTML</b> mail containing <u>underlined part</u>, <i>italic part</i>88888888889999999999" - + "00000000001111111111222222222233333333334444444444555..."; - //When - String actual = testee.forTextBody(Optional.of(body)); - //Then - assertThat(actual).isEqualTo(expected); - } + public void computeShouldReturnStringIsLimitedTo256Length() throws Exception { + String body = StringUtils.leftPad("a", 300, "b"); + String expected = StringUtils.leftPad("b", MessagePreviewGenerator.MAX_PREVIEW_LENGTH - 3, "b") + "..."; - @Test - public void forTextBodyShouldReturnStringContainingEmptyWhenEmptyString() { - //Given - String expected = "(Empty)" ; - //When - String actual = testee.forTextBody(Optional.empty()); - //Then - assertThat(actual).isEqualTo(expected); - } - - @Test - public void asTextShouldReturnStringWithoutHtmlTag() { - //Given - String body = "This is a <b>HTML</b> mail"; - String expected = "This is a HTML mail"; - //When - when(htmlTextExtractor.toPlainText(body)) - .thenReturn(expected); - String actual = testee.asText(body); - //Then - assertThat(actual).isEqualTo(expected); + assertThat(testee.compute(Optional.of(body))) + .hasSize(MessagePreviewGenerator.MAX_PREVIEW_LENGTH) + .isEqualTo(expected); } - - @Test(expected = IllegalArgumentException.class) - public void asTextShouldThrowWhenNullString () { - testee.asText(null); - } - - @Test - public void asTextShouldReturnEmptyStringWhenEmptyString() { - //Given - String body = ""; - String expected = ""; - //When - when(htmlTextExtractor.toPlainText(body)) - .thenReturn(expected); - String actual = testee.asText(body); - //Then - assertThat(actual).isEqualTo(expected); - } - - @Test - public void abbreviateShouldNotTruncateAbodyWith256Length() { - //Given - String body256 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "00000000001111111111222222222233333333334444444444555555"; - //When - String actual = testee.abbreviate(body256); - //Then - assertThat(body256.length()).isEqualTo(256); - assertThat(actual).isEqualTo(body256); - } - - @Test - public void abbreviateShouldTruncateAbodyWith257Length() { - //Given - String body257 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "000000000011111111112222222222333333333344444444445555555"; - String expected = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" - + "00000000001111111111222222222233333333334444444444555..."; - //When - String actual = testee.abbreviate(body257); - //Then - assertThat(body257.length()).isEqualTo(257); - assertThat(expected.length()).isEqualTo(256); - assertThat(actual).isEqualTo(expected); - } - - @Test - public void abbreviateShouldReturnNullStringWhenNullString() { - //Given - String body = null; - String expected = null; - //When - String actual = testee.abbreviate(body); - //Then - assertThat(actual).isEqualTo(expected); - } - - @Test - public void abbreviateShouldReturnEmptyStringWhenEmptyString() { - //Given - String body = ""; - String expected = ""; - //When - String actual = testee.abbreviate(body); - //Then - assertThat(actual).isEqualTo(expected); - } - } http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java index add4e29..34e4c59 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java @@ -35,6 +35,7 @@ import org.apache.james.jmap.model.MessageContentExtractor; import org.apache.james.jmap.model.MessageFactory; import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent; import org.apache.james.jmap.model.MessagePreviewGenerator; +import org.apache.james.jmap.utils.HtmlTextExtractor; import org.apache.james.mailbox.FlagsBuilder; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; @@ -78,11 +79,11 @@ public class MailFactoryTest { .messageId(TestMessageId.of(2)) .build(); MessagePreviewGenerator messagePreview = mock(MessagePreviewGenerator.class); - TextExtractor textExtractor = mock(TextExtractor.class); - when(messagePreview.forTextBody(any())).thenReturn("text preview"); + HtmlTextExtractor htmlTextExtractor = mock(HtmlTextExtractor.class); + when(messagePreview.compute(any())).thenReturn("text preview"); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); - MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); + MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor, htmlTextExtractor); jmapMessage = messageFactory.fromMetaDataWithContent(message); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org