You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2026/07/15 10:17:36 UTC
(james-project) 21/39: [BUILD] CustomNamespaceContract: isolate using different users
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 <hq...@linagora.com>
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[bob@domain.tld]")
+ .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: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org