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 8613836da8145f669ee235210e34ef028e4c4df4
Author: Quan Tran <[email protected]>
AuthorDate: Wed Sep 17 10:42:35 2025 +0700

    [BUILD] [apache-james-mailbox-opensearch] 
OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest: only tests related behavior
    
    Not really needed to repeat the whole OpenSearchIntegrationTest.
---
 ...hOptimizeMoveAndFuzzySearchIntegrationTest.java | 144 ++++++++++++++++++---
 1 file changed, 127 insertions(+), 17 deletions(-)

diff --git 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest.java
 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest.java
index 249c50fcfd..42f3b273f8 100644
--- 
a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest.java
+++ 
b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest.java
@@ -19,27 +19,145 @@
 
 package org.apache.james.mailbox.opensearch;
 
+import static 
org.apache.james.mailbox.opensearch.OpenSearchIntegrationTest.SEARCH_SIZE;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Durations.ONE_HUNDRED_MILLISECONDS;
 
+import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-
+import java.time.ZoneId;
+import java.util.UUID;
+
+import org.apache.james.backends.opensearch.DockerOpenSearchExtension;
+import org.apache.james.backends.opensearch.IndexName;
+import org.apache.james.backends.opensearch.OpenSearchIndexer;
+import org.apache.james.backends.opensearch.ReactorOpenSearchClient;
+import org.apache.james.backends.opensearch.ReadAliasName;
+import org.apache.james.backends.opensearch.WriteAliasName;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.inmemory.InMemoryMessageId;
+import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.SearchQuery;
+import 
org.apache.james.mailbox.opensearch.events.OpenSearchListeningMessageSearchIndex;
+import org.apache.james.mailbox.opensearch.json.MessageToOpenSearchJson;
+import org.apache.james.mailbox.opensearch.query.DefaultCriterionConverter;
+import org.apache.james.mailbox.opensearch.query.QueryConverter;
+import org.apache.james.mailbox.opensearch.search.OpenSearchSearcher;
+import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
+import org.apache.james.mailbox.tika.TikaExtension;
+import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.mime4j.dom.Message;
-import org.junit.jupiter.api.Disabled;
+import org.awaitility.Awaitility;
+import org.awaitility.Durations;
+import org.awaitility.core.ConditionFactory;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.opensearch.client.opensearch._types.query_dsl.Query;
 import org.opensearch.client.opensearch._types.query_dsl.QueryBuilders;
+import org.opensearch.client.opensearch.core.SearchRequest;
+
+import com.google.common.collect.ImmutableSet;
 
 import reactor.core.publisher.Flux;
 
