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 affd019d91d9199a74a9b1e286478176f0f75c25 Author: Quan Tran <[email protected]> AuthorDate: Mon Jul 13 19:32:56 2026 +0700 [BUILD] EventSourceContract: isolate using different users --- .../rfc8621/contract/EventSourceContract.scala | 186 ++++++++++++--------- .../jmap/rfc8621/memory/MemoryEventSourceTest.java | 3 +- 2 files changed, 112 insertions(+), 77 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/EventSourceContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EventSourceContract.scala index 7359cabc93..a23c6a5564 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EventSourceContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EventSourceContract.scala @@ -20,8 +20,11 @@ package org.apache.james.jmap.rfc8621.contract import java.nio.charset.StandardCharsets -import java.util.concurrent.TimeUnit +import java.util.Base64 +import java.util.UUID +import java.util.concurrent.{TimeUnit, atomic} +import com.google.common.hash.Hashing import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT import io.netty.handler.codec.http.HttpResponseStatus import io.restassured.RestAssured.{`given`, requestSpecification} @@ -30,7 +33,7 @@ import org.apache.james.GuiceJamesServer import org.apache.james.core.Username import org.apache.james.jmap.JmapGuiceProbe 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, DAVID, DAVID_ACCOUNT_ID, 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.mailbox.DefaultMailboxes import org.apache.james.mailbox.MessageManager.AppendCommand @@ -51,7 +54,29 @@ import reactor.netty.http.client.HttpClient import scala.collection.mutable.ListBuffer import scala.jdk.CollectionConverters._ +object EventSourceContract { + case class TestContext(bobUsername: Username, bobAccountId: String, andreUsername: Username, davidUsername: Username, davidAccountId: String) + + val currentContext: atomic.AtomicReference[TestContext] = new atomic.AtomicReference[TestContext]() +} + trait EventSourceContract { + import EventSourceContract.{TestContext, currentContext} + + def bobUsername: Username = currentContext.get().bobUsername + def bobAccountId: String = currentContext.get().bobAccountId + def andreUsername: Username = currentContext.get().andreUsername + def davidUsername: Username = currentContext.get().davidUsername + def davidAccountId: String = currentContext.get().davidAccountId + + private def accountId(username: Username): String = + Hashing.sha256().hashString(username.asString(), StandardCharsets.UTF_8).toString + + private def bobAuthorizationHeader: String = { + val credentials = s"${bobUsername.asString}:$BOB_PASSWORD" + s"Basic ${Base64.getEncoder.encodeToString(credentials.getBytes(StandardCharsets.UTF_8))}" + } + private lazy val awaitAtMostTenSeconds: ConditionFactory = Awaitility.`with` .pollInterval(ONE_HUNDRED_MILLISECONDS) .and.`with`.pollDelay(ONE_HUNDRED_MILLISECONDS) @@ -60,15 +85,26 @@ trait EventSourceContract { @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 david = Username.fromLocalPartWithDomain(s"david$uniqueSuffix", DOMAIN) + currentContext.set(TestContext( + bobUsername = bob, + bobAccountId = accountId(bob), + andreUsername = andre, + davidUsername = david, + davidAccountId = accountId(david))) + server.getProbe(classOf[DataProbeImpl]) .fluent() .addDomain(DOMAIN.asString()) - .addUser(ANDRE.asString(), ANDRE_PASSWORD) - .addUser(BOB.asString(), BOB_PASSWORD) - .addUser(DAVID.asString(), "secret") + .addUser(andre.asString(), ANDRE_PASSWORD) + .addUser(bob.asString(), BOB_PASSWORD) + .addUser(david.asString(), "secret") requestSpecification = baseRequestSpecBuilder(server) - .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD))) + .setAuth(authScheme(UserCredential(bob, BOB_PASSWORD))) .addHeader(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) .build() } @@ -80,7 +116,7 @@ trait EventSourceContract { val status = HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -96,7 +132,7 @@ trait EventSourceContract { val status = HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -114,7 +150,7 @@ trait EventSourceContract { val status = HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=0") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -132,7 +168,7 @@ trait EventSourceContract { val status = HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=0&closeAfter=bad") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -150,7 +186,7 @@ trait EventSourceContract { val status = HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=bad&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -168,7 +204,7 @@ trait EventSourceContract { val status = HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=bad&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -204,7 +240,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -231,7 +267,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=Email&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -246,7 +282,7 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) Thread.sleep(200) assertThat(seq.asJava).isEmpty() @@ -260,7 +296,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=Mailbox,Email,VacationResponse,Thread,Identity,EmailSubmission,EmailDelivery&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -275,13 +311,13 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) Thread.sleep(200) assertThat(seq.asJava) .hasSize(1) assertThat(seq.head) - .startsWith("event: state\ndata: {\"@type\":\"StateChange\",\"changed\":{\"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6\":{\"Mailbox\":") + .startsWith(s"event: state\ndata: {\"@type\":\"StateChange\",\"changed\":{\"$bobAccountId\":{\"Mailbox\":") assertThat(seq.head).doesNotContain("pushState") assertThat(seq.head).endsWith("\n\n") } @@ -289,13 +325,13 @@ trait EventSourceContract { @Test def shouldPushEmailDeliveryChangeWhenUserReceivesEmail(server: GuiceJamesServer): Unit = { val port = server.getProbe(classOf[JmapGuiceProbe]).getJmapPort.getValue - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) val seq = new ListBuffer[String]() HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=Mailbox,Email,VacationResponse,Thread,Identity,EmailSubmission,EmailDelivery&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -311,7 +347,7 @@ trait EventSourceContract { // Bob receives a mail Thread.sleep(500) - sendEmailTo(server, BOB) + sendEmailTo(server, bobUsername) awaitAtMostTenSeconds.untilAsserted(() => { assertThat(seq.asJava) @@ -324,13 +360,13 @@ trait EventSourceContract { @Test def shouldNotPushEmailDeliveryChangeWhenUserCreatesDraftEmail(server: GuiceJamesServer): Unit = { val port = server.getProbe(classOf[JmapGuiceProbe]).getJmapPort.getValue - val mailboxId = server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + val mailboxId = server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) val seq = new ListBuffer[String]() HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=Mailbox,Email,VacationResponse,Thread,Identity,EmailSubmission,EmailDelivery&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -351,14 +387,14 @@ trait EventSourceContract { | "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail"], | "methodCalls": [ | ["Email/set", { - | "accountId": "$ACCOUNT_ID", + | "accountId": "$bobAccountId", | "create": { | "aaaaaa":{ | "mailboxIds": { | "${mailboxId.serialize}": true | }, | "to": [{"email": "[email protected]"}, {"email": "[email protected]"}], - | "from": [{"email": "${BOB.asString}"}] + | "from": [{"email": "${bobUsername.asString}"}] | } | } | }, "c1"]] @@ -383,7 +419,7 @@ trait EventSourceContract { @Test def shouldNotPushEmailDeliveryChangeWhenUserSendsEmail(server: GuiceJamesServer): Unit = { val port = server.getProbe(classOf[JmapGuiceProbe]).getJmapPort.getValue - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) val messageId: MessageId = prepareDraftMessage(server) @@ -391,7 +427,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=Mailbox,Email,VacationResponse,Thread,Identity,EmailSubmission,EmailDelivery&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -412,13 +448,13 @@ trait EventSourceContract { | "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}"}, - | "rcptTo": [{"email": "${ANDRE.asString}"}] + | "mailFrom": {"email": "${bobUsername.asString}"}, + | "rcptTo": [{"email": "${andreUsername.asString}"}] | } | } | } @@ -444,7 +480,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=1&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -472,7 +508,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -487,13 +523,13 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) Thread.sleep(200) assertThat(seq.asJava) .hasSize(1) assertThat(seq.head) - .startsWith("event: state\ndata: {\"@type\":\"StateChange\",\"changed\":{\"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6\":{\"Mailbox\":") + .startsWith(s"event: state\ndata: {\"@type\":\"StateChange\",\"changed\":{\"$bobAccountId\":{\"Mailbox\":") assertThat(seq.head).endsWith("\n\n") } @@ -505,7 +541,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=0&closeAfter=state") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -520,14 +556,14 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.forUser(BOB, "other")) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.forUser(bobUsername, "other")) Thread.sleep(200) assertThat(seq.asJava) .hasSize(1) assertThat(seq.head) - .startsWith("event: state\ndata: {\"@type\":\"StateChange\",\"changed\":{\"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6\":{\"Mailbox\":") + .startsWith(s"event: state\ndata: {\"@type\":\"StateChange\",\"changed\":{\"$bobAccountId\":{\"Mailbox\":") assertThat(seq.head).endsWith("\n\n") } @@ -539,7 +575,7 @@ trait EventSourceContract { HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=*&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -554,8 +590,8 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) - server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.forUser(BOB, "other")) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(bobUsername)) + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.forUser(bobUsername, "other")) Thread.sleep(200) assertThat(seq.asJava) @@ -565,17 +601,17 @@ trait EventSourceContract { @Test def shouldPushChangesToDelegatedUser(server: GuiceJamesServer): Unit = { val port = server.getProbe(classOf[JmapGuiceProbe]).getJmapPort.getValue - val davidPath = MailboxPath.inbox(DAVID) + val davidPath = MailboxPath.inbox(davidUsername) server.getProbe(classOf[MailboxProbeImpl]).createMailbox(davidPath) - // DAVID delegates BOB to access his account - server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(DAVID, BOB) + // davidUsername delegates bobUsername to access his account + server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(davidUsername, bobUsername) val seq = new ListBuffer[String]() HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=EmailDelivery&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -590,16 +626,16 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - // DAVID has a new mail therefore EmailDelivery change - sendEmailTo(server, DAVID) + // davidUsername has a new mail therefore EmailDelivery change + sendEmailTo(server, davidUsername) - // Bob should receive DAVID's EmailDelivery state change + // Bob should receive davidUsername's EmailDelivery state change awaitAtMostTenSeconds.untilAsserted(() => { SoftAssertions.assertSoftly(softly => { softly.assertThat(seq.asJava) .hasSize(1) softly.assertThat(seq.head) - .contains("EmailDelivery", DAVID_ACCOUNT_ID) + .contains("EmailDelivery", davidAccountId) }) }) } @@ -607,17 +643,17 @@ trait EventSourceContract { @Test def ownerUserShouldStillReceiveHisChangesWhenHeDelegatesHisAccountToOtherUsers(server: GuiceJamesServer): Unit = { val port = server.getProbe(classOf[JmapGuiceProbe]).getJmapPort.getValue - val bobPath = MailboxPath.inbox(BOB) + val bobPath = MailboxPath.inbox(bobUsername) server.getProbe(classOf[MailboxProbeImpl]).createMailbox(bobPath) - // BOB delegates DAVID to access his account - server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(BOB, DAVID) + // bobUsername delegates davidUsername to access his account + server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(bobUsername, davidUsername) val seq = new ListBuffer[String]() HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=EmailDelivery&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -632,8 +668,8 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - // BOB has a new mail therefore EmailDelivery change - sendEmailTo(server, BOB) + // bobUsername has a new mail therefore EmailDelivery change + sendEmailTo(server, bobUsername) // Bob should receive his EmailDelivery state change awaitAtMostTenSeconds.untilAsserted(() => { @@ -641,7 +677,7 @@ trait EventSourceContract { softly.assertThat(seq.asJava) .hasSize(1) softly.assertThat(seq.head) - .contains("EmailDelivery", ACCOUNT_ID) + .contains("EmailDelivery", bobAccountId) }) }) } @@ -649,17 +685,17 @@ trait EventSourceContract { @Test def bobShouldReceiveHisChangesAndHisDelegatedAccountChanges(server: GuiceJamesServer): Unit = { val port = server.getProbe(classOf[JmapGuiceProbe]).getJmapPort.getValue - val davidPath = MailboxPath.inbox(DAVID) + val davidPath = MailboxPath.inbox(davidUsername) server.getProbe(classOf[MailboxProbeImpl]).createMailbox(davidPath) - // DAVID delegates BOB to access his account - server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(DAVID, BOB) + // davidUsername delegates bobUsername to access his account + server.getProbe(classOf[DelegationProbe]).addAuthorizedUser(davidUsername, bobUsername) val seq = new ListBuffer[String]() HttpClient.create .baseUrl(s"http://127.0.0.1:$port/eventSource?types=EmailDelivery&ping=0&closeAfter=no") .headers(builder => { - builder.add("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + builder.add("Authorization", bobAuthorizationHeader) builder.add("Accept", ACCEPT_RFC8621_VERSION_HEADER) }) .get() @@ -674,10 +710,10 @@ trait EventSourceContract { .subscribe() Thread.sleep(500) - sendEmailTo(server, DAVID) - sendEmailTo(server, BOB) - sendEmailTo(server, DAVID) - sendEmailTo(server, BOB) + sendEmailTo(server, davidUsername) + sendEmailTo(server, bobUsername) + sendEmailTo(server, davidUsername) + sendEmailTo(server, bobUsername) // Bob should receive David's change and his changes awaitAtMostTenSeconds.untilAsserted(() => { @@ -685,13 +721,13 @@ trait EventSourceContract { softly.assertThat(seq.asJava) .hasSize(4) softly.assertThat(seq.apply(0)) - .contains("EmailDelivery", DAVID_ACCOUNT_ID) + .contains("EmailDelivery", davidAccountId) softly.assertThat(seq.apply(1)) - .contains("EmailDelivery", ACCOUNT_ID) + .contains("EmailDelivery", bobAccountId) softly.assertThat(seq.apply(2)) - .contains("EmailDelivery", DAVID_ACCOUNT_ID) + .contains("EmailDelivery", davidAccountId) softly.assertThat(seq.apply(3)) - .contains("EmailDelivery", ACCOUNT_ID) + .contains("EmailDelivery", bobAccountId) }) }) } @@ -699,8 +735,8 @@ trait EventSourceContract { private def sendEmailTo(server: GuiceJamesServer, recipient: Username): Unit = { val smtpMessageSender: SMTPMessageSender = new SMTPMessageSender(DOMAIN.asString()) smtpMessageSender.connect("127.0.0.1", server.getProbe(classOf[SmtpGuiceProbe]).getSmtpPort) - .authenticate(ANDRE.asString, ANDRE_PASSWORD) - .sendMessage(ANDRE.asString, recipient.asString()) + .authenticate(andreUsername.asString, ANDRE_PASSWORD) + .sendMessage(andreUsername.asString, recipient.asString()) smtpMessageSender.close() awaitAtMostTenSeconds.until(() => server.getProbe(classOf[SpoolerProbe]).processingFinished()) @@ -710,14 +746,14 @@ trait EventSourceContract { val message: Message = Message.Builder .of .setSubject("test") - .setSender(BOB.asString) - .setFrom(BOB.asString) - .setTo(ANDRE.asString) + .setSender(bobUsername.asString) + .setFrom(bobUsername.asString) + .setTo(andreUsername.asString) .setBody("testmail", StandardCharsets.UTF_8) .build - val bobDraftsPath = MailboxPath.forUser(BOB, DefaultMailboxes.DRAFTS) + val bobDraftsPath = MailboxPath.forUser(bobUsername, DefaultMailboxes.DRAFTS) server.getProbe(classOf[MailboxProbeImpl]).createMailbox(bobDraftsPath) - val messageId = server.getProbe(classOf[MailboxProbeImpl]).appendMessage(BOB.asString(), bobDraftsPath, AppendCommand.builder() + val messageId = server.getProbe(classOf[MailboxProbeImpl]).appendMessage(bobUsername.asString(), bobDraftsPath, AppendCommand.builder() .build(message)) .getMessageId messageId 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/MemoryEventSourceTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEventSourceTest.java index 74f3c2d071..0ebb41a39f 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEventSourceTest.java +++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEventSourceTest.java @@ -21,6 +21,5 @@ package org.apache.james.jmap.rfc8621.memory; import org.apache.james.jmap.rfc8621.contract.EventSourceContract; -public class MemoryEventSourceTest extends MemoryBase implements EventSourceContract { - +public class MemoryEventSourceTest extends PerClassMemoryBase implements EventSourceContract { } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
