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 50adb87ec2a6f73da293bb7d9ae88c1342579d40
Author: Quan Tran <[email protected]>
AuthorDate: Mon Jul 13 22:58:40 2026 +0700

    [BUILD] UploadContract: isolate using different users
---
 .../rfc8621/distributed/DistributedUploadTest.java |  2 +-
 .../jmap/rfc8621/contract/UploadContract.scala     | 56 +++++++++++++++-------
 .../jmap/rfc8621/memory/MemoryUploadTest.java      |  2 +-
 .../jmap/rfc8621/postgres/PostgresUploadTest.java  |  2 +-
 4 files changed, 42 insertions(+), 20 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/DistributedUploadTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java
index 6927255ed2..2d1099f734 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java
@@ -21,6 +21,6 @@ package org.apache.james.jmap.rfc8621.distributed;
 
 import org.apache.james.jmap.rfc8621.contract.UploadContract;
 
-public class DistributedUploadTest extends DistributedBase implements 
UploadContract {
+public class DistributedUploadTest extends PerClassDistributedBase implements 
UploadContract {
 
 }
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/UploadContract.scala
 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/UploadContract.scala
index ef9047858f..0e4a70d68a 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/UploadContract.scala
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/UploadContract.scala
@@ -20,15 +20,17 @@ package org.apache.james.jmap.rfc8621.contract
 
 import java.io.ByteArrayInputStream
 import java.nio.charset.StandardCharsets
+import java.util.UUID
 
 import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT
 import io.restassured.RestAssured.{`given`, requestSpecification}
 import io.restassured.http.ContentType
 import org.apache.http.HttpStatus.{SC_BAD_REQUEST, SC_CREATED, SC_FORBIDDEN, 
SC_OK, SC_UNAUTHORIZED}
 import org.apache.james.GuiceJamesServer
+import org.apache.james.core.Username
 import org.apache.james.jmap.core.AccountId
 import org.apache.james.jmap.http.UserCredential
-import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
ACCOUNT_ID, ALICE, ALICE_ACCOUNT_ID, ALICE_PASSWORD, ANDRE, ANDRE_PASSWORD, 
BOB, BOB_PASSWORD, DOMAIN, _2_DOT_DOMAIN, authScheme, baseRequestSpecBuilder}
+import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
ALICE_PASSWORD, ANDRE_PASSWORD, BOB_PASSWORD, DOMAIN, _2_DOT_DOMAIN, 
authScheme, baseRequestSpecBuilder}
 import org.apache.james.jmap.rfc8621.contract.UploadContract.{BIG_INPUT, 
VALID_INPUT}
 import org.apache.james.utils.DataProbeImpl
 import org.assertj.core.api.Assertions.assertThat
@@ -37,24 +39,44 @@ import org.hamcrest.Matchers.equalTo
 import org.junit.jupiter.api.{BeforeEach, RepeatedTest, Test}
 import play.api.libs.json.{JsString, Json}
 
+object UploadContractContext {
+  case class TestContext(bobUsername: Username, bobAccountId: String, 
aliceUsername: Username, aliceAccountId: String, andreUsername: Username)
+  val currentContext: java.util.concurrent.atomic.AtomicReference[TestContext] 
= new java.util.concurrent.atomic.AtomicReference[TestContext]()
+}
+
 object UploadContract {
   private val BIG_INPUT: Array[Byte] = "123456789\r\n".repeat(1024 * 1024 * 
4).getBytes(StandardCharsets.UTF_8)
   private val VALID_INPUT: Array[Byte] = "123456789\r\n".repeat(1024 * 
1024).getBytes(StandardCharsets.UTF_8)
 }
 
 trait UploadContract {
+  import UploadContractContext.currentContext
+
+  def bobUsername: Username = currentContext.get().bobUsername
+  def bobAccountId: String = currentContext.get().bobAccountId
+  def aliceUsername: Username = currentContext.get().aliceUsername
+  def aliceAccountId: String = currentContext.get().aliceAccountId
+  def andreUsername: Username = currentContext.get().andreUsername
+
   @BeforeEach
   def setUp(server: GuiceJamesServer): Unit = {
+    val uniqueSuffix = UUID.randomUUID().toString.replace("-", "").take(8)
+    val bob = Username.fromLocalPartWithDomain(s"bob$uniqueSuffix", DOMAIN)
+    val alice = Username.fromLocalPartWithDomain(s"alice$uniqueSuffix", 
_2_DOT_DOMAIN)
+    val andre = Username.fromLocalPartWithDomain(s"andre$uniqueSuffix", DOMAIN)
+    currentContext.set(UploadContractContext.TestContext(
+      bob, AccountId.from(bob).toOption.get.id.value,
+      alice, AccountId.from(alice).toOption.get.id.value, andre))
     server.getProbe(classOf[DataProbeImpl])
       .fluent
       .addDomain(DOMAIN.asString)
-      .addUser(BOB.asString, BOB_PASSWORD)
+      .addUser(bob.asString, BOB_PASSWORD)
       .addDomain(_2_DOT_DOMAIN.asString())
-      .addUser(ALICE.asString(), ALICE_PASSWORD)
-      .addUser(ANDRE.asString(), ANDRE_PASSWORD)
+      .addUser(alice.asString(), ALICE_PASSWORD)
+      .addUser(andre.asString(), ANDRE_PASSWORD)
 
     requestSpecification = baseRequestSpecBuilder(server)
-      .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD)))
+      .setAuth(authScheme(UserCredential(bob, BOB_PASSWORD)))
       .build
   }
 
