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 3bd39da2f16a1d8e15964fc28bb450287ed7a07b
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Sep 14 07:04:14 2026 +0200

    JAMES-4228 Make integration tests per-class using peruser isolation strategy
---
 .../EmailSubmissionSetValidateRcptContract.scala   | 49 +++++++++++++++-------
 .../MemoryEmailSubmissionSetValidateRcptTest.java  |  2 +-
 2 files changed, 36 insertions(+), 15 deletions(-)

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/EmailSubmissionSetValidateRcptContract.scala
 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetValidateRcptContract.scala
index bf0067572c..cee4a7db8b 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetValidateRcptContract.scala
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetValidateRcptContract.scala
@@ -20,16 +20,21 @@
 package org.apache.james.jmap.rfc8621.contract
 
 import java.nio.charset.StandardCharsets
+import java.util.UUID
+import java.util.concurrent.atomic.AtomicReference
 
+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.JmapRfc8621Configuration
 import org.apache.james.jmap.http.UserCredential
-import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
ACCOUNT_ID, ANDRE, ANDRE_PASSWORD, BOB, BOB_PASSWORD, DOMAIN, authScheme, 
baseRequestSpecBuilder}
+import 
org.apache.james.jmap.rfc8621.contract.EmailSubmissionSetValidateRcptContract.TestContext
+import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
ANDRE_PASSWORD, BOB_PASSWORD, DOMAIN, authScheme, baseRequestSpecBuilder}
 import org.apache.james.mailbox.DefaultMailboxes
 import org.apache.james.mailbox.MessageManager.AppendCommand
 import org.apache.james.mailbox.model.MailboxPath
@@ -39,6 +44,10 @@ import org.apache.james.utils.DataProbeImpl
 import org.junit.jupiter.api.{BeforeEach, Test}
 
 object EmailSubmissionSetValidateRcptContract {
+  case class TestContext(bobUsername: Username, bobAccountId: String, 
andreUsername: Username)
+
+  val currentContext: AtomicReference[TestContext] = new 
AtomicReference[TestContext]()
+
   val configuration: JmapRfc8621Configuration = JmapRfc8621Configuration(
     urlPrefixString = "http://127.0.0.1";,
     websocketPrefixString = "ws://127.0.0.1",
@@ -49,25 +58,37 @@ object EmailSubmissionSetValidateRcptContract {
  * `EmailSubmission/set` behaviour when `send.validate.rcpt` is turned on.
  */
 trait EmailSubmissionSetValidateRcptContract {
+  private def bob: Username = 
EmailSubmissionSetValidateRcptContract.currentContext.get().bobUsername
+  private def bobAccountId: String = 
EmailSubmissionSetValidateRcptContract.currentContext.get().bobAccountId
+  private def andre: Username = 
EmailSubmissionSetValidateRcptContract.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 andre = Username.fromLocalPartWithDomain(s"andre$uniqueSuffix", DOMAIN)
+    EmailSubmissionSetValidateRcptContract.currentContext.set(TestContext(
+      bobUsername = bob,
+      bobAccountId = Hashing.sha256().hashString(bob.asString, 
StandardCharsets.UTF_8).toString,
+      andreUsername = andre))
+
     server.getProbe(classOf[DataProbeImpl])
       .fluent
       .addDomain(DOMAIN.asString)
-      .addUser(BOB.asString, BOB_PASSWORD)
-      .addUser(ANDRE.asString, ANDRE_PASSWORD)
+      .addUser(bob.asString, BOB_PASSWORD)
+      .addUser(andre.asString, ANDRE_PASSWORD)
 
     server.getProbe(classOf[MailboxProbeImpl])
-      .createMailbox(MailboxPath.forUser(BOB, DefaultMailboxes.DRAFTS))
+      .createMailbox(MailboxPath.forUser(bob, DefaultMailboxes.DRAFTS))
 
     requestSpecification = baseRequestSpecBuilder(server)
-      .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD)))
+      .setAuth(authScheme(UserCredential(bob, BOB_PASSWORD)))
       .build
   }
 
   @Test
   def setShouldAcceptRecipientHavingALocalMailbox(server: GuiceJamesServer): 