-class OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest extends 
OpenSearchIntegrationTest {
+class OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest  {
+    @RegisterExtension
+    static TikaExtension tika = new TikaExtension();
+
+    @RegisterExtension
+    static DockerOpenSearchExtension openSearch = new 
DockerOpenSearchExtension();
+
+    private static final ConditionFactory CALMLY_AWAIT = Awaitility
+        .with().pollInterval(ONE_HUNDRED_MILLISECONDS)
+        .and().pollDelay(ONE_HUNDRED_MILLISECONDS)
+        .await();
+    private static final Username USERNAME = Username.of("benwa");
+    static ReactorOpenSearchClient client;
+
+    private ReadAliasName readAliasName;
+    private WriteAliasName writeAliasName;
+    private IndexName indexName;
+    private StoreMailboxManager storeMailboxManager;
+    private MessageId.Factory messageIdFactory;
+    private MailboxPath inboxPath;
+
+    @BeforeAll
+    static void setUpAll() {
+        client = openSearch.getDockerOpenSearch().clientProvider().get();
+    }
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        initializeMailboxManager();
+        inboxPath = MailboxPath.inbox(USERNAME);
+        storeMailboxManager.createMailbox(inboxPath, 
storeMailboxManager.createSystemSession(USERNAME));
+    }
+
+    @AfterAll
+    static void tearDown() throws IOException {
+        client.close();
+    }
+
+    private void initializeMailboxManager() {
+        messageIdFactory = new InMemoryMessageId.Factory();
+
+        MailboxIdRoutingKeyFactory routingKeyFactory = new 
MailboxIdRoutingKeyFactory();
+
+        readAliasName = new ReadAliasName(UUID.randomUUID().toString());
+        writeAliasName = new WriteAliasName(UUID.randomUUID().toString());
+        indexName = new IndexName(UUID.randomUUID().toString());
+        MailboxIndexCreationUtil.prepareClient(
+            client, readAliasName, writeAliasName, indexName,
+            openSearch.getDockerOpenSearch().configuration(),
+            new DefaultMailboxMappingFactory());
+        QueryConverter queryConverter = new QueryConverter(new 
DefaultCriterionConverter(openSearchMailboxConfiguration()));
+
+        InMemoryIntegrationResources resources = 
InMemoryIntegrationResources.builder()
+            .preProvisionnedFakeAuthenticator()
+            .fakeAuthorizator()
+            .inVmEventBus()
+            .defaultAnnotationLimits()
+            .defaultMessageParser()
+            .listeningSearchIndex(preInstanciationStage -> new 
OpenSearchListeningMessageSearchIndex(
+                preInstanciationStage.getMapperFactory(),
+                ImmutableSet.of(),
+                new OpenSearchIndexer(client,
+                    writeAliasName),
+                new OpenSearchSearcher(client, queryConverter, SEARCH_SIZE,
+                    readAliasName, routingKeyFactory),
+                new MessageToOpenSearchJson(new DefaultTextExtractor(), 
ZoneId.of("Europe/Paris"), IndexAttachments.YES, IndexHeaders.YES),
+                preInstanciationStage.getSessionProvider(), routingKeyFactory, 
messageIdFactory,
+                openSearchMailboxConfiguration(), new RecordingMetricFactory(),
+                ImmutableSet.of()))
+            .noPreDeletionHooks()
+            .storeQuotaManager()
+            .build();
+
+        storeMailboxManager = resources.getMailboxManager();
+    }
+
+    private void awaitForOpenSearch(Query query, long totalHits) {
+        CALMLY_AWAIT.atMost(Durations.TEN_SECONDS)
+            .untilAsserted(() -> assertThat(client.search(
+                    new SearchRequest.Builder()
+                        .index(indexName.getValue())
+                        .query(query)
+                        .build())
+                .block()
+                .hits().total().value()).isEqualTo(totalHits));
+    }
 
-    @Override
-    protected OpenSearchMailboxConfiguration openSearchMailboxConfiguration() {
+    private OpenSearchMailboxConfiguration openSearchMailboxConfiguration() {
         return OpenSearchMailboxConfiguration.builder()
             .optimiseMoves(true)
             .textFuzzinessSearch(true)
@@ -48,9 +166,8 @@ class OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest 
extends OpenSearchInte
 
     @Test
     void searchShouldBeLenientOnUserTypo() throws Exception {
-        MailboxPath mailboxPath = MailboxPath.forUser(USERNAME, INBOX);
         MailboxSession session = MailboxSessionUtil.create(USERNAME);
-        MessageManager messageManager = 
storeMailboxManager.getMailbox(mailboxPath, session);
+        MessageManager messageManager = 
storeMailboxManager.getMailbox(inboxPath, session);
 
         String recipient = "[email protected]";
         ComposedMessageId composedMessageId = 
messageManager.appendMessage(MessageManager.AppendCommand.from(
@@ -60,7 +177,7 @@ class OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest 
extends OpenSearchInte
                     .setBody("fuzzy body", StandardCharsets.UTF_8)),
             session).getId();
 
-        awaitForOpenSearch(QueryBuilders.matchAll().build().toQuery(), 14);
+        awaitForOpenSearch(QueryBuilders.matchAll().build().toQuery(), 1);
 
         
assertThat(Flux.from(messageManager.search(SearchQuery.of(SearchQuery.subject("fuzzi")),
 session)).toStream())
             .containsExactly(composedMessageId.getUid());
@@ -70,9 +187,8 @@ class OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest 
extends OpenSearchInte
 
     @Test
     void searchShouldBeLenientOnAdjacentCharactersTranspositions() throws 
Exception {
-        MailboxPath mailboxPath = MailboxPath.forUser(USERNAME, INBOX);
         MailboxSession session = MailboxSessionUtil.create(USERNAME);
-        MessageManager messageManager = 
storeMailboxManager.getMailbox(mailboxPath, session);
+        MessageManager messageManager = 
storeMailboxManager.getMailbox(inboxPath, session);
 
         String recipient = "[email protected]";
         ComposedMessageId composedMessageId = 
messageManager.appendMessage(MessageManager.AppendCommand.from(
@@ -82,17 +198,11 @@ class OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest 
extends OpenSearchInte
                     .setBody("body", StandardCharsets.UTF_8)),
             session).getId();
 
-        awaitForOpenSearch(QueryBuilders.matchAll().build().toQuery(), 14);
+        awaitForOpenSearch(QueryBuilders.matchAll().build().toQuery(), 1);
 
         
assertThat(Flux.from(messageManager.search(SearchQuery.of(SearchQuery.subject("subjetc")),
 session)).toStream())
             .containsExactly(composedMessageId.getUid());
         
assertThat(Flux.from(messageManager.search(SearchQuery.of(SearchQuery.bodyContains("boyd")),
 session)).toStream())
             .containsExactly(composedMessageId.getUid());
     }
-
-    @Disabled("Fuzzyness makes the results wider")
-    @Override
-    void shouldMatchFileExtension() {
-
-    }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to