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

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

commit 1daa2be6b0635381455acef1242d23afbebe924a
Author: Quan Tran <[email protected]>
AuthorDate: Mon Jul 13 22:58:38 2026 +0700

    [BUILD] CustomNamespaceContract: isolate using different users
---
 .../DistributedCustomNamespaceTest.java            |  1 +
 .../rfc8621/contract/CustomNamespaceContract.scala | 54 ++++++++++++++--------
 .../rfc8621/memory/MemoryCustomNamespaceTest.java  |  1 +
 .../postgres/PostgresCustomNamespaceTest.java      |  1 +
 4 files changed, 39 insertions(+), 18 deletions(-)

diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedCustomNamespaceTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedCustomNamespaceTest.java
index c8bf3066ab..78cd906205 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedCustomNamespaceTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedCustomNamespaceTest.java
@@ -52,5 +52,6 @@ public class DistributedCustomNamespaceTest implements 
CustomNamespaceContract {
         .server(configuration -> 
CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new CustomNamespaceModule()))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 }
diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomNamespaceContract.scala
 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomNamespaceContract.scala
index 3b4b93ff3a..db6c5af912 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomNamespaceContract.scala
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomNamespaceContract.scala
@@ -19,16 +19,20 @@
 
 package org.apache.james.jmap.rfc8621.contract
 
+import java.nio.charset.StandardCharsets
+import java.util.UUID
+
+import com.google.common.hash.Hashing
 import com.google.inject.AbstractModule
 import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT
 import io.restassured.RestAssured._
 import io.restassured.http.ContentType.JSON
 import org.apache.http.HttpStatus.SC_OK
 import org.apache.james.GuiceJamesServer
+import org.apache.james.core.Username
 import org.apache.james.jmap.http.UserCredential
 import org.apache.james.jmap.mail.{DelegatedNamespace, MailboxNamespace, 
NamespaceFactory, PersonalNamespace}
-import 
org.apache.james.jmap.rfc8621.contract.CustomNamespaceContract.{CUSTOM_NAMESPACE_MAILBOX_PATH,
 DELEGATED_NAMESPACE_MAILBOX_PATH, PERSONAL_NAMESPACE_MAILBOX_PATH}
-import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
ACCOUNT_ID, BOB, BOB_PASSWORD, DOMAIN, authScheme, baseRequestSpecBuilder}
+import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
BOB_PASSWORD, DOMAIN, authScheme, baseRequestSpecBuilder}
 import org.apache.james.mailbox.MailboxSession
 import org.apache.james.mailbox.model.MailboxPath
 import org.apache.james.modules.MailboxProbeImpl
@@ -36,6 +40,11 @@ import org.apache.james.utils.DataProbeImpl
 import org.assertj.core.api.Assertions.assertThat
 import org.junit.jupiter.api.{BeforeEach, Test}
 
+object CustomNamespaceContractContext {
+  case class TestContext(bobUsername: Username, bobAccountId: String)
+  val currentContext: java.util.concurrent.atomic.AtomicReference[TestContext] 
= new java.util.concurrent.atomic.AtomicReference[TestContext]()
+}
+
 case class CustomMailboxNamespace(value: String) extends MailboxNamespace {
   override def serialize(): String = value
 }