Unit =
-    assertThatJson(submit(server, ANDRE.asString))
+    assertThatJson(submit(server, andre.asString))
       .inPath("methodResponses[0][1].created")
       .isObject
       .containsKey("k1490")
@@ -82,9 +103,9 @@ trait EmailSubmissionSetValidateRcptContract {
   @Test
   def setShouldAcceptRecipientResolvedByRecipientRewriteTable(server: 
GuiceJamesServer): Unit = {
     server.getProbe(classOf[DataProbeImpl])
-      .addAddressMapping("alias", DOMAIN.asString, ANDRE.asString)
+      .addAddressMapping(s"alias-${andre.getLocalPart}", DOMAIN.asString, 
andre.asString)
 
-    assertThatJson(submit(server, s"alias@${DOMAIN.asString}"))
+    assertThatJson(submit(server, 
s"alias-${andre.getLocalPart}@${DOMAIN.asString}"))
       .inPath("methodResponses[0][1].created")
       .isObject
       .containsKey("k1490")
@@ -104,7 +125,7 @@ trait EmailSubmissionSetValidateRcptContract {
 
   @Test
   def setShouldRejectTheWholeSubmissionWhenASingleRecipientIsInvalid(server: 
GuiceJamesServer): Unit =
-    assertThatJson(submit(server, ANDRE.asString, 
s"unknown@${DOMAIN.asString}"))
+    assertThatJson(submit(server, andre.asString, 
s"unknown@${DOMAIN.asString}"))
       .inPath("methodResponses[0][1].notCreated")
       .isEqualTo(s"""{
                     |  "k1490": {
@@ -118,14 +139,14 @@ trait EmailSubmissionSetValidateRcptContract {
     val message: Message = Message.Builder
       .of
       .setSubject("test")
-      .setSender(BOB.asString)
-      .setFrom(BOB.asString)
+      .setSender(bob.asString)
+      .setFrom(bob.asString)
       .setTo(recipients: _*)
       .setBody("testmail", StandardCharsets.UTF_8)
       .build
 
     val messageId = server.getProbe(classOf[MailboxProbeImpl])
-      .appendMessage(BOB.asString, MailboxPath.forUser(BOB, 
DefaultMailboxes.DRAFTS), AppendCommand.builder().build(message))
+      .appendMessage(bob.asString, MailboxPath.forUser(bob, 
DefaultMailboxes.DRAFTS), AppendCommand.builder().build(message))
       .getMessageId
 
     val rcptTo = recipients.map(recipient => s"""{"email": 
"$recipient"}""").mkString(", ")
@@ -134,12 +155,12 @@ trait EmailSubmissionSetValidateRcptContract {
          |  "using": ["urn:ietf:params:jmap:core", 
"urn:ietf:params:jmap:mail", "urn:ietf:params:jmap:submission"],
          |  "methodCalls": [
          |     ["EmailSubmission/set", {
-         |       "accountId": "$ACCOUNT_ID",
+         |       "accountId": "$bobAccountId",
          |       "create": {
          |         "k1490": {
          |           "emailId": "${messageId.serialize}",
          |           "envelope": {
-         |             "mailFrom": {"email": "${BOB.asString}"},
+         |             "mailFrom": {"email": "${bob.asString}"},
          |             "rcptTo": [$rcptTo]
          |           }
          |         }
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/MemoryEmailSubmissionSetValidateRcptTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailSubmissionSetValidateRcptTest.java
index 9f24c1cc34..d55e69854d 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailSubmissionSetValidateRcptTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailSubmissionSetValidateRcptTest.java
@@ -43,6 +43,6 @@ public class MemoryEmailSubmissionSetValidateRcptTest 
implements EmailSubmission
             .overrideWith(binder -> binder.bind(JmapRfc8621Configuration.class)
                 
.toInstance(EmailSubmissionSetValidateRcptContract.configuration()))
             .overrideWith(new TestJMAPServerModule()))
-        .lifeCycle(JamesServerExtension.Lifecycle.PER_TEST)
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 }


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

Reply via email to