This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push:
new 723d53d1ec Add test with attachment regarding EmailSubmission/set
723d53d1ec is described below
commit 723d53d1ecebdc6f685a9b40040eafacb6fb1ff0
Author: Rene Cordier <[email protected]>
AuthorDate: Fri Aug 22 17:16:14 2025 +0700
Add test with attachment regarding EmailSubmission/set
---
.../EmailSubmissionSetMethodContract.scala | 160 ++++++++++++++++++++-
1 file changed, 159 insertions(+), 1 deletion(-)
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/EmailSubmissionSetMethodContract.scala
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetMethodContract.scala
index 85515ba42f..046187459a 100644
---
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetMethodContract.scala
+++
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetMethodContract.scala
@@ -27,7 +27,7 @@ import io.restassured.RestAssured.{`given`,
requestSpecification}
import io.restassured.builder.ResponseSpecBuilder
import io.restassured.http.ContentType.JSON
import net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson
-import org.apache.http.HttpStatus.SC_OK
+import org.apache.http.HttpStatus.{SC_CREATED, SC_OK}
import org.apache.james.GuiceJamesServer
import org.apache.james.jmap.core.ResponseObject.SESSION_STATE
import org.apache.james.jmap.core.UuidState.INSTANCE
@@ -43,6 +43,7 @@ import org.apache.james.utils.DataProbeImpl
import org.awaitility.Awaitility
import org.awaitility.Durations.ONE_HUNDRED_MILLISECONDS
import org.junit.jupiter.api.{BeforeEach, Test}
+import play.api.libs.json.{JsString, Json}
trait EmailSubmissionSetMethodContract {
private lazy val slowPacedPollInterval = ONE_HUNDRED_MILLISECONDS
@@ -2246,4 +2247,161 @@ trait EmailSubmissionSetMethodContract {
| ]
|}""".stripMargin)
}
+
+ @Test
+ def
emailSubmissionSetShouldSetCorrectlyHasAttachmentPropertyOnMessageInSentMailbox(server:
GuiceJamesServer): Unit = {
+ val bobDraftsPath = MailboxPath.forUser(BOB, DefaultMailboxes.DRAFTS)
+ val draftId =
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(bobDraftsPath)
+ val bobInboxId: MailboxId =
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB))
+ val bobSentId: MailboxId =
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.forUser(BOB,
DefaultMailboxes.SENT))
+
+ val payload = "123456789\r\n".getBytes(StandardCharsets.UTF_8)
+
+ val uploadResponse: String = `given`
+ .basePath("")
+ .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+ .contentType("text/plain")
+ .body(payload)
+ .when
+ .post(s"/upload/$ACCOUNT_ID")
+ .`then`
+ .statusCode(SC_CREATED)
+ .extract
+ .body
+ .asString
+
+ val blobId: String =
Json.parse(uploadResponse).\("blobId").get.asInstanceOf[JsString].value
+
+ val requestBob =
+ s"""{
+ | "using": ["urn:ietf:params:jmap:core",
"urn:ietf:params:jmap:mail", "urn:ietf:params:jmap:submission"],
+ | "methodCalls": [
+ | ["Email/set", {
+ | "accountId": "$ACCOUNT_ID",
+ | "create": {
+ | "e1526":{
+ | "mailboxIds": {"${draftId.serialize}": true},
+ | "to": [{"email": "${BOB.asString}"}],
+ | "from": [{"email": "${BOB.asString}"}],
+ | "subject": "World domination",
+ | "attachments": [
+ | {
+ | "blobId": "$blobId",
+ | "type":"text/plain",
+ | "charset":"UTF-8",
+ | "disposition": "attachment",
+ | "language": ["fr", "en"],
+ | "location": "http://125.26.23.36/content"
+ | }
+ | ]
+ | }
+ | }
+ | }, "c0"],
+ | ["EmailSubmission/set", {
+ | "accountId": "$ACCOUNT_ID",
+ | "create": {
+ | "k1490": {
+ | "emailId": "#e1526",
+ | "envelope": {
+ | "mailFrom": {"email": "${BOB.asString}"},
+ | "rcptTo": [{"email": "${BOB.asString}"}]
+ | }
+ | }
+ | },
+ | "onSuccessUpdateEmail": {
+ | "#k1490": {
+ | "mailboxIds/${bobSentId.serialize}": true,
+ | "mailboxIds/${draftId.serialize}": null,
+ | "keywords/$$seen": true,
+ | "keywords/$$draft": null
+ | }
+ | }
+ | }, "c1"]]
+ |}""".stripMargin
+
+ `given`
+ .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+ .body(requestBob)
+ .when
+ .post
+ .`then`
+ .statusCode(SC_OK)
+
+ val requestQueryMailBob =
+ s"""{
+ | "using": ["urn:ietf:params:jmap:core","urn:ietf:params:jmap:mail"],
+ | "methodCalls": [[
+ | "Email/query",
+ | {
+ | "accountId": "$ACCOUNT_ID",
+ | "filter": {"inMailbox": "${bobSentId.serialize}"}
+ | },
+ | "c0"]]
+ |}""".stripMargin
+
+ awaitAtMostTenSeconds.untilAsserted { () =>
+ val responseBob = `given`
+ .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+ .body(requestQueryMailBob)
+ .when
+ .post
+ .`then`
+ .statusCode(SC_OK)
+ .contentType(JSON)
+ .extract
+ .body
+ .asString
+
+ assertThatJson(responseBob)
+ .inPath("methodResponses[0][1].ids")
+ .isArray
+ .hasSize(1)
+ }
+
+ val requestReadMailBob =
+ s"""{
+ | "using": ["urn:ietf:params:jmap:core","urn:ietf:params:jmap:mail"],
+ | "methodCalls": [[
+ | "Email/query",
+ | {
+ | "accountId": "$ACCOUNT_ID",
+ | "filter": {"inMailbox": "${bobSentId.serialize}"}
+ | },
+ | "c0"],
+ | [
+ | "Email/get",
+ | {
+ | "accountId": "$ACCOUNT_ID",
+ | "#ids": {
+ | "resultOf": "c0",
+ | "name": "Email/query",
+ | "path": "/ids/*"
+ | },
+ | "properties": [
+ | "id",
+ | "hasAttachment"
+ | ]
+ | }, "c1"]]
+ |}""".stripMargin
+
+ val response = `given`
+ .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+ .body(requestReadMailBob)
+ .when
+ .post
+ .`then`
+ .statusCode(SC_OK)
+ .contentType(JSON)
+ .extract
+ .body
+ .asString
+
+ assertThatJson(response)
+ .whenIgnoringPaths("methodResponses[1][1].list[0].id")
+ .inPath(s"methodResponses[1][1].list")
+ .isEqualTo(
+ s"""[{
+ | "hasAttachment": true
+ |}]""".stripMargin)
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]