@@ -65,7 +87,7 @@ trait UploadContract {
       .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
       .body(VALID_INPUT)
     .when
-      .post(s"/upload/$ACCOUNT_ID")
+      .post(s"/upload/$bobAccountId")
     .`then`
       .statusCode(SC_CREATED)
       .extract
@@ -78,7 +100,7 @@ trait UploadContract {
       .basePath("")
       .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
     .when
-      .get(s"/download/$ACCOUNT_ID/$blobId")
+      .get(s"/download/$bobAccountId/$blobId")
     .`then`
       .statusCode(SC_OK)
       .contentType("application/json")
@@ -97,7 +119,7 @@ trait UploadContract {
       .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
       .body(VALID_INPUT)
     .when
-      .post(s"/upload/$ALICE_ACCOUNT_ID")
+      .post(s"/upload/$aliceAccountId")
     .`then`
       .statusCode(SC_FORBIDDEN)
       .header("Content-Length", "84")
@@ -113,7 +135,7 @@ trait UploadContract {
       .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
       .body(VALID_INPUT)
     .when
-      .post(s"/upload/$ACCOUNT_ID")
+      .post(s"/upload/$bobAccountId")
     .`then`
       .statusCode(SC_CREATED)
       .extract
@@ -123,11 +145,11 @@ trait UploadContract {
     val blobId: String = 
Json.parse(uploadResponse).\("blobId").get.asInstanceOf[JsString].value
 
     `given`
-      .auth().basic(ALICE.asString(), ALICE_PASSWORD)
+      .auth().basic(aliceUsername.asString(), ALICE_PASSWORD)
       .basePath("")
       .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
     .when
-      .get(s"/download/$ALICE_ACCOUNT_ID/$blobId")
+      .get(s"/download/$bobAccountId/$blobId")
     .`then`
       .statusCode(SC_FORBIDDEN)
       .body("status", equalTo(403))
@@ -143,7 +165,7 @@ trait UploadContract {
       .contentType(ContentType.BINARY)
       .body(BIG_INPUT)
     .when
-      .post(s"/upload/$ACCOUNT_ID")
+      .post(s"/upload/$bobAccountId")
     .`then`
       .statusCode(SC_BAD_REQUEST)
       .body("status", equalTo(400))
@@ -161,7 +183,7 @@ trait UploadContract {
       .contentType(ContentType.BINARY)
       .body(VALID_INPUT)
     .when
-      .post(s"/upload/$ACCOUNT_ID")
+      .post(s"/upload/$bobAccountId")
     .`then`
       .statusCode(SC_UNAUTHORIZED)
       .header("WWW-Authenticate", "Basic realm=\"simple\", Bearer 
realm=\"JWT\"")
@@ -172,9 +194,9 @@ trait UploadContract {
 
   @Test
   def bobShouldBeAllowedToUploadInAliceAccountWhenDelegated(server: 
GuiceJamesServer): Unit = {
-    server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(ALICE, BOB)
+    server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(aliceUsername, 
bobUsername)
 
-    val aliceAccountId: String = AccountId.from(ALICE).toOption.get.id.value
+    val aliceAccountId: String = 
AccountId.from(aliceUsername).toOption.get.id.value
 
     `given`
       .basePath("")
@@ -192,9 +214,9 @@ trait UploadContract {
 
   @Test
   def bobShouldBeNotAllowedToUploadInAliceAccountWhenNotDelegated(server: 
GuiceJamesServer): Unit = {
-    server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(ALICE, ANDRE)
+    server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(aliceUsername, 
andreUsername)
 
-    val aliceAccountId: String = AccountId.from(ALICE).toOption.get.id.value
+    val aliceAccountId: String = 
AccountId.from(aliceUsername).toOption.get.id.value
 
     `given`
       .basePath("")
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/MemoryUploadTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryUploadTest.java
index e6482ddc43..f195012d84 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryUploadTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryUploadTest.java
@@ -21,6 +21,6 @@ package org.apache.james.jmap.rfc8621.memory;
 
 import org.apache.james.jmap.rfc8621.contract.UploadContract;
 
-public class MemoryUploadTest extends MemoryBase implements UploadContract {
+public class MemoryUploadTest extends PerClassMemoryBase implements 
UploadContract {
 
 }
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/PostgresUploadTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java
index b280238f95..c5ed4f7e00 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java
@@ -21,5 +21,5 @@ package org.apache.james.jmap.rfc8621.postgres;
 
 import org.apache.james.jmap.rfc8621.contract.UploadContract;
 
-public class PostgresUploadTest extends PostgresBase implements UploadContract 
{
+public class PostgresUploadTest extends PerClassPostgresBase implements 
UploadContract {
 }


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

Reply via email to