blob: cc8b30c1753916f1302f5e7b753c85042b8a3272 [file] [log] [blame]
/****************************************************************
* 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.draft.methods.integration;
import static io.restassured.RestAssured.given;
import static io.restassured.RestAssured.with;
import static org.apache.james.jmap.HttpJmapAuthentication.authenticateJamesUser;
import static org.apache.james.jmap.JMAPTestingConstants.ALICE;
import static org.apache.james.jmap.JMAPTestingConstants.ALICE_PASSWORD;
import static org.apache.james.jmap.JMAPTestingConstants.ARGUMENTS;
import static org.apache.james.jmap.JMAPTestingConstants.BOB;
import static org.apache.james.jmap.JMAPTestingConstants.BOB_PASSWORD;
import static org.apache.james.jmap.JMAPTestingConstants.CEDRIC;
import static org.apache.james.jmap.JMAPTestingConstants.DOMAIN;
import static org.apache.james.jmap.JMAPTestingConstants.NAME;
import static org.apache.james.jmap.JMAPTestingConstants.calmlyAwait;
import static org.apache.james.jmap.JMAPTestingConstants.jmapRequestSpecBuilder;
import static org.apache.james.jmap.JmapCommonRequests.getOutboxId;
import static org.apache.james.jmap.JmapURIBuilder.baseUri;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Durations.ONE_MINUTE;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasSize;
import java.io.IOException;
import java.util.Locale;
import org.apache.james.GuiceJamesServer;
import org.apache.james.jmap.AccessToken;
import org.apache.james.jmap.JmapCommonRequests;
import org.apache.james.jmap.draft.JmapGuiceProbe;
import org.apache.james.junit.categories.BasicFeature;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.modules.MailboxProbeImpl;
import org.apache.james.probe.DataProbe;
import org.apache.james.utils.DataProbeImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import io.restassured.RestAssured;
public abstract class FilterTest {
protected abstract GuiceJamesServer createJmapServer() throws IOException;
protected abstract MailboxId randomMailboxId();
private AccessToken accessToken;
private AccessToken bobAccessToken;
private GuiceJamesServer jmapServer;
private MailboxId matchedMailbox;
private MailboxId inbox;
@Before
public void setup() throws Throwable {
jmapServer = createJmapServer();
jmapServer.start();
RestAssured.requestSpecification = jmapRequestSpecBuilder
.setPort(jmapServer.getProbe(JmapGuiceProbe.class).getJmapPort().getValue())
.build();
DataProbe dataProbe = jmapServer.getProbe(DataProbeImpl.class);
dataProbe.addDomain(DOMAIN);
dataProbe.addUser(ALICE.asString(), ALICE_PASSWORD);
dataProbe.addUser(BOB.asString(), BOB_PASSWORD);
accessToken = authenticateJamesUser(baseUri(jmapServer), ALICE, ALICE_PASSWORD);
bobAccessToken = authenticateJamesUser(baseUri(jmapServer), BOB, BOB_PASSWORD);
MailboxProbeImpl mailboxProbe = jmapServer.getProbe(MailboxProbeImpl.class);
matchedMailbox = mailboxProbe.createMailbox(MailboxPath.forUser(ALICE, "matched"));
inbox = mailboxProbe.createMailbox(MailboxPath.inbox(ALICE));
}
@After
public void teardown() {
jmapServer.stop();
}
@Test
public void getFilterShouldReturnEmptyByDefault() {
String body = "[[" +
" \"getFilter\", " +
" {}, " +
"\"#0\"" +
"]]";
given()
.header("Authorization", accessToken.asString())
.body(body)
.when()
.post("/jmap")
.then()
.statusCode(200)
.body(NAME, equalTo("filter"))
.body(ARGUMENTS + ".singleton", hasSize(0));
}
@Test
public void getFilterShouldReturnEmptyWhenExplicitNullAccountId() {
String body = "[[" +
" \"getFilter\", " +
" {\"accountId\": null}, " +
"\"#0\"" +
"]]";
given()
.header("Authorization", accessToken.asString())
.body(body)
.when()
.post("/jmap")
.then()
.statusCode(200)
.body(NAME, equalTo("filter"))
.body(ARGUMENTS + ".singleton", hasSize(0));
}
@Test
public void getFilterShouldReturnErrorWhenUnsupportedAccountId() {
String body = "[[" +
" \"getFilter\", " +
" {\"accountId\": \"any\"}, " +
"\"#0\"" +
"]]";
given()
.header("Authorization", accessToken.asString())
.body(body)
.when()
.post("/jmap")
.then()
.statusCode(200)
.body(NAME, equalTo("error"))
.body(ARGUMENTS + ".type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".description", equalTo("The field 'accountId' of 'GetFilterRequest' is not supported"));
}
@Category(BasicFeature.class)
@Test
public void setFilterShouldOverwritePreviouslyStoredRules() {
MailboxId mailbox1 = randomMailboxId();
MailboxId mailbox2 = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"My first rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox2.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
with()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"42-ac\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"exactly-equals\"," +
" \"value\": \"marvin@h2.g2\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox1.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"getFilter\", " +
" {}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200)
.body(NAME, equalTo("filter"))
.body(ARGUMENTS + ".singleton", hasSize(1))
.body(ARGUMENTS + ".singleton[0].id", equalTo("42-ac"))
.body(ARGUMENTS + ".singleton[0].name", equalTo("My last rule"))
.body(ARGUMENTS + ".singleton[0].condition.field", equalTo("from"))
.body(ARGUMENTS + ".singleton[0].condition.comparator", equalTo("exactly-equals"))
.body(ARGUMENTS + ".singleton[0].condition.value", equalTo("marvin@h2.g2"))
.body(ARGUMENTS + ".singleton[0].action.appendIn.mailboxIds", containsInAnyOrder(mailbox1.serialize()));
}
@Test
public void setFilterShouldRejectRuleWithInvalidRuleName() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": null," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(ARGUMENTS + ".type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".description", containsString("`name` is mandatory"));
}
@Test
public void setFilterShouldRejectRuleWithInvalidRuleId() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": null," +
" \"name\": \"some name\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(ARGUMENTS + ".type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".description", containsString("`id` is mandatory"));
}
@Test
public void setFilterShouldRejectRuleWithoutRuleCondition() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"some name\"," +
" \"condition\": null," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(ARGUMENTS + ".type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".description", containsString("`condition` is mandatory"));
}
@Test
public void setFilterShouldRejectRuleWithInvalidRuleCondition() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"some name\"," +
" \"condition\": {" +
" \"field\": \"subject\" " +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(ARGUMENTS + ".type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".description", equalTo("'null' is not a valid comparator name"));
}
@Test
public void setFilterShouldReturnUpdatedSingleton() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(NAME, equalTo("filterSet"))
.body(ARGUMENTS + ".updated", containsInAnyOrder("singleton"));
}
@Test
public void setFilterShouldRejectDuplicatedRules() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(NAME, equalTo("filterSet"))
.body(ARGUMENTS + ".updated", hasSize(0))
.body(ARGUMENTS + ".notUpdated.singleton.type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".notUpdated.singleton.description", equalTo("The following rules were duplicated: ['3000-34e']"));
}
@Test
public void setFilterShouldRejectRulesTargetingSeveralMailboxes() {
MailboxId mailbox1 = randomMailboxId();
MailboxId mailbox2 = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox1.serialize() + "\",\"" + mailbox2.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(NAME, equalTo("filterSet"))
.body(ARGUMENTS + ".updated", hasSize(0))
.body(ARGUMENTS + ".notUpdated.singleton.type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".notUpdated.singleton.description", equalTo("The following rules targeted several mailboxes, which is not supported: ['3000-34e']"));
}
@Test
public void setFilterShouldRejectAccountId() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"accountId\": \"any\"," +
" \"singleton\": []" +
" }, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(NAME, equalTo("error"))
.body(ARGUMENTS + ".type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".description", equalTo("The field 'accountId' of 'SetFilterRequest' is not supported"));
}
@Test
public void setFilterShouldAcceptNullAccountId() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"accountId\": null," +
" \"singleton\": []" +
" }, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(NAME, equalTo("filterSet"))
.body(ARGUMENTS + ".updated", hasSize(1));
}
@Test
public void setFilterShouldRejectIfInState() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"ifInState\": \"any\"," +
" \"singleton\": []" +
" }, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(NAME, equalTo("error"))
.body(ARGUMENTS + ".type", equalTo("invalidArguments"))
.body(ARGUMENTS + ".description", equalTo("The field 'ifInState' of 'SetFilterRequest' is not supported"));
}
@Test
public void setFilterShouldAcceptNullIfInState() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"ifInState\": null," +
" \"singleton\": []" +
" }, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.body(NAME, equalTo("filterSet"))
.body(ARGUMENTS + ".updated", hasSize(1));
}
@Category(BasicFeature.class)
@Test
public void getFilterShouldRetrievePreviouslyStoredRules() {
MailboxId mailbox1 = randomMailboxId();
MailboxId mailbox2 = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"42-ac\"," +
" \"name\": \"My first rule\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"exactly-equals\"," +
" \"value\": \"marvin@h2.g2\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox1.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox2.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"getFilter\", " +
" {}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200)
.body(NAME, equalTo("filter"))
.body(ARGUMENTS + ".singleton", hasSize(2))
.body(ARGUMENTS + ".singleton[0].id", equalTo("42-ac"))
.body(ARGUMENTS + ".singleton[0].name", equalTo("My first rule"))
.body(ARGUMENTS + ".singleton[0].condition.field", equalTo("from"))
.body(ARGUMENTS + ".singleton[0].condition.comparator", equalTo("exactly-equals"))
.body(ARGUMENTS + ".singleton[0].condition.value", equalTo("marvin@h2.g2"))
.body(ARGUMENTS + ".singleton[0].action.appendIn.mailboxIds", containsInAnyOrder(mailbox1.serialize()))
.body(ARGUMENTS + ".singleton[1].id", equalTo("3000-34e"))
.body(ARGUMENTS + ".singleton[1].name", equalTo("My last rule"))
.body(ARGUMENTS + ".singleton[1].condition.field", equalTo("subject"))
.body(ARGUMENTS + ".singleton[1].condition.comparator", equalTo("contains"))
.body(ARGUMENTS + ".singleton[1].condition.value", equalTo("question"))
.body(ARGUMENTS + ".singleton[1].action.appendIn.mailboxIds", containsInAnyOrder(mailbox2.serialize()));
}
@Category(BasicFeature.class)
@Test
public void setFilterShouldClearPreviouslyStoredRulesWhenEmptyBody() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-34e\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
with()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": []" +
" }, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"getFilter\", " +
" {}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200)
.body(NAME, equalTo("filter"))
.body(ARGUMENTS + ".singleton", hasSize(0));
}
@Test
public void allFieldsAndComparatorsShouldBeSupported() {
MailboxId mailbox = randomMailboxId();
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-341\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-342\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"cc\"," +
" \"comparator\": \"not-contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-343\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"to\"," +
" \"comparator\": \"exactly-equals\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-344\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"recipient\"," +
" \"comparator\": \"not-exactly-equals\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"My last rule\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"question\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + mailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"getFilter\", " +
" {}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200)
.body(NAME, equalTo("filter"))
.body(ARGUMENTS + ".singleton", hasSize(5))
.body(ARGUMENTS + ".singleton[0].id", equalTo("3000-341"))
.body(ARGUMENTS + ".singleton[0].condition.field", equalTo("subject"))
.body(ARGUMENTS + ".singleton[0].condition.comparator", equalTo("contains"))
.body(ARGUMENTS + ".singleton[1].id", equalTo("3000-342"))
.body(ARGUMENTS + ".singleton[1].condition.field", equalTo("cc"))
.body(ARGUMENTS + ".singleton[1].condition.comparator", equalTo("not-contains"))
.body(ARGUMENTS + ".singleton[2].id", equalTo("3000-343"))
.body(ARGUMENTS + ".singleton[2].condition.field", equalTo("to"))
.body(ARGUMENTS + ".singleton[2].condition.comparator", equalTo("exactly-equals"))
.body(ARGUMENTS + ".singleton[3].id", equalTo("3000-344"))
.body(ARGUMENTS + ".singleton[3].condition.field", equalTo("recipient"))
.body(ARGUMENTS + ".singleton[3].condition.comparator", equalTo("not-exactly-equals"))
.body(ARGUMENTS + ".singleton[4].id", equalTo("3000-345"))
.body(ARGUMENTS + ".singleton[4].condition.field", equalTo("from"))
.body(ARGUMENTS + ".singleton[4].condition.comparator", equalTo("contains"));
}
@Category(BasicFeature.class)
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenFromRuleMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + BOB.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap");
calmlyAwait.atMost(ONE_MINUTE)
.until(() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenToRuleMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails to cedric\"," +
" \"condition\": {" +
" \"field\": \"to\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"},{ \"name\": \"Cedric\", \"email\": \"" + CEDRIC.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenCcRuleMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails cc-ed to cedric\"," +
" \"condition\": {" +
" \"field\": \"cc\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"cc\": [{ \"name\": \"Cedric\", \"email\": \"" + CEDRIC.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenRecipientRuleMatchesCc() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails cc-ed to cedric\"," +
" \"condition\": {" +
" \"field\": \"recipient\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"cc\": [{ \"name\": \"Cedric\", \"email\": \"" + CEDRIC.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenRecipientRuleMatchesTo() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails cc-ed to cedric\"," +
" \"condition\": {" +
" \"field\": \"recipient\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + CEDRIC.asString() + "\"}]," +
" \"cc\": [{ \"name\": \"Cedric\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenSubjectRuleMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"matchme\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"},{ \"name\": \"Cedric\", \"email\": \"" + CEDRIC.asString() + "\"}]," +
" \"subject\": \"matchme\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Category(BasicFeature.class)
@Test
public void messageShouldBeAppendedInInboxWhenFromDoesNotMatchRule() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.atMost(ONE_MINUTE)
.until(() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenToDoesNotMatchRule() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails to cedric\"," +
" \"condition\": {" +
" \"field\": \"to\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenCcDoesNotMatchRule() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails cc-ed to cedric\"," +
" \"condition\": {" +
" \"field\": \"cc\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"cc\": [{ \"name\": \"Cedric\", \"email\": \"" + BOB.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenRecipientDoesNotMatchRule() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails cc-ed to cedric\"," +
" \"condition\": {" +
" \"field\": \"recipient\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + CEDRIC.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"cc\": [{ \"name\": \"Cedric\", \"email\": \"" + BOB.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenSubjectRuleDoesNotMatchRule() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"matchme\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"},{ \"name\": \"Cedric\", \"email\": \"" + CEDRIC.asString() + "\"}]," +
" \"subject\": \"nomatch\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenSubjectRuleDoesNotMatchRuleBecauseOfCase() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"subject\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"different case value\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"},{ \"name\": \"Cedric\", \"email\": \"" + CEDRIC.asString() + "\"}]," +
" \"subject\": \"DIFFERENT CASE VALUE\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenContainsComparatorMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"bo\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenContainsComparatorDoesNotMatch() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"ced\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenExactlyEqualsMatchesName() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"exactly-equals\"," +
" \"value\": \"Bob\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenExactlyEqualsMatchesAddress() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"exactly-equals\"," +
" \"value\": \"" + BOB.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenExactlyEqualsMatchesFullHeader() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"exactly-equals\"," +
" \"value\": \"Bob <" + BOB.asString() + ">\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenExactlyEqualsMatchesCaseInsensitivelyFullHeader() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"exactly-equals\"," +
" \"value\": \"bob <" + BOB.asString().toUpperCase(Locale.ENGLISH) + ">\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenExactlyEqualsComparatorDoesNotMatch() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"exactly-equals\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"nomatch\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenNotContainsComparatorMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"not-contains\"," +
" \"value\": \"other\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenNotContainsComparatorDoesNotMatch() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"not-contains\"," +
" \"value\": \"bob\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenContainsNotExactlyEqualsMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"not-exactly-equals\"," +
" \"value\": \"nomatch\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenNotExactlyEqualsMatchesAddress() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"not-exactly-equals\"," +
" \"value\": \"" + BOB.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenNotExactlyEqualsMatchesFullHeader() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"not-exactly-equals\"," +
" \"value\": \"Bob <" + BOB.asString() + ">\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInInboxWhenNotExactlyEqualsComparatorMatchesName() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"not-exactly-equals\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"Bob\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap")
.then()
.statusCode(200);
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenFirstRuleMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + BOB.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-346\"," +
" \"name\": \"Emails to alice\"," +
" \"condition\": {" +
" \"field\": \"to\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + ALICE.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap");
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void messageShouldBeAppendedInSpecificMailboxWhenSecondRuleMatches() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"unknown@james.org\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }," +
" {" +
" \"id\": \"3000-346\"," +
" \"name\": \"Emails to alice\"," +
" \"condition\": {" +
" \"field\": \"to\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + ALICE.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap");
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
}
@Test
public void inboxShouldBeEmptyWhenFromRuleMatchesInSpecificMailbox() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"" + BOB.asString() + "\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap");
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox));
assertThat(JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox)).isFalse();
}
@Test
public void matchedMailboxShouldBeEmptyWhenFromRuleDoesntMatch() {
given()
.header("Authorization", accessToken.asString())
.body("[[" +
" \"setFilter\", " +
" {" +
" \"singleton\": [" +
" {" +
" \"id\": \"3000-345\"," +
" \"name\": \"Emails from bob\"," +
" \"condition\": {" +
" \"field\": \"from\"," +
" \"comparator\": \"contains\"," +
" \"value\": \"unknown@james.org\"" +
" }," +
" \"action\": {" +
" \"appendIn\": {" +
" \"mailboxIds\": [\"" + matchedMailbox.serialize() + "\"]" +
" }" +
" }" +
" }" +
" ]}, " +
"\"#0\"" +
"]]")
.when()
.post("/jmap")
.then()
.statusCode(200);
String messageCreationId = "creationId1337";
String requestBody = "[[" +
" \"setMessages\"," +
" {" +
" \"create\": { \"" + messageCreationId + "\" : {" +
" \"from\": { \"name\": \"Me\", \"email\": \"" + BOB.asString() + "\"}," +
" \"to\": [{ \"name\": \"Alice\", \"email\": \"" + ALICE.asString() + "\"}]," +
" \"subject\": \"subject\"," +
" \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + "\"]" +
" }}" +
" }," +
" \"#0\"" +
"]]";
with()
.header("Authorization", bobAccessToken.asString())
.body(requestBody)
.post("/jmap");
calmlyAwait.until(
() -> JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, inbox));
assertThat(JmapCommonRequests.isAnyMessageFoundInRecipientsMailbox(accessToken, matchedMailbox)).isFalse();
}
}