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

Reply via email to