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

Reply via email to