JAMES-2340 Test SpamAssassin mailet with two recipients
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9a92600b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9a92600b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9a92600b Branch: refs/heads/master Commit: 9a92600b584ead6667c393c8d1ca255c6169b68c Parents: 34bd580 Author: Antoine Duprat <adup...@linagora.com> Authored: Thu Mar 15 08:48:22 2018 +0100 Committer: benwa <btell...@linagora.com> Committed: Tue Mar 27 15:17:37 2018 +0700 ---------------------------------------------------------------------- .../integration/SpamAssassinContract.java | 110 ++++++++++++++++--- 1 file changed, 94 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/9a92600b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SpamAssassinContract.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SpamAssassinContract.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SpamAssassinContract.java index 0cdfd3b..40f19df 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SpamAssassinContract.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SpamAssassinContract.java @@ -56,9 +56,11 @@ public interface SpamAssassinContract { String BOBS_DOMAIN = "spamer.com"; String BOB = "bob@" + BOBS_DOMAIN; String BOB_PASSWORD = "bobPassword"; - String ALICES_DOMAIN = "angels.org"; - String ALICE = "alice@" + ALICES_DOMAIN; + String RECIPIENTS_DOMAIN = "angels.org"; + String ALICE = "alice@" + RECIPIENTS_DOMAIN; String ALICE_PASSWORD = "alicePassword"; + String PAUL = "paul@" + RECIPIENTS_DOMAIN; + String PAUL_PASSWORD = "paulPassword"; String LOCALHOST = "127.0.0.1"; int IMAP_PORT = 1143; @@ -75,9 +77,10 @@ public interface SpamAssassinContract { RestAssured.defaultParser = Parser.JSON; james.getJmapServer().getProbe(DataProbeImpl.class).addDomain(BOBS_DOMAIN); - james.getJmapServer().getProbe(DataProbeImpl.class).addDomain(ALICES_DOMAIN); + james.getJmapServer().getProbe(DataProbeImpl.class).addDomain(RECIPIENTS_DOMAIN); james.getJmapServer().getProbe(DataProbeImpl.class).addUser(BOB, BOB_PASSWORD); james.getJmapServer().getProbe(DataProbeImpl.class).addUser(ALICE, ALICE_PASSWORD); + james.getJmapServer().getProbe(DataProbeImpl.class).addUser(PAUL, PAUL_PASSWORD); } default AccessToken accessTokenFor(GuiceJamesServer james, String user, String password) { @@ -552,32 +555,89 @@ public interface SpamAssassinContract { calmlyAwait.atMost(10, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(aliceAccessToken, getSpamId(aliceAccessToken), 1)); } - default boolean areMessagesFoundInMailbox(AccessToken accessToken, String mailboxId, int expectedNumberOfMessages) { - try { - with() - .header("Authorization", accessToken.serialize()) - .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + mailboxId + "\"]}}, \"#0\"]]") + default String setMessageCreate(AccessToken accessToken) { + return "[" + + " [" + + " \"setMessages\"," + + " {" + + " \"create\": { \"creationId1337\" : {" + + " \"from\": { \"email\": \"" + BOB + "\"}," + + " \"to\": [{ \"name\": \"recipient\", \"email\": \"" + ALICE + "\"}]," + + " \"subject\": \"Happy News\"," + + " \"textBody\": \"This is a SPAM!!!\r\n\r\n\"," + + " \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" + + " }}" + + " }," + + " \"#0\"" + + " ]" + + "]"; + } + + @Test + default void spamShouldBeDeliveredInSpamMailboxOrInboxWhenMultipleRecipientsConfigurations(JamesWithSpamAssassin james) throws Exception { + james.getSpamAssassinExtension().getSpamAssassin().train(ALICE); + AccessToken aliceAccessToken = accessTokenFor(james.getJmapServer(), ALICE, ALICE_PASSWORD); + AccessToken bobAccessToken = accessTokenFor(james.getJmapServer(), BOB, BOB_PASSWORD); + AccessToken paulAccessToken = accessTokenFor(james.getJmapServer(), PAUL, PAUL_PASSWORD); + + // Bob is sending a message to Alice & Paul + given() + .header("Authorization", bobAccessToken.serialize()) + .body(setMessageCreateToMultipleRecipients(bobAccessToken)) + .when() + .post("/jmap"); + calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(aliceAccessToken, getInboxId(aliceAccessToken), 1)); + calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(paulAccessToken, getInboxId(paulAccessToken), 1)); + + // Alice is moving this message to Spam -> learning in SpamAssassin + List<String> messageIds = with() + .header("Authorization", aliceAccessToken.serialize()) + .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + getInboxId(aliceAccessToken) + "\"]}}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", hasSize(1)) + .extract() + .path(ARGUMENTS + ".messageIds"); + + messageIds + .forEach(messageId -> given() + .header("Authorization", aliceAccessToken.serialize()) + .body(String.format("[[\"setMessages\", {\"update\": {\"%s\" : { \"mailboxIds\": [\"" + getSpamId(aliceAccessToken) + "\"] } } }, \"#0\"]]", messageId)) .when() .post("/jmap") .then() .statusCode(200) - .body(NAME, equalTo("messageList")) - .body(ARGUMENTS + ".messageIds", hasSize(expectedNumberOfMessages)); - return true; + .body(NAME, equalTo("messagesSet")) + .body(ARGUMENTS + ".updated", hasSize(1))); + calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(aliceAccessToken, getSpamId(aliceAccessToken), 1)); - } catch (AssertionError e) { - return false; - } + // Bob is sending again the same message to Alice & Paul + given() + .header("Authorization", bobAccessToken.serialize()) + .body(setMessageCreateToMultipleRecipients(bobAccessToken)) + .when() + .post("/jmap"); + + // This message is delivered in Alice Spam mailbox (she now must have 2 messages in her Spam mailbox) + calmlyAwait.atMost(10, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(aliceAccessToken, getSpamId(aliceAccessToken), 2)); + calmlyAwait.atMost(10, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(aliceAccessToken, getInboxId(aliceAccessToken), 0)); + // This message is delivered in Paul Inbox (he now must have 2 messages in his Inbox) + calmlyAwait.atMost(10, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(paulAccessToken, getInboxId(paulAccessToken), 2)); + calmlyAwait.atMost(10, TimeUnit.SECONDS).until(() -> areMessagesFoundInMailbox(paulAccessToken, getSpamId(paulAccessToken), 0)); } - default String setMessageCreate(AccessToken accessToken) { + default String setMessageCreateToMultipleRecipients(AccessToken accessToken) { return "[" + " [" + " \"setMessages\"," + " {" + " \"create\": { \"creationId1337\" : {" + " \"from\": { \"email\": \"" + BOB + "\"}," + - " \"to\": [{ \"name\": \"recipient\", \"email\": \"" + ALICE + "\"}]," + + " \"to\": [{ \"name\": \"alice\", \"email\": \"" + ALICE + "\"}, " + + " { \"name\": \"paul\", \"email\": \"" + PAUL + "\"}]," + " \"subject\": \"Happy News\"," + " \"textBody\": \"This is a SPAM!!!\r\n\r\n\"," + " \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" + @@ -588,6 +648,24 @@ public interface SpamAssassinContract { "]"; } + default boolean areMessagesFoundInMailbox(AccessToken accessToken, String mailboxId, int expectedNumberOfMessages) { + try { + with() + .header("Authorization", accessToken.serialize()) + .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + mailboxId + "\"]}}, \"#0\"]]") + .when() + .post("/jmap") + .then() + .statusCode(200) + .body(NAME, equalTo("messageList")) + .body(ARGUMENTS + ".messageIds", hasSize(expectedNumberOfMessages)); + return true; + + } catch (AssertionError e) { + return false; + } + } + default String getMailboxId(AccessToken accessToken, Role role) { return getAllMailboxesIds(accessToken).stream() .filter(x -> x.get("role").equalsIgnoreCase(role.serialize())) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org