You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by hq...@apache.org on 2025/06/26 10:06:31 UTC

(james-project) branch master updated (e753c2b665 -> 37a8d71b31)

This is an automated email from the ASF dual-hosted git repository.

hqtran pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


    from e753c2b665 [FIX] Adapt maven-antrun-plugin syntax
     new a6c833daf5 JAMES-3516 PostgresThreadIdGuessingAlgorithmTest: relies on contract test
     new 37a8d71b31 JAMES-3516 ThreadIdGuessingAlgorithmContract should rely on MailboxManager to manipulate tests

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../CassandraThreadIdGuessingAlgorithmTest.java    |  29 +---
 .../PostgresThreadIdGuessingAlgorithmTest.java     | 109 +-------------
 .../SearchThreadIdGuessingAlgorithmTest.java       |  26 +---
 .../store/ThreadIdGuessingAlgorithmContract.java   | 164 +++++++--------------
 4 files changed, 63 insertions(+), 265 deletions(-)


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


(james-project) 01/02: JAMES-3516 PostgresThreadIdGuessingAlgorithmTest: relies on contract test

Posted by hq...@apache.org.
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 a6c833daf5e2b51da75f58ead28aca117a520d63
Author: Quan Tran <hq...@linagora.com>
AuthorDate: Wed Jun 25 15:07:07 2025 +0700

    JAMES-3516 PostgresThreadIdGuessingAlgorithmTest: relies on contract test
    
    rather than rewrite them.
---
 .../PostgresThreadIdGuessingAlgorithmTest.java     | 66 ----------------------
 1 file changed, 66 deletions(-)

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 3be8945fe6..5f79a3cf18 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
@@ -97,70 +97,4 @@ public class PostgresThreadIdGuessingAlgorithmTest extends ThreadIdGuessingAlgor
         threadDAO.insertSome(username, hashMimeMessagesIds(mimeMessageIds), PostgresMessageId.class.cast(messageId), threadId, hashSubject(baseSubject)).block();
     }
 
-    @Test
-    void givenAMailInAThreadThenGetThreadShouldReturnAListWithOnlyOneMessageIdInThatThread() throws MailboxException {
-        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"))));
-
-        MessageId messageId = initNewBasedMessageId();
-        ThreadId threadId = ThreadId.fromBaseMessageId(newBasedMessageId);
-        saveThreadData(mailboxSession.getUser(), mimeMessageIds, messageId, threadId, Optional.of(new Subject("Test")));
-
-        Flux<MessageId> messageIds = testee.getMessageIdsInThread(threadId, mailboxSession);
-
-        assertThat(messageIds.collectList().block())
-            .containsOnly(messageId);
-    }
-
-    @Test
-    void givenTwoDistinctThreadsThenGetThreadShouldNotReturnUnrelatedMails() throws MailboxException {
-        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"))));
-
-        MessageId messageId1 = initNewBasedMessageId();
-        MessageId messageId2 = initNewBasedMessageId();
-        MessageId messageId3 = initNewBasedMessageId();
-        ThreadId threadId1 = ThreadId.fromBaseMessageId(newBasedMessageId);
-        ThreadId threadId2 = ThreadId.fromBaseMessageId(otherBasedMessageId);
-
-        saveThreadData(mailboxSession.getUser(), mimeMessageIds, messageId1, threadId1, Optional.of(new Subject("Test")));
-        saveThreadData(mailboxSession.getUser(), mimeMessageIds, messageId2, threadId1, Optional.of(new Subject("Test")));
-        saveThreadData(mailboxSession.getUser(), mimeMessageIds, messageId3, threadId2, Optional.of(new Subject("Test")));
-
-        Flux<MessageId> messageIds = testee.getMessageIdsInThread(ThreadId.fromBaseMessageId(otherBasedMessageId), mailboxSession);
-
-        assertThat(messageIds.collectList().block())
-            .doesNotContain(messageId1, messageId2);
-    }
-
-    @Test
-    void givenThreeMailsInAThreadThenGetThreadShouldReturnAListWithThreeMessageIdsSortedByArrivalDate() {
-        Set<MimeMessageId> mimeMessageIds = ImmutableSet.of(new MimeMessageId("Message-ID"));
-
-        MessageId messageId1 = initNewBasedMessageId();
-        MessageId messageId2 = initNewBasedMessageId();
-        MessageId messageId3 = initNewBasedMessageId();
-        ThreadId threadId1 = ThreadId.fromBaseMessageId(newBasedMessageId);
-
-        saveThreadData(mailboxSession.getUser(), mimeMessageIds, messageId1, threadId1, Optional.of(new Subject("Test1")));
-        saveThreadData(mailboxSession.getUser(), mimeMessageIds, messageId2, threadId1, Optional.of(new Subject("Test2")));
-        saveThreadData(mailboxSession.getUser(), mimeMessageIds, messageId3, threadId1, Optional.of(new Subject("Test3")));
-
-        Flux<MessageId> messageIds = testee.getMessageIdsInThread(ThreadId.fromBaseMessageId(newBasedMessageId), mailboxSession);
-
-        assertThat(messageIds.collectList().block())
-            .isEqualTo(ImmutableList.of(messageId1, messageId2, messageId3));
-    }
-
-    private Set<Integer> hashMimeMessagesIds(Set<MimeMessageId> mimeMessageIds) {
-        return mimeMessageIds.stream()
-            .map(mimeMessageId -> Hashing.murmur3_32_fixed().hashBytes(mimeMessageId.getValue().getBytes()).asInt())
-            .collect(Collectors.toSet());
-    }
-
-    private Optional<Integer> hashSubject(Optional<Subject> baseSubjectOptional) {
-        return baseSubjectOptional.map(baseSubject -> Hashing.murmur3_32_fixed().hashBytes(baseSubject.getValue().getBytes()).asInt());
-    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


(james-project) 02/02: JAMES-3516 ThreadIdGuessingAlgorithmContract should rely on MailboxManager to manipulate tests

Posted by hq...@apache.org.
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 <hq...@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-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org