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:37 UTC
(james-project) 22/39: [BUILD] DelegatedAccountSetContract: 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 fe64016a8cb85437ab027152ac702be5eea5331e
Author: Quan Tran <hq...@linagora.com>
AuthorDate: Mon Jul 13 22:58:38 2026 +0700
[BUILD] DelegatedAccountSetContract: isolate using different users
---
.../DistributedDelegatedAccountSetMethodTest.java | 2 +-
.../contract/DelegatedAccountSetContract.scala | 84 +++++++++++++---------
.../MemoryDelegatedAccountSetMethodTest.java | 2 +-
.../postgres/PostgresDelegatedAccountSetTest.java | 2 +-
4 files changed, 55 insertions(+), 35 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/DistributedDelegatedAccountSetMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDelegatedAccountSetMethodTest.java
index c6a7657157..1822981098 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDelegatedAccountSetMethodTest.java
+++ b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDelegatedAccountSetMethodTest.java
@@ -21,6 +21,6 @@ package org.apache.james.jmap.rfc8621.distributed;
import org.apache.james.jmap.rfc8621.contract.DelegatedAccountSetContract;
-public class DistributedDelegatedAccountSetMethodTest extends DistributedBase implements DelegatedAccountSetContract {
+public class DistributedDelegatedAccountSetMethodTest extends PerClassDistributedBase implements DelegatedAccountSetContract {
}
\ No newline at end of file
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/DelegatedAccountSetContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DelegatedAccountSetContract.scala
index df7a0678e6..fd7b0b5bb3 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DelegatedAccountSetContract.scala
+++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DelegatedAccountSetContract.scala
@@ -19,17 +19,21 @@
package org.apache.james.jmap.rfc8621.contract
+import java.nio.charset.StandardCharsets
+import java.util.UUID
+
+import com.google.common.hash.Hashing
import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT
import io.restassured.RestAssured.{`given`, requestSpecification}
import io.restassured.http.ContentType.JSON
import net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson
import org.apache.http.HttpStatus.SC_OK
import org.apache.james.GuiceJamesServer
+import org.apache.james.core.Username
import org.apache.james.jmap.core.ResponseObject.SESSION_STATE
import org.apache.james.jmap.delegation.DelegationId
import org.apache.james.jmap.http.UserCredential
-import org.apache.james.jmap.rfc8621.contract.DelegatedAccountSetContract.BOB_ACCOUNT_ID
-import org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, ANDRE, ANDRE_ACCOUNT_ID, ANDRE_PASSWORD, BOB, BOB_PASSWORD, CEDRIC, DOMAIN, authScheme, baseRequestSpecBuilder}
+import org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, ANDRE_PASSWORD, BOB_PASSWORD, DOMAIN, authScheme, baseRequestSpecBuilder}
import org.apache.james.jmap.rfc8621.contract.probe.DelegationProbe
import org.apache.james.utils.DataProbeImpl
import org.assertj.core.api.Assertions.assertThat
@@ -38,29 +42,45 @@ import org.junit.jupiter.api.{BeforeEach, Test}
import scala.jdk.CollectionConverters._
object DelegatedAccountSetContract {
- val BOB_ACCOUNT_ID: String = Fixture.ACCOUNT_ID
+ case class TestContext(bobUsername: Username, bobAccountId: String, andreUsername: Username, andreAccountId: String, cedricUsername: Username)
+ val currentContext: java.util.concurrent.atomic.AtomicReference[TestContext] = new java.util.concurrent.atomic.AtomicReference[TestContext]()
}
trait DelegatedAccountSetContract {
+ import DelegatedAccountSetContract.currentContext
+
+ def bobUsername: Username = currentContext.get().bobUsername
+ def bobAccountId: String = currentContext.get().bobAccountId
+ def andreUsername: Username = currentContext.get().andreUsername
+ def andreAccountId: String = currentContext.get().andreAccountId
+ def cedricUsername: Username = currentContext.get().cedricUsername
+
@BeforeEach
def setUp(server: GuiceJamesServer): Unit = {
+ val uniqueSuffix = UUID.randomUUID().toString.replace("-", "").take(8)
+ val bob = Username.fromLocalPartWithDomain(s"bob$uniqueSuffix", DOMAIN)
+ val andre = Username.fromLocalPartWithDomain(s"andre$uniqueSuffix", DOMAIN)
+ val cedric = Username.fromLocalPartWithDomain(s"cedric$uniqueSuffix", DOMAIN)
+ currentContext.set(DelegatedAccountSetContract.TestContext(
+ bob, Hashing.sha256().hashString(bob.asString(), StandardCharsets.UTF_8).toString,
+ andre, Hashing.sha256().hashString(andre.asString(), StandardCharsets.UTF_8).toString, cedric))
server.getProbe(classOf[DataProbeImpl])
.fluent
.addDomain(DOMAIN.asString)
- .addUser(BOB.asString, BOB_PASSWORD)
- .addUser(ANDRE.asString(), ANDRE_PASSWORD)
- .addUser(CEDRIC.asString(), "secret")
+ .addUser(bob.asString, BOB_PASSWORD)
+ .addUser(andre.asString, ANDRE_PASSWORD)
+ .addUser(cedric.asString, "secret")
requestSpecification = baseRequestSpecBuilder(server)
- .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD)))
+ .setAuth(authScheme(UserCredential(bobUsername, BOB_PASSWORD)))
.build
}
@Test
def delegatedAccountDestroyShouldSucceed(server: GuiceJamesServer): Unit = {
server.getProbe(classOf[DelegationProbe])
- .addAuthorizedUser(ANDRE, BOB)
- val andreToBobDelegationId = DelegationId.from(ANDRE, BOB).serialize
+ .addAuthorizedUser(andreUsername, bobUsername)
+ val andreToBobDelegationId = DelegationId.from(andreUsername, bobUsername).serialize
val request =
s"""{
@@ -68,7 +88,7 @@ trait DelegatedAccountSetContract {
| "methodCalls": [
| [
| "DelegatedAccount/set", {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "destroy": ["$andreToBobDelegationId"]
| }, "0"
| ]
@@ -95,7 +115,7 @@ trait DelegatedAccountSetContract {
| [
| "DelegatedAccount/set",
| {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "newState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943",
| "destroyed": ["$andreToBobDelegationId"]
| },
@@ -104,17 +124,17 @@ trait DelegatedAccountSetContract {
| ]
|}""".stripMargin)
- assertThat(server.getProbe(classOf[DelegationProbe]).getDelegatedUsers(BOB).asJavaCollection)
+ assertThat(server.getProbe(classOf[DelegationProbe]).getDelegatedUsers(bobUsername).asJavaCollection)
.isEmpty()
}
@Test
def mixedCaseShouldDestroyOnlyRequestedEntry(server: GuiceJamesServer): Unit = {
server.getProbe(classOf[DelegationProbe])
- .addAuthorizedUser(ANDRE, BOB)
+ .addAuthorizedUser(andreUsername, bobUsername)
server.getProbe(classOf[DelegationProbe])
- .addAuthorizedUser(CEDRIC, BOB)
- val andreToBobDelegationId = DelegationId.from(ANDRE, BOB).serialize
+ .addAuthorizedUser(cedricUsername, bobUsername)
+ val andreToBobDelegationId = DelegationId.from(andreUsername, bobUsername).serialize
val request =
s"""{
@@ -122,7 +142,7 @@ trait DelegatedAccountSetContract {
| "methodCalls": [
| [
| "DelegatedAccount/set", {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "destroy": ["$andreToBobDelegationId"]
| }, "0"
| ]
@@ -149,7 +169,7 @@ trait DelegatedAccountSetContract {
| [
| "DelegatedAccount/set",
| {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "newState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943",
| "destroyed": ["$andreToBobDelegationId"]
| },
@@ -158,15 +178,15 @@ trait DelegatedAccountSetContract {
| ]
|}""".stripMargin)
- assertThat(server.getProbe(classOf[DelegationProbe]).getDelegatedUsers(BOB).asJavaCollection)
- .containsExactly(CEDRIC)
+ assertThat(server.getProbe(classOf[DelegationProbe]).getDelegatedUsers(bobUsername).asJavaCollection)
+ .containsExactly(cedricUsername)
}
@Test
def delegatedAccountDestroyShouldFailWhenMissingDelegationCapability(server: GuiceJamesServer): Unit = {
server.getProbe(classOf[DelegationProbe])
- .addAuthorizedUser(ANDRE, BOB)
- val delegationId = DelegationId.from(ANDRE, BOB).serialize
+ .addAuthorizedUser(andreUsername, bobUsername)
+ val delegationId = DelegationId.from(andreUsername, bobUsername).serialize
val request =
s"""{
@@ -174,7 +194,7 @@ trait DelegatedAccountSetContract {
| "methodCalls": [
| [
| "DelegatedAccount/set", {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "destroy": ["$delegationId"]
| }, "0"
| ]
@@ -213,8 +233,8 @@ trait DelegatedAccountSetContract {
@Test
def delegatedAccountDestroyShouldBeIdempotent(server: GuiceJamesServer): Unit = {
server.getProbe(classOf[DelegationProbe])
- .addAuthorizedUser(ANDRE, BOB)
- val andreToBobDelegationId = DelegationId.from(ANDRE, BOB).serialize
+ .addAuthorizedUser(andreUsername, bobUsername)
+ val andreToBobDelegationId = DelegationId.from(andreUsername, bobUsername).serialize
val request =
s"""{
@@ -222,7 +242,7 @@ trait DelegatedAccountSetContract {
| "methodCalls": [
| [
| "DelegatedAccount/set", {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "destroy": ["$andreToBobDelegationId", "$andreToBobDelegationId"]
| }, "0"
| ]
@@ -249,7 +269,7 @@ trait DelegatedAccountSetContract {
| [
| "DelegatedAccount/set",
| {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "newState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943",
| "destroyed": ["$andreToBobDelegationId", "$andreToBobDelegationId"]
| },
@@ -267,7 +287,7 @@ trait DelegatedAccountSetContract {
| "methodCalls": [
| [
| "DelegatedAccount/set", {
- | "accountId": "$ANDRE_ACCOUNT_ID",
+ | "accountId": "$andreAccountId",
| "destroy": ["any"]
| }, "0"
| ]
@@ -296,7 +316,7 @@ trait DelegatedAccountSetContract {
@Test
def bobCanOnlyManageHisPrimaryAccountSetting(server: GuiceJamesServer): Unit = {
- server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(ANDRE, BOB)
+ server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(andreUsername, bobUsername)
val request =
s"""{
@@ -304,7 +324,7 @@ trait DelegatedAccountSetContract {
| "methodCalls": [
| [
| "DelegatedAccount/set", {
- | "accountId": "$ANDRE_ACCOUNT_ID",
+ | "accountId": "$andreAccountId",
| "destroy": ["any"]
| }, "0"
| ]
@@ -345,7 +365,7 @@ trait DelegatedAccountSetContract {
| "methodCalls": [
| [
| "DelegatedAccount/set", {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "destroy": ["invalid"]
| }, "0"
| ]
@@ -370,7 +390,7 @@ trait DelegatedAccountSetContract {
s"""[
| "DelegatedAccount/set",
| {
- | "accountId": "$BOB_ACCOUNT_ID",
+ | "accountId": "$bobAccountId",
| "newState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943",
| "notDestroyed": {
| "invalid": {
@@ -382,4 +402,4 @@ trait DelegatedAccountSetContract {
| "0"
|]""".stripMargin)
}
-}
\ No newline at end of file
+}
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/MemoryDelegatedAccountSetMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDelegatedAccountSetMethodTest.java
index dc18798a96..b9971cf221 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDelegatedAccountSetMethodTest.java
+++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDelegatedAccountSetMethodTest.java
@@ -21,6 +21,6 @@ package org.apache.james.jmap.rfc8621.memory;
import org.apache.james.jmap.rfc8621.contract.DelegatedAccountSetContract;
-public class MemoryDelegatedAccountSetMethodTest extends MemoryBase implements DelegatedAccountSetContract {
+public class MemoryDelegatedAccountSetMethodTest extends PerClassMemoryBase implements DelegatedAccountSetContract {
}
\ No newline at end of file
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/PostgresDelegatedAccountSetTest.java b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresDelegatedAccountSetTest.java
index 82b0505a47..b901d7bbb0 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresDelegatedAccountSetTest.java
+++ b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresDelegatedAccountSetTest.java
@@ -21,5 +21,5 @@ package org.apache.james.jmap.rfc8621.postgres;
import org.apache.james.jmap.rfc8621.contract.DelegatedAccountSetContract;
-public class PostgresDelegatedAccountSetTest extends PostgresBase implements DelegatedAccountSetContract {
+public class PostgresDelegatedAccountSetTest extends PerClassPostgresBase implements DelegatedAccountSetContract {
}
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org