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
commit ac9890279c3b7434703110982f71461241d0a08d Author: Rene Cordier <[email protected]> AuthorDate: Fri May 22 21:59:56 2020 +0700 JAMES-3171 Mailbox/get all integration tests --- .../DistributedMailboxGetMethodTest.java | 51 +++ .../james/jmap/rfc8621/contract/Fixture.scala | 2 + .../contract/MailboxGetMethodContract.scala | 476 +++++++++++++++++++++ .../rfc8621/memory/MemoryMailboxGetMethodTest.java | 38 ++ 4 files changed, 567 insertions(+) diff --git a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxGetMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxGetMethodTest.java new file mode 100644 index 0000000..d2db630 --- /dev/null +++ b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxGetMethodTest.java @@ -0,0 +1,51 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.jmap.rfc8621.distributed; + +import org.apache.james.CassandraExtension; +import org.apache.james.CassandraRabbitMQJamesConfiguration; +import org.apache.james.CassandraRabbitMQJamesServerMain; +import org.apache.james.DockerElasticSearchExtension; +import org.apache.james.JamesServerBuilder; +import org.apache.james.JamesServerExtension; +import org.apache.james.jmap.rfc8621.contract.MailboxGetMethodContract; +import org.apache.james.modules.AwsS3BlobStoreExtension; +import org.apache.james.modules.RabbitMQExtension; +import org.apache.james.modules.TestJMAPServerModule; +import org.apache.james.modules.blobstore.BlobStoreConfiguration; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class DistributedMailboxGetMethodTest implements MailboxGetMethodContract { + @RegisterExtension + static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir -> + CassandraRabbitMQJamesConfiguration.builder() + .workingDirectory(tmpDir) + .configurationFromClasspath() + .blobStore(BlobStoreConfiguration.objectStorage().disableCache()) + .build()) + .extension(new DockerElasticSearchExtension()) + .extension(new CassandraExtension()) + .extension(new RabbitMQExtension()) + .extension(new AwsS3BlobStoreExtension()) + .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration) + .overrideWith(new TestJMAPServerModule())) + .build(); + +} 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/Fixture.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/Fixture.scala index 7d22579..799f8f9 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/Fixture.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/Fixture.scala @@ -69,8 +69,10 @@ object Fixture { val DOMAIN_WITH_SPACE: Domain = Domain.of("dom ain.tld") val _2_DOT_DOMAIN: Domain = Domain.of("do.main.tld") val BOB: Username = Username.fromLocalPartWithDomain("bob", DOMAIN) + val ANDRE: Username = Username.fromLocalPartWithDomain("andre", DOMAIN) val ALICE: Username = Username.fromLocalPartWithDomain("alice", _2_DOT_DOMAIN) val BOB_PASSWORD: String = "bobpassword" + val ANDRE_PASSWORD: String = "andrepassword" val ALICE_PASSWORD: String = "alicepassword" val BOB_BASIC_AUTH_HEADER: Header = new Header(AUTHORIZATION_HEADER, s"Basic ${toBase64(s"${BOB.asString}:$BOB_PASSWORD")}") 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/MailboxGetMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala new file mode 100644 index 0000000..0748914 --- /dev/null +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala @@ -0,0 +1,476 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ +package org.apache.james.jmap.rfc8621.contract + +import java.io.ByteArrayInputStream +import java.nio.charset.StandardCharsets +import java.util.Date + +import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT +import io.restassured.RestAssured._ +import io.restassured.http.ContentType.JSON +import javax.mail.Flags +import net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson +import org.apache.http.HttpStatus.{SC_INTERNAL_SERVER_ERROR, SC_OK} +import org.apache.james.GuiceJamesServer +import org.apache.james.core.quota.{QuotaCountLimit, QuotaSizeLimit} +import org.apache.james.jmap.http.UserCredential +import org.apache.james.jmap.rfc8621.contract.Fixture._ +import org.apache.james.jmap.rfc8621.contract.tags.CategoryTags +import org.apache.james.mailbox.MessageManager.AppendCommand +import org.apache.james.mailbox.model.MailboxACL.Right +import org.apache.james.mailbox.model.{MailboxACL, MailboxId, MailboxPath} +import org.apache.james.mailbox.{DefaultMailboxes, Role} +import org.apache.james.mime4j.dom.Message +import org.apache.james.modules.{ACLProbeImpl, MailboxProbeImpl, QuotaProbesImpl} +import org.apache.james.utils.DataProbeImpl +import org.hamcrest.Matchers._ +import org.junit.jupiter.api.{BeforeEach, Tag, Test} + +object MailboxGetMethodContract { + private val ARGUMENTS: String = "methodResponses[0][1]" + private val FIRST_MAILBOX: String = ARGUMENTS + ".list[0]" + private val SECOND_MAILBOX: String = ARGUMENTS + ".list[1]" + + private val LOOKUP: String = Right.Lookup.asCharacter.toString + private val READ: String = Right.Read.asCharacter.toString + private val ADMINISTER: String = Right.Administer.asCharacter.toString + + private val GET_ALL_MAILBOXES_REQUEST: String = + """{ + | "using": [ + | "urn:ietf:params:jmap:core", + | "urn:ietf:params:jmap:mail"], + | "methodCalls": [[ + | "Mailbox/get", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "ids": null + | }, + | "c1"]] + |}""".stripMargin +} + +trait MailboxGetMethodContract { + import MailboxGetMethodContract._ + + @BeforeEach + def setUp(server: GuiceJamesServer): Unit = { + server.getProbe(classOf[DataProbeImpl]) + .fluent + .addDomain(DOMAIN.asString) + .addUser(BOB.asString, BOB_PASSWORD) + .addUser(ANDRE.asString, ANDRE_PASSWORD) + + requestSpecification = baseRequestSpecBuilder(server) + .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD))) + .build + } + + @Test + def getMailboxesShouldReturnExistingMailbox(server: GuiceJamesServer): Unit = { + val mailboxId: String = server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, "custom")) + .serialize + + val response: String = `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .contentType(JSON) + .extract + .body + .asString + + assertThatJson(response).isEqualTo( + s"""{ + | "sessionState": "75128aab4b1b", + | "methodResponses": [[ + | "Mailbox/get", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "state": "000001", + | "list": [ + | { + | "id": "${mailboxId}", + | "name": "custom", + | "sortOrder": 1000, + | "totalEmails": 0, + | "unreadEmails": 0, + | "totalThreads": 0, + | "unreadThreads": 0, + | "myRights": { + | "mayReadItems": true, + | "mayAddItems": true, + | "mayRemoveItems": true, + | "maySetSeen": true, + | "maySetKeywords": true, + | "mayCreateChild": true, + | "mayRename": true, + | "mayDelete": true, + | "maySubmit": true + | }, + | "isSubscribed": false, + | "namespace": "Personal", + | "rights": {}, + | "quotas": { + | "#private&[email protected]": { + | "Storage": { "used": 0}, + | "Message": {"used": 0} + | } + | } + | } + | ], + | "notFound": [] + | }, + | "c1"]] + |}""".stripMargin) + } + + @Test + @Tag(CategoryTags.BASIC_FEATURE) + def getMailboxesShouldReturnEmptyWhenNone(): Unit = { + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", empty) + } + + @Test + @Tag(CategoryTags.BASIC_FEATURE) + def getMailboxesShouldReturnAllExistingMailboxes(server: GuiceJamesServer): Unit = { + val firstMailboxName: String = "custom" + val mailboxId1: String = server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, firstMailboxName)) + .serialize + + val secondMailboxName: String = "othercustom" + val mailboxId2: String = server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, secondMailboxName)) + .serialize + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(2)) + .body(s"$FIRST_MAILBOX.id", equalTo(mailboxId1)) + .body(s"$FIRST_MAILBOX.name", equalTo(firstMailboxName)) + .body(s"$SECOND_MAILBOX.id", equalTo(mailboxId2)) + .body(s"$SECOND_MAILBOX.name", equalTo(secondMailboxName)) + } + + @Test + def getMailboxesShouldReturnOnlyMailboxesOfCurrentUser(server: GuiceJamesServer): Unit = { + val mailboxName: String = "custom" + val mailboxId: String = server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, "custom")) + .serialize + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(ANDRE, "andrecustom")) + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.id", equalTo(mailboxId)) + .body(s"$FIRST_MAILBOX.name", equalTo(mailboxName)) + } + + @Test + def getMailboxesShouldReturnSharedRights(server: GuiceJamesServer): Unit = { + val targetUser1: String = "touser1@" + DOMAIN.asString + val targetUser2: String = "touser2@" + DOMAIN.asString + val mailboxName: String = "myMailbox" + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, mailboxName)) + .serialize + + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(MailboxPath.forUser(BOB, mailboxName), targetUser1, new MailboxACL.Rfc4314Rights(Right.Lookup, Right.Administer)) + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(MailboxPath.forUser(BOB, mailboxName), targetUser2, new MailboxACL.Rfc4314Rights(Right.Read, Right.Lookup)) + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(mailboxName)) + .body(s"$FIRST_MAILBOX.rights['$targetUser1']", contains(ADMINISTER, LOOKUP)) + .body(s"$FIRST_MAILBOX.rights['$targetUser2']", contains(LOOKUP, READ)) + } + + @Test + @Tag(CategoryTags.BASIC_FEATURE) + def getMailboxesShouldReturnDelegatedNamespaceWhenSharedMailbox(server: GuiceJamesServer): Unit = { + val sharedMailboxName = "AndreShared" + val andreMailboxPath = MailboxPath.forUser(ANDRE, sharedMailboxName) + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(andreMailboxPath) + .serialize + + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(andreMailboxPath, BOB.asString, new MailboxACL.Rfc4314Rights(Right.Lookup)) + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(sharedMailboxName)) + .body(s"$FIRST_MAILBOX.namespace", equalTo(s"Delegated[${ANDRE.asString}]")) + .body(s"$FIRST_MAILBOX.rights['${BOB.asString}']", contains(LOOKUP)) + } + + @Test + @Tag(CategoryTags.BASIC_FEATURE) + def getMailboxesShouldNotReturnOtherPeopleRightsAsSharee(server: GuiceJamesServer): Unit = { + val toUser1: String = "touser1@" + DOMAIN.asString + val sharedMailboxName: String = "AndreShared" + val andreMailboxPath: MailboxPath = MailboxPath.forUser(ANDRE, sharedMailboxName) + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(andreMailboxPath) + .serialize + + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(andreMailboxPath, BOB.asString, new MailboxACL.Rfc4314Rights(Right.Lookup, Right.Read)) + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(andreMailboxPath, toUser1, new MailboxACL.Rfc4314Rights(Right.Lookup, Right.Read)) + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(sharedMailboxName)) + .body(s"$FIRST_MAILBOX.rights['${BOB.asString}']", contains(LOOKUP, READ)) + .body(s"$FIRST_MAILBOX.rights['$toUser1']", nullValue) + } + + @Test + def getMailboxesShouldReturnPartiallyAllowedMayPropertiesWhenDelegated(server: GuiceJamesServer): Unit = { + val toUser1: String = "touser1@" + DOMAIN.asString + val sharedMailboxName: String = "AndreShared" + val andreMailboxPath: MailboxPath = MailboxPath.forUser(ANDRE, sharedMailboxName) + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(andreMailboxPath) + .serialize + + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(andreMailboxPath, BOB.asString, new MailboxACL.Rfc4314Rights(Right.Lookup, Right.Read)) + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(andreMailboxPath, toUser1, new MailboxACL.Rfc4314Rights(Right.Lookup, Right.Read)) + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(sharedMailboxName)) + .body(s"$FIRST_MAILBOX.myRights.mayReadItems", equalTo(true)) + .body(s"$FIRST_MAILBOX.myRights.mayAddItems", equalTo(false)) + .body(s"$FIRST_MAILBOX.myRights.mayRemoveItems", equalTo(false)) + .body(s"$FIRST_MAILBOX.myRights.mayCreateChild", equalTo(false)) + .body(s"$FIRST_MAILBOX.myRights.mayDelete", equalTo(false)) + .body(s"$FIRST_MAILBOX.myRights.mayRename", equalTo(false)) + .body(s"$FIRST_MAILBOX.myRights.maySubmit", equalTo(false)) + .body(s"$FIRST_MAILBOX.myRights.maySetSeen", equalTo(false)) + .body(s"$FIRST_MAILBOX.myRights.maySetKeywords", equalTo(false)) + } + + @Test + @Tag(CategoryTags.BASIC_FEATURE) + def getMailboxesShouldNotReturnInboxRoleToShareeWhenDelegatedInbox(server: GuiceJamesServer): Unit = { + val andreMailboxPath = MailboxPath.forUser(ANDRE, DefaultMailboxes.INBOX) + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(andreMailboxPath) + .serialize + + server.getProbe(classOf[ACLProbeImpl]) + .replaceRights(andreMailboxPath, BOB.asString, new MailboxACL.Rfc4314Rights(Right.Lookup)) + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(DefaultMailboxes.INBOX)) + .body(s"$FIRST_MAILBOX.role", nullValue) + .body(s"$FIRST_MAILBOX.sortOrder", equalTo(1000)) + } + + @Test + def getMailboxesShouldReturnCorrectMailboxRole(server: GuiceJamesServer): Unit = { + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, DefaultMailboxes.INBOX)) + .serialize + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(DefaultMailboxes.INBOX)) + .body(s"$FIRST_MAILBOX.role", equalTo(Role.INBOX.serialize)) + .body(s"$FIRST_MAILBOX.sortOrder", equalTo(10)) + } + + @Test + @Tag(CategoryTags.BASIC_FEATURE) + def getMailboxesShouldReturnUpdatedQuotasForInboxWhenMailReceived(server: GuiceJamesServer): Unit = { + val message: Message = Message.Builder + .of + .setSubject("test") + .setBody("testmail", StandardCharsets.UTF_8) + .build + + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, DefaultMailboxes.INBOX)) + .serialize + + server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.forUser(BOB, DefaultMailboxes.INBOX), AppendCommand.from(message)) + server.getProbe(classOf[MailboxProbeImpl]) + .appendMessage(BOB.asString, MailboxPath.forUser(BOB, DefaultMailboxes.INBOX), + new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags(Flags.Flag.SEEN)) + + Thread.sleep(1000) //dirty fix for distributed integration test... + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(DefaultMailboxes.INBOX)) + .body(s"$FIRST_MAILBOX.quotas['#private&[email protected]']['Storage'].used", equalTo(110)) + .body(s"$FIRST_MAILBOX.quotas['#private&[email protected]']['Storage'].max", nullValue) + .body(s"$FIRST_MAILBOX.quotas['#private&[email protected]']['Message'].used", equalTo(2)) + .body(s"$FIRST_MAILBOX.quotas['#private&[email protected]']['Message'].max", nullValue) + } + + @Test + def getMailboxesShouldReturnMaximumQuotasWhenSet(server: GuiceJamesServer): Unit = { + server.getProbe(classOf[QuotaProbesImpl]) + .setGlobalMaxStorage(QuotaSizeLimit.size(142)) + server.getProbe(classOf[QuotaProbesImpl]) + .setGlobalMaxMessageCount(QuotaCountLimit.count(31)) + + server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, DefaultMailboxes.INBOX)) + .serialize + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(1)) + .body(s"$FIRST_MAILBOX.name", equalTo(DefaultMailboxes.INBOX)) + .body(s"$FIRST_MAILBOX.quotas['#private&[email protected]']['Storage'].max", equalTo(142)) + .body(s"$FIRST_MAILBOX.quotas['#private&[email protected]']['Message'].max", equalTo(31)) + } + + @Test + def getMailboxesShouldReturnMailboxesInSorteredOrder(server: GuiceJamesServer): Unit = { + val mailboxId1: String = server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, DefaultMailboxes.TRASH)) + .serialize + val mailboxId2: String = server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, DefaultMailboxes.INBOX)) + .serialize + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(GET_ALL_MAILBOXES_REQUEST) + .when + .post + .`then` + .statusCode(SC_OK) + .body(s"$ARGUMENTS.list", hasSize(2)) + .body(s"$FIRST_MAILBOX.id", equalTo(mailboxId2)) + .body(s"$FIRST_MAILBOX.name", equalTo(DefaultMailboxes.INBOX)) + .body(s"$FIRST_MAILBOX.sortOrder", equalTo(10)) + .body(s"$SECOND_MAILBOX.id", equalTo(mailboxId1)) + .body(s"$SECOND_MAILBOX.name", equalTo(DefaultMailboxes.TRASH)) + .body(s"$SECOND_MAILBOX.sortOrder", equalTo(60)) + } + + @Test + def getMailboxesByIdsShouldNotBeImplementedYet(server: GuiceJamesServer): Unit = { + val mailboxId: MailboxId = server.getProbe(classOf[MailboxProbeImpl]) + .createMailbox(MailboxPath.forUser(BOB, "custom")) + + `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(s"""{ + | "using": [ + | "urn:ietf:params:jmap:core", + | "urn:ietf:params:jmap:mail"], + | "methodCalls": [[ + | "Mailbox/get", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "ids": ["${mailboxId}"] + | }, + | "c1"]] + |}""".stripMargin) + .when + .post + .`then` + .statusCode(SC_INTERNAL_SERVER_ERROR) + } +} 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/MemoryMailboxGetMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMailboxGetMethodTest.java new file mode 100644 index 0000000..70db27f --- /dev/null +++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMailboxGetMethodTest.java @@ -0,0 +1,38 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.jmap.rfc8621.memory; + +import static org.apache.james.MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE; + +import org.apache.james.GuiceJamesServer; +import org.apache.james.JamesServerBuilder; +import org.apache.james.JamesServerExtension; +import org.apache.james.jmap.rfc8621.contract.MailboxGetMethodContract; +import org.apache.james.modules.TestJMAPServerModule; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class MemoryMailboxGetMethodTest implements MailboxGetMethodContract { + @RegisterExtension + static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider()) + .server(configuration -> GuiceJamesServer.forConfiguration(configuration) + .combineWith(IN_MEMORY_SERVER_AGGREGATE_MODULE) + .overrideWith(new TestJMAPServerModule())) + .build(); +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
