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:29 UTC
(james-project) 14/39: [BUILD] EmailParseMethodContract: 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 d5c5690a5c176aca2a8162d1e5448ef47ea25346
Author: Quan Tran <hq...@linagora.com>
AuthorDate: Mon Jul 13 19:52:51 2026 +0700
[BUILD] EmailParseMethodContract: isolate using different users
---
.../contract/EmailParseMethodContract.scala | 97 ++++++++++++++--------
.../rfc8621/memory/MemoryEmailParseMethodTest.java | 1 +
2 files changed, 62 insertions(+), 36 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/EmailParseMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailParseMethodContract.scala
index 85cf17c59a..03c21623fb 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailParseMethodContract.scala
+++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailParseMethodContract.scala
@@ -19,15 +19,20 @@
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._
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.http.UserCredential
-import org.apache.james.jmap.rfc8621.contract.DownloadContract.accountId
import org.apache.james.jmap.rfc8621.contract.Fixture._
import org.apache.james.mailbox.MessageManager.AppendCommand
import org.apache.james.mailbox.model.{MailboxPath, MessageId}
@@ -37,16 +42,36 @@ import org.apache.james.utils.DataProbeImpl
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.{BeforeEach, Test}
+object EmailParseMethodContract {
+ case class TestContext(bobUsername: Username, bobAccountId: String)
+
+ val currentContext: AtomicReference[TestContext] = new AtomicReference[TestContext]()
+}
+
trait EmailParseMethodContract {
+ import EmailParseMethodContract.{TestContext, currentContext}
+
+ def bobUsername: Username = currentContext.get().bobUsername
+ def bobAccountId: String = currentContext.get().bobAccountId
+
+ private def accountId(username: Username): String =
+ Hashing.sha256().hashString(username.asString(), StandardCharsets.UTF_8).toString
+
@BeforeEach
def setUp(server: GuiceJamesServer): Unit = {
+ val uniqueSuffix = UUID.randomUUID().toString.replace("-", "").take(8)
+ val bob = Username.fromLocalPartWithDomain(s"bob$uniqueSuffix", DOMAIN)
+ currentContext.set(TestContext(
+ bobUsername = bob,
+ bobAccountId = accountId(bob)))
+
server.getProbe(classOf[DataProbeImpl])
.fluent()
.addDomain(DOMAIN.asString())
- .addUser(BOB.asString(), BOB_PASSWORD)
+ .addUser(bob.asString(), BOB_PASSWORD)
requestSpecification = baseRequestSpecBuilder(server)
- .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD)))
+ .setAuth(authScheme(UserCredential(bob, BOB_PASSWORD)))
.build()
}
@@ -54,12 +79,12 @@ trait EmailParseMethodContract {
@Test
def parseShouldSuccess(guiceJamesServer: GuiceJamesServer): Unit = {
- val path: MailboxPath = MailboxPath.inbox(BOB)
+ val path: MailboxPath = MailboxPath.inbox(bobUsername)
val mailboxProbe: MailboxProbeImpl = guiceJamesServer.getProbe(classOf[MailboxProbeImpl])
mailboxProbe.createMailbox(path)
val messageId: MessageId = mailboxProbe
- .appendMessage(BOB.asString(), path, AppendCommand.from(
+ .appendMessage(bobUsername.asString(), path, AppendCommand.from(
ClassLoaderUtils.getSystemResourceAsSharedStream("eml/html.eml")))
.getMessageId
@@ -71,7 +96,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "${messageId.serialize()}" ]
| },
| "c1"]]
@@ -97,7 +122,7 @@ trait EmailParseMethodContract {
| [
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed": {
| "${messageId.serialize()}": {
| "inReplyTo": null,
@@ -183,12 +208,12 @@ trait EmailParseMethodContract {
@Test
def attachmentsOfNestedMessagesShouldBeDownloadable(guiceJamesServer: GuiceJamesServer): Unit = {
- val path: MailboxPath = MailboxPath.inbox(BOB)
+ val path: MailboxPath = MailboxPath.inbox(bobUsername)
val mailboxProbe: MailboxProbeImpl = guiceJamesServer.getProbe(classOf[MailboxProbeImpl])
mailboxProbe.createMailbox(path)
val messageId: MessageId = mailboxProbe
- .appendMessage(BOB.asString(), path, AppendCommand.from(
+ .appendMessage(bobUsername.asString(), path, AppendCommand.from(
ClassLoaderUtils.getSystemResourceAsSharedStream("eml/nested.eml")))
.getMessageId
@@ -196,7 +221,7 @@ trait EmailParseMethodContract {
.basePath("")
.header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
.when
- .get(s"/download/$accountId/${messageId.serialize()}_3_3")
+ .get(s"/download/$bobAccountId/${messageId.serialize()}_3_3")
.`then`
.statusCode(SC_OK)
.contentType("text/plain")
@@ -210,12 +235,12 @@ trait EmailParseMethodContract {
@Test
def parseShouldSuccessWhenAttachment(guiceJamesServer: GuiceJamesServer): Unit = {
- val path: MailboxPath = MailboxPath.inbox(BOB)
+ val path: MailboxPath = MailboxPath.inbox(bobUsername)
val mailboxProbe: MailboxProbeImpl = guiceJamesServer.getProbe(classOf[MailboxProbeImpl])
mailboxProbe.createMailbox(path)
val messageId: MessageId = mailboxProbe
- .appendMessage(BOB.asString(), path, AppendCommand.from(
+ .appendMessage(bobUsername.asString(), path, AppendCommand.from(
ClassLoaderUtils.getSystemResourceAsSharedStream("eml/nested.eml")))
.getMessageId
@@ -227,7 +252,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "${messageId.serialize()}_3" ],
| "properties":["bodyValues", "preview", "hasAttachment", "attachments", "blobId", "size", "headers", "references", "subject", "inReplyTo", "messageId", "from", "to", "sentAt"],
| "fetchTextBodyValues": true,
@@ -257,7 +282,7 @@ trait EmailParseMethodContract {
| [
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed": {
| "${messageId.serialize()}_3": {
| "inReplyTo": null,
@@ -350,12 +375,12 @@ trait EmailParseMethodContract {
@Test
def parseShouldSupportAllProperties(guiceJamesServer: GuiceJamesServer): Unit = {
- val path: MailboxPath = MailboxPath.inbox(BOB)
+ val path: MailboxPath = MailboxPath.inbox(bobUsername)
val mailboxProbe: MailboxProbeImpl = guiceJamesServer.getProbe(classOf[MailboxProbeImpl])
mailboxProbe.createMailbox(path)
val messageId: MessageId = mailboxProbe
- .appendMessage(BOB.asString(), path, AppendCommand.from(
+ .appendMessage(bobUsername.asString(), path, AppendCommand.from(
ClassLoaderUtils.getSystemResourceAsSharedStream("eml/html.eml")))
.getMessageId
@@ -367,7 +392,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "${messageId.serialize()}" ],
| "properties": ["blobId", "size", "headers", "references", "subject", "inReplyTo", "messageId", "from", "to", "sentAt"]
| },
@@ -393,7 +418,7 @@ trait EmailParseMethodContract {
| "sessionState": "${SESSION_STATE.value}",
| "methodResponses": [
| [ "Email/parse", {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed": {
| "${messageId.serialize()}": {
| "size": 2725,
@@ -460,12 +485,12 @@ trait EmailParseMethodContract {
@Test
def parseShouldFilterProperties(guiceJamesServer: GuiceJamesServer): Unit = {
- val path: MailboxPath = MailboxPath.inbox(BOB)
+ val path: MailboxPath = MailboxPath.inbox(bobUsername)
val mailboxProbe: MailboxProbeImpl = guiceJamesServer.getProbe(classOf[MailboxProbeImpl])
mailboxProbe.createMailbox(path)
val messageId: MessageId = mailboxProbe
- .appendMessage(BOB.asString(), path, AppendCommand.from(
+ .appendMessage(bobUsername.asString(), path, AppendCommand.from(
ClassLoaderUtils.getSystemResourceAsSharedStream("eml/html.eml")))
.getMessageId
@@ -477,7 +502,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "${messageId.serialize()}" ],
| "properties": ["blobId"]
| },
@@ -502,7 +527,7 @@ trait EmailParseMethodContract {
| "sessionState": "${SESSION_STATE.value}",
| "methodResponses": [
| [ "Email/parse", {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed": {
| "${messageId.serialize()}": {
| "blobId": "${messageId.serialize()}"
@@ -514,12 +539,12 @@ trait EmailParseMethodContract {
@Test
def parseShouldAllowRetrievingBody(guiceJamesServer: GuiceJamesServer): Unit = {
- val path: MailboxPath = MailboxPath.inbox(BOB)
+ val path: MailboxPath = MailboxPath.inbox(bobUsername)
val mailboxProbe: MailboxProbeImpl = guiceJamesServer.getProbe(classOf[MailboxProbeImpl])
mailboxProbe.createMailbox(path)
val messageId: MessageId = mailboxProbe
- .appendMessage(BOB.asString(), path, AppendCommand.from(
+ .appendMessage(bobUsername.asString(), path, AppendCommand.from(
ClassLoaderUtils.getSystemResourceAsSharedStream("eml/html.eml")))
.getMessageId
@@ -531,7 +556,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "${messageId.serialize()}" ],
| "properties":["bodyValues", "preview", "hasAttachment", "attachments"],
| "fetchTextBodyValues": true,
@@ -559,7 +584,7 @@ trait EmailParseMethodContract {
| "sessionState": "${SESSION_STATE.value}",
| "methodResponses": [
| [ "Email/parse", {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed":{
| "${messageId.serialize()}": {
| "preview": "Send concerted from html",
@@ -649,12 +674,12 @@ trait EmailParseMethodContract {
@Test
def parseShouldApplyBodyFiltering(guiceJamesServer: GuiceJamesServer): Unit = {
- val path: MailboxPath = MailboxPath.inbox(BOB)
+ val path: MailboxPath = MailboxPath.inbox(bobUsername)
val mailboxProbe: MailboxProbeImpl = guiceJamesServer.getProbe(classOf[MailboxProbeImpl])
mailboxProbe.createMailbox(path)
val messageId: MessageId = mailboxProbe
- .appendMessage(BOB.asString(), path, AppendCommand.from(
+ .appendMessage(bobUsername.asString(), path, AppendCommand.from(
ClassLoaderUtils.getSystemResourceAsSharedStream("eml/html.eml")))
.getMessageId
@@ -666,7 +691,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "${messageId.serialize()}" ],
| "properties":["bodyValues", "preview", "hasAttachment", "attachments"],
| "fetchTextBodyValues": true,
@@ -694,7 +719,7 @@ trait EmailParseMethodContract {
| "sessionState": "${SESSION_STATE.value}",
| "methodResponses": [
| [ "Email/parse", {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed":{
| "${messageId.serialize()}": {
| "preview": "Send concerted from html",
@@ -790,7 +815,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "$blobIdShouldNotFound" ]
| },
| "c1"]]
@@ -814,7 +839,7 @@ trait EmailParseMethodContract {
| "methodResponses": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed":{},
| "notFound": ["$blobIdShouldNotFound"]
| },
@@ -833,7 +858,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "invalid" ]
| },
| "c1"]]
@@ -857,7 +882,7 @@ trait EmailParseMethodContract {
| "methodResponses": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "parsed":{},
| "notFound": ["invalid"]
| },
@@ -875,7 +900,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "123" ]
| },
| "c1"]]
@@ -914,7 +939,7 @@ trait EmailParseMethodContract {
| "methodCalls": [[
| "Email/parse",
| {
- | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+ | "accountId": "$bobAccountId",
| "blobIds": [ "123" ]
| },
| "c1"]]
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/MemoryEmailParseMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailParseMethodTest.java
index ba9390b9ff..f5608c71ac 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailParseMethodTest.java
+++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailParseMethodTest.java
@@ -43,6 +43,7 @@ public class MemoryEmailParseMethodTest implements EmailParseMethodContract {
.build())
.server(configuration -> MemoryJamesServerMain.createServer(configuration)
.overrideWith(new TestJMAPServerModule()))
+ .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
.build();
@Override
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org