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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
