This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 879006ec8fa6cfce3473ab6775636b4481dd9e0a Author: Rene Cordier <[email protected]> AuthorDate: Tue Sep 22 14:55:15 2020 +0700 JAMES-3384 collapseThreads parameter should noop in Email/query --- .../contract/EmailQueryMethodContract.scala | 57 ++++++++++++++++++++++ .../james/jmap/json/EmailQuerySerializer.scala | 3 +- .../org/apache/james/jmap/mail/EmailQuery.scala | 9 +++- 3 files changed, 67 insertions(+), 2 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/EmailQueryMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala index eba54dd..ebf740d 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala @@ -911,6 +911,63 @@ trait EmailQueryMethodContract { """) } + @ParameterizedTest + @ValueSource(strings = Array( + "true", + "false" + )) + def collapseThreadsParameterShouldNoop(collapseThreads: Boolean, server: GuiceJamesServer): Unit = { + val message: Message = Message.Builder + .of + .setSubject("test") + .setBody("testmail", StandardCharsets.UTF_8) + .build + server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB)) + val otherMailboxPath = MailboxPath.forUser(BOB, "other") + val otherMailboxId = server.getProbe(classOf[MailboxProbeImpl]).createMailbox(otherMailboxPath) + server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.from(message)) + .getMessageId + val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, otherMailboxPath, AppendCommand.from(message)) + .getMessageId + + val request = + s"""{ + | "using": [ + | "urn:ietf:params:jmap:core", + | "urn:ietf:params:jmap:mail"], + | "methodCalls": [[ + | "Email/query", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "filter": { + | "inMailbox": "${otherMailboxId.serialize}" + | }, + | "collapseThreads": $collapseThreads + | }, + | "c1"]] + |}""".stripMargin + + awaitAtMostTenSeconds.untilAsserted { () => + val response = `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(request) + .when + .post + .`then` + .statusCode(SC_OK) + .contentType(JSON) + .extract + .body + .asString + + assertThatJson(response) + .inPath("$.methodResponses[0][1].ids") + .isEqualTo(s"""["${messageId2.serialize}"]""") + } + } + @Test def shouldReturnIllegalArgumentErrorForAnUnknownSpecificUserMailboxes(server: GuiceJamesServer): Unit = { val message: Message = Message.Builder diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala index 3fac550..57d1810 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala @@ -20,7 +20,7 @@ package org.apache.james.jmap.json import javax.inject.Inject -import org.apache.james.jmap.mail.{AllInThreadHaveKeywordSortProperty, Collation, Comparator, EmailQueryRequest, EmailQueryResponse, FilterCondition, HasAttachment, IsAscending, ReceivedAtSortProperty, SomeInThreadHaveKeywordSortProperty, SortProperty} +import org.apache.james.jmap.mail.{AllInThreadHaveKeywordSortProperty, CollapseThreads, Collation, Comparator, EmailQueryRequest, EmailQueryResponse, FilterCondition, HasAttachment, IsAscending, ReceivedAtSortProperty, SomeInThreadHaveKeywordSortProperty, SortProperty} import org.apache.james.jmap.model.{AccountId, CanCalculateChanges, Keyword, LimitUnparsed, PositionUnparsed, QueryState} import org.apache.james.mailbox.model.{MailboxId, MessageId} import play.api.libs.json._ @@ -71,6 +71,7 @@ class EmailQuerySerializer @Inject()(mailboxIdFactory: MailboxId.Factory) { private implicit val isAscendingFormat: Format[IsAscending] = Json.valueFormat[IsAscending] private implicit val collationFormat: Format[Collation] = Json.valueFormat[Collation] private implicit val comparatorFormat: Format[Comparator] = Json.format[Comparator] + private implicit val collapseThreadsReads: Reads[CollapseThreads] = Json.valueReads[CollapseThreads] private implicit val emailQueryRequestReads: Reads[EmailQueryRequest] = Json.reads[EmailQueryRequest] diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala index e2ab4ea..6fa3ef6 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala @@ -39,7 +39,12 @@ case class FilterCondition(inMailbox: Option[MailboxId], maxSize: Option[Size], hasAttachment: Option[HasAttachment]) -case class EmailQueryRequest(accountId: AccountId, position: Option[PositionUnparsed], limit: Option[LimitUnparsed], filter: Option[FilterCondition], comparator: Option[Set[Comparator]]) +case class EmailQueryRequest(accountId: AccountId, + position: Option[PositionUnparsed], + limit: Option[LimitUnparsed], + filter: Option[FilterCondition], + comparator: Option[Set[Comparator]], + collapseThreads: Option[CollapseThreads]) sealed trait SortProperty { def toSortClause: Either[UnsupportedSortException, SortClause] @@ -83,6 +88,8 @@ case class Comparator(property: SortProperty, } yield new SearchQuery.Sort(sortClause, isAscending.getOrElse(ASCENDING).toSortOrder) } +case class CollapseThreads(value: Boolean) extends AnyVal + case class EmailQueryResponse(accountId: AccountId, queryState: QueryState, canCalculateChanges: CanCalculateChanges, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
