This is an automated email from the ASF dual-hosted git repository. hqtran pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 37a8d71b318dc4c49d3159d44fba65d25e1217b3 Author: Quan Tran <hqt...@linagora.com> AuthorDate: Wed Jun 25 15:31:16 2025 +0700 JAMES-3516 ThreadIdGuessingAlgorithmContract should rely on MailboxManager to manipulate tests Without exercising the mapper API directly, which makes tests brittle and hard to manage. --- .../CassandraThreadIdGuessingAlgorithmTest.java | 29 +--- .../PostgresThreadIdGuessingAlgorithmTest.java | 43 +----- .../SearchThreadIdGuessingAlgorithmTest.java | 26 +--- .../store/ThreadIdGuessingAlgorithmContract.java | 164 +++++++-------------- 4 files changed, 63 insertions(+), 199 deletions(-) diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraThreadIdGuessingAlgorithmTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraThreadIdGuessingAlgorithmTest.java index 1d7e8dd5a4..dceb9d277e 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraThreadIdGuessingAlgorithmTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraThreadIdGuessingAlgorithmTest.java @@ -20,7 +20,6 @@ package org.apache.james.mailbox.cassandra; import static org.apache.james.mailbox.cassandra.mail.CassandraThreadDAOTest.hashMimeMessagesIds; -import static org.apache.james.mailbox.cassandra.mail.CassandraThreadDAOTest.hashSubject; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; @@ -29,21 +28,19 @@ import java.util.Set; import org.apache.james.backends.cassandra.CassandraClusterExtension; import org.apache.james.core.Username; +import org.apache.james.events.EventBus; import org.apache.james.events.EventBusTestFixture; import org.apache.james.events.InVMEventBus; import org.apache.james.events.MemoryEventDeadLetters; import org.apache.james.events.delivery.InVmEventDelivery; -import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.cassandra.mail.CassandraThreadDAO; import org.apache.james.mailbox.cassandra.mail.CassandraThreadLookupDAO; import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule; import org.apache.james.mailbox.cassandra.mail.ThreadTablePartitionKey; import org.apache.james.mailbox.model.MessageId; -import org.apache.james.mailbox.model.ThreadId; import org.apache.james.mailbox.store.CombinationManagerTestSystem; import org.apache.james.mailbox.store.ThreadIdGuessingAlgorithmContract; -import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm; import org.apache.james.mailbox.store.mail.model.MimeMessageId; import org.apache.james.mailbox.store.mail.model.Subject; @@ -53,32 +50,25 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; public class CassandraThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgorithmContract { - private CassandraMailboxManager mailboxManager; - private CassandraThreadDAO threadDAO; private CassandraThreadLookupDAO threadLookupDAO; + private MessageId.Factory messageIdFactory; @RegisterExtension static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE); @Override - protected CombinationManagerTestSystem createTestingData() { - eventBus = new InVMEventBus(new InVmEventDelivery(new RecordingMetricFactory()), EventBusTestFixture.RETRY_BACKOFF_CONFIGURATION, new MemoryEventDeadLetters()); + protected CombinationManagerTestSystem createTestingSystem() { + EventBus eventBus = new InVMEventBus(new InVmEventDelivery(new RecordingMetricFactory()), EventBusTestFixture.RETRY_BACKOFF_CONFIGURATION, new MemoryEventDeadLetters()); CassandraCombinationManagerTestSystem testSystem = (CassandraCombinationManagerTestSystem) CassandraCombinationManagerTestSystem.createTestingData(cassandraCluster.getCassandraCluster(), new NoQuotaManager(), eventBus); - mailboxManager = (CassandraMailboxManager) testSystem.getMailboxManager(); messageIdFactory = new CassandraMessageId.Factory(); return testSystem; } @Override protected ThreadIdGuessingAlgorithm initThreadIdGuessingAlgorithm(CombinationManagerTestSystem testingData) { - threadDAO = new CassandraThreadDAO(cassandraCluster.getCassandraCluster().getConf()); + CassandraThreadDAO threadDAO = new CassandraThreadDAO(cassandraCluster.getCassandraCluster().getConf()); threadLookupDAO = new CassandraThreadLookupDAO(cassandraCluster.getCassandraCluster().getConf()); - return new CassandraThreadIdGuessingAlgorithm(mailboxManager, threadDAO, threadLookupDAO); - } - - @Override - protected MessageMapper createMessageMapper(MailboxSession mailboxSession) { - return mailboxManager.getMapperFactory().createMessageMapper(mailboxSession); + return new CassandraThreadIdGuessingAlgorithm(testingData.getMailboxManager(), threadDAO, threadLookupDAO); } @Override @@ -91,13 +81,6 @@ public class CassandraThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgo return messageIdFactory.generate(); } - @Override - protected void saveThreadData(Username username, Set<MimeMessageId> mimeMessageIds, MessageId messageId, ThreadId threadId, Optional<Subject> baseSubject) { - threadDAO.insertSome(username, hashMimeMessagesIds(mimeMessageIds), messageId, threadId, hashSubject(baseSubject)) - .then() - .block(); - } - @Test void guessThreadIdShouldSaveDataToThreadLookupTable() { testee.guessThreadIdReactive(newBasedMessageId, diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresThreadIdGuessingAlgorithmTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresThreadIdGuessingAlgorithmTest.java index 5f79a3cf18..52137307b3 100644 --- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresThreadIdGuessingAlgorithmTest.java +++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresThreadIdGuessingAlgorithmTest.java @@ -19,68 +19,41 @@ package org.apache.james.mailbox.postgres; -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - import org.apache.james.backends.postgres.PostgresExtension; -import org.apache.james.core.Username; +import org.apache.james.events.EventBus; import org.apache.james.events.EventBusTestFixture; import org.apache.james.events.InVMEventBus; import org.apache.james.events.MemoryEventDeadLetters; import org.apache.james.events.delivery.InVmEventDelivery; -import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MessageId; -import org.apache.james.mailbox.model.ThreadId; import org.apache.james.mailbox.postgres.mail.dao.PostgresThreadDAO; import org.apache.james.mailbox.store.CombinationManagerTestSystem; import org.apache.james.mailbox.store.ThreadIdGuessingAlgorithmContract; -import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm; -import org.apache.james.mailbox.store.mail.model.MimeMessageId; -import org.apache.james.mailbox.store.mail.model.Subject; import org.apache.james.mailbox.store.quota.NoQuotaManager; import org.apache.james.metrics.tests.RecordingMetricFactory; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.hash.Hashing; - -import reactor.core.publisher.Flux; - public class PostgresThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgorithmContract { @RegisterExtension static PostgresExtension postgresExtension = PostgresExtension.withoutRowLevelSecurity(PostgresMailboxAggregateDataDefinition.MODULE); - private PostgresMailboxManager mailboxManager; - private PostgresThreadDAO.Factory threadDAOFactory; + private MessageId.Factory messageIdFactory; @Override - protected CombinationManagerTestSystem createTestingData() { - eventBus = new InVMEventBus(new InVmEventDelivery(new RecordingMetricFactory()), EventBusTestFixture.RETRY_BACKOFF_CONFIGURATION, new MemoryEventDeadLetters()); + protected CombinationManagerTestSystem createTestingSystem() { + EventBus eventBus = new InVMEventBus(new InVmEventDelivery(new RecordingMetricFactory()), EventBusTestFixture.RETRY_BACKOFF_CONFIGURATION, new MemoryEventDeadLetters()); PostgresCombinationManagerTestSystem testSystem = (PostgresCombinationManagerTestSystem) PostgresCombinationManagerTestSystem.createTestingData(postgresExtension, new NoQuotaManager(), eventBus); - mailboxManager = (PostgresMailboxManager) testSystem.getMailboxManager(); messageIdFactory = new PostgresMessageId.Factory(); return testSystem; } @Override protected ThreadIdGuessingAlgorithm initThreadIdGuessingAlgorithm(CombinationManagerTestSystem testingData) { - threadDAOFactory = new PostgresThreadDAO.Factory(postgresExtension.getExecutorFactory()); + PostgresThreadDAO.Factory threadDAOFactory = new PostgresThreadDAO.Factory(postgresExtension.getExecutorFactory()); return new PostgresThreadIdGuessingAlgorithm(threadDAOFactory); } - @Override - protected MessageMapper createMessageMapper(MailboxSession mailboxSession) { - return mailboxManager.getMapperFactory().createMessageMapper(mailboxSession); - } - @Override protected MessageId initNewBasedMessageId() { return messageIdFactory.generate(); @@ -91,10 +64,4 @@ public class PostgresThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgor return messageIdFactory.generate(); } - @Override - protected void saveThreadData(Username username, Set<MimeMessageId> mimeMessageIds, MessageId messageId, ThreadId threadId, Optional<Subject> baseSubject) { - PostgresThreadDAO threadDAO = threadDAOFactory.create(username.getDomainPart()); - threadDAO.insertSome(username, hashMimeMessagesIds(mimeMessageIds), PostgresMessageId.class.cast(messageId), threadId, hashSubject(baseSubject)).block(); - } - } diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SearchThreadIdGuessingAlgorithmTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SearchThreadIdGuessingAlgorithmTest.java index 75ea84cfc2..189d5d1eb3 100644 --- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SearchThreadIdGuessingAlgorithmTest.java +++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SearchThreadIdGuessingAlgorithmTest.java @@ -19,36 +19,20 @@ package org.apache.james.mailbox.store.search; -import java.util.Optional; -import java.util.Set; - -import org.apache.james.core.Username; -import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.inmemory.InMemoryCombinationManagerTestSystem; -import org.apache.james.mailbox.inmemory.InMemoryMailboxManager; import org.apache.james.mailbox.inmemory.InMemoryMessageId; import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources; import org.apache.james.mailbox.model.MessageId; -import org.apache.james.mailbox.model.ThreadId; import org.apache.james.mailbox.store.CombinationManagerTestSystem; import org.apache.james.mailbox.store.ThreadIdGuessingAlgorithmContract; -import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.SearchThreadIdGuessingAlgorithm; import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm; -import org.apache.james.mailbox.store.mail.model.MimeMessageId; -import org.apache.james.mailbox.store.mail.model.Subject; public class SearchThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgorithmContract { - private InMemoryMailboxManager mailboxManager; - @Override - protected CombinationManagerTestSystem createTestingData() { + protected CombinationManagerTestSystem createTestingSystem() { InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources(); - mailboxManager = resources.getMailboxManager(); - eventBus = resources.getEventBus(); - messageIdFactory = resources.getMessageIdFactory(); - return new InMemoryCombinationManagerTestSystem( resources.getMailboxManager(), resources.getMessageIdManager()); @@ -59,11 +43,6 @@ public class SearchThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgorit return new SearchThreadIdGuessingAlgorithm(testingData.getMailboxManager(), testingData.getMessageIdManager()); } - @Override - protected MessageMapper createMessageMapper(MailboxSession mailboxSession) { - return mailboxManager.getMapperFactory().createMessageMapper(mailboxSession); - } - @Override protected MessageId initNewBasedMessageId() { return InMemoryMessageId.of(100); @@ -74,7 +53,4 @@ public class SearchThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgorit return InMemoryMessageId.of(1000); } - @Override - protected void saveThreadData(Username username, Set<MimeMessageId> mimeMessageIds, MessageId messageId, ThreadId threadId, Optional<Subject> baseSubject) { - } } diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/ThreadIdGuessingAlgorithmContract.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/ThreadIdGuessingAlgorithmContract.java index a93e822ead..8994c29cc4 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/ThreadIdGuessingAlgorithmContract.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/ThreadIdGuessingAlgorithmContract.java @@ -19,43 +19,27 @@ package org.apache.james.mailbox.store; -import static org.apache.james.mailbox.events.MailboxEvents.Added.IS_APPENDED; -import static org.apache.james.mailbox.events.MailboxEvents.Added.IS_DELIVERY; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Stream; -import jakarta.mail.Flags; - import org.apache.james.core.Username; -import org.apache.james.events.EventBus; -import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageManager; -import org.apache.james.mailbox.events.MailboxIdRegistrationKey; -import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.ThreadNotFoundException; -import org.apache.james.mailbox.model.ByteContent; -import org.apache.james.mailbox.model.Mailbox; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MessageId; -import org.apache.james.mailbox.model.MessageMetaData; import org.apache.james.mailbox.model.ThreadId; -import org.apache.james.mailbox.store.event.EventFactory; -import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.ThreadIdGuessingAlgorithm; -import org.apache.james.mailbox.store.mail.model.MailboxMessage; import org.apache.james.mailbox.store.mail.model.MimeMessageId; import org.apache.james.mailbox.store.mail.model.Subject; -import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; -import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.stream.RawField; import org.junit.jupiter.api.BeforeEach; @@ -71,43 +55,42 @@ import reactor.core.publisher.Flux; public abstract class ThreadIdGuessingAlgorithmContract { public static final Username USER = Username.of("quan"); - protected EventBus eventBus; - protected MessageId.Factory messageIdFactory; protected ThreadIdGuessingAlgorithm testee; protected MessageId newBasedMessageId; protected MessageId otherBasedMessageId; protected MailboxSession mailboxSession; - private MailboxManager mailboxManager; private MessageManager inbox; - private MessageMapper messageMapper; - private CombinationManagerTestSystem testingData; - private Mailbox mailbox; - protected abstract CombinationManagerTestSystem createTestingData(); + protected abstract CombinationManagerTestSystem createTestingSystem(); protected abstract ThreadIdGuessingAlgorithm initThreadIdGuessingAlgorithm(CombinationManagerTestSystem testingData); - protected abstract MessageMapper createMessageMapper(MailboxSession mailboxSession); - protected abstract MessageId initNewBasedMessageId(); protected abstract MessageId initOtherBasedMessageId(); - protected abstract void saveThreadData(Username username, Set<MimeMessageId> mimeMessageIds, MessageId messageId, ThreadId threadId, Optional<Subject> baseSubject); + private void overrideThreadIdGuessingAlgorithm(StoreMailboxManager manager, ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm) { + try { + Field field = StoreMailboxManager.class.getDeclaredField("threadIdGuessingAlgorithm"); + field.setAccessible(true); + field.set(manager, threadIdGuessingAlgorithm); + } catch (Exception e) { + throw new RuntimeException("Failed to override threadIdGuessingAlgorithm", e); + } + } @BeforeEach void setUp() throws Exception { - testingData = createTestingData(); - testee = initThreadIdGuessingAlgorithm(testingData); + CombinationManagerTestSystem testingSystem = createTestingSystem(); + testee = initThreadIdGuessingAlgorithm(testingSystem); + // Use reflection to set the actual testee threadIdGuessingAlgorithm in StoreMailboxManager, which was NaiveThreadIdGuessingAlgorithm because of circular dependency + overrideThreadIdGuessingAlgorithm((StoreMailboxManager) testingSystem.getMailboxManager(), testee); + newBasedMessageId = initNewBasedMessageId(); otherBasedMessageId = initOtherBasedMessageId(); - - mailboxManager = testingData.getMailboxManager(); - mailboxSession = mailboxManager.createSystemSession(USER); - mailboxManager.createMailbox(MailboxPath.inbox(USER), mailboxSession); - messageMapper = createMessageMapper(mailboxSession); - inbox = mailboxManager.getMailbox(MailboxPath.inbox(USER), mailboxSession); - mailbox = inbox.getMailboxEntity(); + mailboxSession = testingSystem.getMailboxManager().createSystemSession(USER); + testingSystem.getMailboxManager().createMailbox(MailboxPath.inbox(USER), mailboxSession); + inbox = testingSystem.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession); } @Test @@ -150,11 +133,6 @@ public abstract class ThreadIdGuessingAlgorithmContract { .addField(new RawField("References", "references2")) .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); - Set<MimeMessageId> mimeMessageIds = buildMimeMessageIdSet(Optional.of(new MimeMessageId("Message-ID")), - Optional.of(new MimeMessageId("someInReplyTo")), - Optional.of(List.of(new MimeMessageId("references1"), new MimeMessageId("references2")))); - saveThreadData(mailboxSession.getUser(), mimeMessageIds, message.getId().getMessageId(), message.getThreadId(), Optional.of(new Subject("Test"))); - // add new related mails ThreadId threadId = testee.guessThreadIdReactive(newBasedMessageId, mimeMessageId, inReplyTo, references, subject, mailboxSession).block(); @@ -175,7 +153,7 @@ public abstract class ThreadIdGuessingAlgorithmContract { @MethodSource void givenOldMailWhenAddNewMailsWithRelatedSubjectButHaveNonIdenticalMessageIDThenGuessingThreadIdShouldBasedOnGeneratedMessageId(Optional<MimeMessageId> mimeMessageId, Optional<MimeMessageId> inReplyTo, Optional<List<MimeMessageId>> references, Optional<Subject> subject) throws Exception { // given old mail - MessageManager.AppendResult message = inbox.appendMessage(MessageManager.AppendCommand.from(Message.Builder.of() + inbox.appendMessage(MessageManager.AppendCommand.from(Message.Builder.of() .setSubject("Test") .setMessageId("Message-ID") .setField(new RawField("In-Reply-To", "someInReplyTo")) @@ -183,11 +161,6 @@ public abstract class ThreadIdGuessingAlgorithmContract { .addField(new RawField("References", "references2")) .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); - Set<MimeMessageId> mimeMessageIds = buildMimeMessageIdSet(Optional.of(new MimeMessageId("Message-ID")), - Optional.of(new MimeMessageId("someInReplyTo")), - Optional.of(List.of(new MimeMessageId("references1"), new MimeMessageId("references2")))); - saveThreadData(mailboxSession.getUser(), mimeMessageIds, message.getId().getMessageId(), message.getThreadId(), Optional.of(new Subject("Test"))); - // add mails related to old message by subject but have non same identical Message-ID ThreadId threadId = testee.guessThreadIdReactive(newBasedMessageId, mimeMessageId, inReplyTo, references, subject, mailboxSession).block(); @@ -208,7 +181,7 @@ public abstract class ThreadIdGuessingAlgorithmContract { @MethodSource void givenOldMailWhenAddNewMailsWithNonRelatedSubjectButHaveSameIdenticalMessageIDThenGuessingThreadIdShouldBasedOnGeneratedMessageId(Optional<MimeMessageId> mimeMessageId, Optional<MimeMessageId> inReplyTo, Optional<List<MimeMessageId>> references, Optional<Subject> subject) throws Exception { // given old mail - MessageManager.AppendResult message = inbox.appendMessage(MessageManager.AppendCommand.from(Message.Builder.of() + inbox.appendMessage(MessageManager.AppendCommand.from(Message.Builder.of() .setSubject("Test") .setMessageId("Message-ID") .setField(new RawField("In-Reply-To", "someInReplyTo")) @@ -216,11 +189,6 @@ public abstract class ThreadIdGuessingAlgorithmContract { .addField(new RawField("References", "references2")) .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); - Set<MimeMessageId> mimeMessageIds = buildMimeMessageIdSet(Optional.of(new MimeMessageId("Message-ID")), - Optional.of(new MimeMessageId("someInReplyTo")), - Optional.of(List.of(new MimeMessageId("references1"), new MimeMessageId("references2")))); - saveThreadData(mailboxSession.getUser(), mimeMessageIds, message.getId().getMessageId(), message.getThreadId(), Optional.of(new Subject("Test"))); - // add mails related to old message by having identical Message-ID but non related subject ThreadId threadId = testee.guessThreadIdReactive(newBasedMessageId, mimeMessageId, inReplyTo, references, subject, mailboxSession).block(); @@ -241,7 +209,7 @@ public abstract class ThreadIdGuessingAlgorithmContract { @MethodSource void givenOldMailWhenAddNonRelatedMailsThenGuessingThreadIdShouldBasedOnGeneratedMessageId(Optional<MimeMessageId> mimeMessageId, Optional<MimeMessageId> inReplyTo, Optional<List<MimeMessageId>> references, Optional<Subject> subject) throws Exception { // given old mail - MessageManager.AppendResult message = inbox.appendMessage(MessageManager.AppendCommand.from(Message.Builder.of() + inbox.appendMessage(MessageManager.AppendCommand.from(Message.Builder.of() .setSubject("Test") .setMessageId("Message-ID") .setField(new RawField("In-Reply-To", "someInReplyTo")) @@ -249,11 +217,6 @@ public abstract class ThreadIdGuessingAlgorithmContract { .addField(new RawField("References", "references2")) .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); - Set<MimeMessageId> mimeMessageIds = buildMimeMessageIdSet(Optional.of(new MimeMessageId("Message-ID")), - Optional.of(new MimeMessageId("someInReplyTo")), - Optional.of(List.of(new MimeMessageId("references1"), new MimeMessageId("references2")))); - saveThreadData(mailboxSession.getUser(), mimeMessageIds, message.getId().getMessageId(), message.getThreadId(), Optional.of(new Subject("Test"))); - // add mails non related to old message by both subject and identical Message-ID ThreadId threadId = testee.guessThreadIdReactive(newBasedMessageId, mimeMessageId, inReplyTo, references, subject, mailboxSession).block(); @@ -262,19 +225,17 @@ public abstract class ThreadIdGuessingAlgorithmContract { } @Test - void givenThreeMailsInAThreadThenGetThreadShouldReturnAListWithThreeMessageIdsSortedByArrivalDate() throws MailboxException { - MailboxMessage message1 = createMessage(mailbox, ThreadId.fromBaseMessageId(newBasedMessageId)); - MailboxMessage message2 = createMessage(mailbox, ThreadId.fromBaseMessageId(newBasedMessageId)); - MailboxMessage message3 = createMessage(mailbox, ThreadId.fromBaseMessageId(newBasedMessageId)); - - appendMessageThenDispatchAddedEvent(mailbox, message1); - appendMessageThenDispatchAddedEvent(mailbox, message2); - appendMessageThenDispatchAddedEvent(mailbox, message3); + void givenThreeMailsInAThreadThenGetThreadShouldReturnAListWithThreeMessageIdsSortedByArrivalDate() throws Exception { + MessageManager.AppendResult message1 = appendMessage(inbox, new Subject(newBasedMessageId.serialize())); + MessageManager.AppendResult message2 = appendMessage(inbox, new Subject(newBasedMessageId.serialize())); + MessageManager.AppendResult message3 = appendMessage(inbox, new Subject(newBasedMessageId.serialize())); - Flux<MessageId> messageIds = testee.getMessageIdsInThread(ThreadId.fromBaseMessageId(newBasedMessageId), mailboxSession); + Flux<MessageId> messageIds = testee.getMessageIdsInThread(message1.getThreadId(), mailboxSession); assertThat(messageIds.collectList().block()) - .isEqualTo(ImmutableList.of(message1.getMessageId(), message2.getMessageId(), message3.getMessageId())); + .isEqualTo(ImmutableList.of(message1.getId().getMessageId(), + message2.getId().getMessageId(), + message3.getId().getMessageId())); } @Test @@ -285,63 +246,40 @@ public abstract class ThreadIdGuessingAlgorithmContract { } @Test - void givenAMailInAThreadThenGetThreadShouldReturnAListWithOnlyOneMessageIdInThatThread() throws MailboxException { - MailboxMessage message1 = createMessage(mailbox, ThreadId.fromBaseMessageId(newBasedMessageId)); - - appendMessageThenDispatchAddedEvent(mailbox, message1); + void givenAMailInAThreadThenGetThreadShouldReturnAListWithOnlyOneMessageIdInThatThread() throws Exception { + MessageManager.AppendResult message1 = appendMessage(inbox, new Subject(newBasedMessageId.serialize())); - Flux<MessageId> messageIds = testee.getMessageIdsInThread(ThreadId.fromBaseMessageId(newBasedMessageId), mailboxSession); + Flux<MessageId> messageIds = testee.getMessageIdsInThread(message1.getThreadId(), mailboxSession); assertThat(messageIds.collectList().block()) - .containsOnly(message1.getMessageId()); + .containsOnly(message1.getId().getMessageId()); } @Test - void givenTwoDistinctThreadsThenGetThreadShouldNotReturnUnrelatedMails() throws MailboxException { + void givenTwoDistinctThreadsThenGetThreadShouldNotReturnUnrelatedMails() throws Exception { // given message1 and message2 in thread1, message3 in thread2 - ThreadId threadId1 = ThreadId.fromBaseMessageId(newBasedMessageId); - ThreadId threadId2 = ThreadId.fromBaseMessageId(otherBasedMessageId); - MailboxMessage message1 = createMessage(mailbox, threadId1); - MailboxMessage message2 = createMessage(mailbox, threadId1); - MailboxMessage message3 = createMessage(mailbox, threadId2); - - appendMessageThenDispatchAddedEvent(mailbox, message1); - appendMessageThenDispatchAddedEvent(mailbox, message2); - appendMessageThenDispatchAddedEvent(mailbox, message3); + Subject subject1 = new Subject(newBasedMessageId.serialize()); + Subject subject2 = new Subject(otherBasedMessageId.serialize()); + MessageManager.AppendResult message1 = appendMessage(inbox, subject1); + MessageManager.AppendResult message2 = appendMessage(inbox, subject1); + MessageManager.AppendResult message3 = appendMessage(inbox, subject2); // then get thread2 should not return unrelated message1 and message2 - Flux<MessageId> messageIds = testee.getMessageIdsInThread(ThreadId.fromBaseMessageId(otherBasedMessageId), mailboxSession); + Flux<MessageId> messageIds = testee.getMessageIdsInThread(message3.getThreadId(), mailboxSession); assertThat(messageIds.collectList().block()) - .doesNotContain(message1.getMessageId(), message2.getMessageId()); - } - - private SimpleMailboxMessage createMessage(Mailbox mailbox, ThreadId threadId) { - MessageId messageId = messageIdFactory.generate(); - String content = "Some content"; - int bodyStart = 12; - return new SimpleMailboxMessage(messageId, - threadId, - new Date(), - content.length(), - bodyStart, - new ByteContent(content.getBytes()), - new Flags(), - new PropertyBuilder().build(), - mailbox.getMailboxId()); + .doesNotContain(message1.getId().getMessageId(), message2.getId().getMessageId()) + .containsOnly(message3.getId().getMessageId()); } - private void appendMessageThenDispatchAddedEvent(Mailbox mailbox, MailboxMessage mailboxMessage) throws MailboxException { - MessageMetaData messageMetaData = messageMapper.add(mailbox, mailboxMessage); - eventBus.dispatch(EventFactory.added() - .randomEventId() - .mailboxSession(mailboxSession) - .mailbox(mailbox) - .addMetaData(messageMetaData) - .isDelivery(!IS_DELIVERY) - .isAppended(IS_APPENDED) - .build(), - new MailboxIdRegistrationKey(mailbox.getMailboxId())).block(); + protected MessageManager.AppendResult appendMessage(MessageManager mailbox, Subject subject) throws Exception { + return mailbox.appendMessage(MessageManager.AppendCommand.from(Message.Builder.of() + .setSubject(subject.getValue()) + .setMessageId("Message-ID") + .setField(new RawField("In-Reply-To", "someInReplyTo")) + .addField(new RawField("References", "references1")) + .addField(new RawField("References", "references2")) + .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); } protected Set<MimeMessageId> buildMimeMessageIdSet(Optional<MimeMessageId> mimeMessageId, Optional<MimeMessageId> inReplyTo, Optional<List<MimeMessageId>> references) { --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org