@@ -47,37 +56,46 @@ class CustomNamespaceModule extends AbstractModule {
 
 class CustomNamespaceFactory extends NamespaceFactory {
 
-  def from(mailboxPath: MailboxPath, mailboxSession: MailboxSession): 
MailboxNamespace = mailboxPath match {
-    case PERSONAL_NAMESPACE_MAILBOX_PATH => PersonalNamespace()
-    case DELEGATED_NAMESPACE_MAILBOX_PATH => 
DelegatedNamespace(mailboxSession.getUser)
-    case CUSTOM_NAMESPACE_MAILBOX_PATH => CustomMailboxNamespace("custom 123")
+  def from(mailboxPath: MailboxPath, mailboxSession: MailboxSession): 
MailboxNamespace = {
+    val user = mailboxSession.getUser
+    if (mailboxPath == MailboxPath.forUser(user, "personal")) 
PersonalNamespace()
+    else if (mailboxPath == MailboxPath.forUser(user, "delegated")) 
DelegatedNamespace(user)
+    else if (mailboxPath == MailboxPath.forUser(user, "custom")) 
CustomMailboxNamespace("custom 123")
+    else PersonalNamespace()
   }
 }
 
 object CustomNamespaceContract {
-  val CUSTOM_NAMESPACE_MAILBOX_PATH: MailboxPath = MailboxPath.forUser(BOB, 
"custom")
-  val PERSONAL_NAMESPACE_MAILBOX_PATH: MailboxPath = MailboxPath.forUser(BOB, 
"personal")
-  val DELEGATED_NAMESPACE_MAILBOX_PATH: MailboxPath = MailboxPath.forUser(BOB, 
"delegated")
 }
 
 trait CustomNamespaceContract {
+  import CustomNamespaceContractContext.currentContext
+
+  def bobUsername: Username = currentContext.get().bobUsername
+  def bobAccountId: String = currentContext.get().bobAccountId
+  def customNamespaceMailboxPath: MailboxPath = 
MailboxPath.forUser(bobUsername, "custom")
+  def personalNamespaceMailboxPath: MailboxPath = 
MailboxPath.forUser(bobUsername, "personal")
+  def delegatedNamespaceMailboxPath: MailboxPath = 
MailboxPath.forUser(bobUsername, "delegated")
 
   @BeforeEach
   def setUp(server: GuiceJamesServer): Unit = {
+    val bob = 
Username.fromLocalPartWithDomain(s"bob${UUID.randomUUID().toString.replace("-", 
"").take(8)}", DOMAIN)
+    currentContext.set(CustomNamespaceContractContext.TestContext(
+      bob, Hashing.sha256().hashString(bob.asString(), 
StandardCharsets.UTF_8).toString))
     server.getProbe(classOf[DataProbeImpl])
       .fluent
       .addDomain(DOMAIN.asString)
-      .addUser(BOB.asString, BOB_PASSWORD)
+      .addUser(bobUsername.asString, BOB_PASSWORD)
 
     requestSpecification = baseRequestSpecBuilder(server)
-      .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD)))
+      .setAuth(authScheme(UserCredential(bobUsername, BOB_PASSWORD)))
       .build
   }
 
   @Test
   def getMailboxShouldIncludeCustomNamespaceWhenAssociated(server: 
GuiceJamesServer): Unit = {
     val mailboxId: String = server.getProbe(classOf[MailboxProbeImpl])
-      .createMailbox(CUSTOM_NAMESPACE_MAILBOX_PATH)
+      .createMailbox(customNamespaceMailboxPath)
       .serialize
 
     val namespace: String = `given`()
@@ -91,7 +109,7 @@ trait CustomNamespaceContract {
            |  "methodCalls": [[
            |    "Mailbox/get",
            |    {
-           |      "accountId": "$ACCOUNT_ID",
+           |      "accountId": "$bobAccountId",
            |      "ids": ["${mailboxId}"]
            |    },
            |    "c1"]]
@@ -112,7 +130,7 @@ trait CustomNamespaceContract {
   @Test
   def getMailboxShouldIncludePersonalNamespaceWhenAssociated(server: 
GuiceJamesServer): Unit = {
     val mailboxId: String = server.getProbe(classOf[MailboxProbeImpl])
-      .createMailbox(PERSONAL_NAMESPACE_MAILBOX_PATH)
+      .createMailbox(personalNamespaceMailboxPath)
       .serialize
 
     val namespace: String = `given`()
@@ -126,7 +144,7 @@ trait CustomNamespaceContract {
            |  "methodCalls": [[
            |    "Mailbox/get",
            |    {
-           |      "accountId": "$ACCOUNT_ID",
+           |      "accountId": "$bobAccountId",
            |      "ids": ["${mailboxId}"]
            |    },
            |    "c1"]]
@@ -147,7 +165,7 @@ trait CustomNamespaceContract {
   @Test
   def getMailboxShouldIncludeDelegatedNamespaceWhenAssociated(server: 
GuiceJamesServer): Unit = {
     val mailboxId: String = server.getProbe(classOf[MailboxProbeImpl])
-      .createMailbox(DELEGATED_NAMESPACE_MAILBOX_PATH)
+      .createMailbox(delegatedNamespaceMailboxPath)
       .serialize
 
     val namespace: String = `given`()
@@ -161,7 +179,7 @@ trait CustomNamespaceContract {
            |  "methodCalls": [[
            |    "Mailbox/get",
            |    {
-           |      "accountId": "$ACCOUNT_ID",
+           |      "accountId": "$bobAccountId",
            |      "ids": ["${mailboxId}"]
            |    },
            |    "c1"]]
@@ -176,6 +194,6 @@ trait CustomNamespaceContract {
       .get("methodResponses[0][1].list[0].namespace")
 
     assertThat(namespace)
-      .isEqualTo("Delegated[[email protected]]")
+      .isEqualTo(s"Delegated[${bobUsername.asString}]")
   }
 }
diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryCustomNamespaceTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryCustomNamespaceTest.java
index c842486822..aabd3de6cc 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryCustomNamespaceTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryCustomNamespaceTest.java
@@ -41,5 +41,6 @@ public class MemoryCustomNamespaceTest implements 
CustomNamespaceContract {
         .server(configuration -> 
MemoryJamesServerMain.createServer(configuration)
             .overrideWith(new CustomNamespaceModule())
             .overrideWith(new TestJMAPServerModule()))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 }
diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresCustomNamespaceTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresCustomNamespaceTest.java
index f6bef51a26..10043b90ed 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresCustomNamespaceTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresCustomNamespaceTest.java
@@ -54,5 +54,6 @@ public class PostgresCustomNamespaceTest implements 
CustomNamespaceContract {
         .server(configuration -> 
PostgresJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new CustomNamespaceModule()))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 }


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

Reply via email to