JAMES-2340 SpamAssassin mailet should mark spam per recipient

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/34bd5809
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/34bd5809
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/34bd5809

Branch: refs/heads/master
Commit: 34bd580903d23a6347223f689c1766bce034fc57
Parents: b998c58
Author: Antoine Duprat <adup...@linagora.com>
Authored: Mon Mar 19 16:32:15 2018 +0100
Committer: benwa <btell...@linagora.com>
Committed: Tue Mar 27 15:17:37 2018 +0700

----------------------------------------------------------------------
 .../org/apache/mailet/PerRecipientHeaders.java  |  8 +-
 .../mailets/AddDeliveredToHeaderTest.java       | 26 +++---
 .../james/mailets/configuration/Constants.java  |  1 +
 .../transport/mailets/SpamAssassinTest.java     | 48 +++++++---
 .../james/transport/mailets/SpamAssassin.java   |  8 +-
 .../transport/matchers/IsMarkedAsSpam.java      | 26 +++---
 .../transport/mailets/SpamAssassinTest.java     | 52 +++++++++--
 .../transport/matchers/IsMarkedAsSpamTest.java  | 94 +++++++++++++-------
 .../apache/james/utils/IMAPMessageReader.java   |  5 ++
 9 files changed, 183 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java
----------------------------------------------------------------------
diff --git 
a/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java 
b/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java
index cb3fce7..4e0a434 100644
--- a/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java
+++ b/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java
@@ -59,8 +59,14 @@ public class PerRecipientHeaders implements Serializable {
             .collect(Guavate.toImmutableSet());
     }
 
-    public void addHeaderForRecipient(Header header, MailAddress recipient) {
+    public PerRecipientHeaders addHeaderForRecipient(Header header, 
MailAddress recipient) {
         headersByRecipient.put(recipient, header);
+        return this;
+    }
+
+    public PerRecipientHeaders addHeaderForRecipient(Header.Builder header, 
MailAddress recipient) {
+        headersByRecipient.put(recipient, header.build());
+        return this;
     }
 
     public void addAll(PerRecipientHeaders other) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java
----------------------------------------------------------------------
diff --git 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java
 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java
index 168df21..76a3320 100644
--- 
a/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java
+++ 
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java
@@ -60,19 +60,19 @@ public class AddDeliveredToHeaderTest {
 
         testee.service(mail);
 
-        PerRecipientHeaders expectedResult = new PerRecipientHeaders();
-        expectedResult.addHeaderForRecipient(
-            PerRecipientHeaders.Header.builder()
-                .name(AddDeliveredToHeader.DELIVERED_TO)
-                .value(MailAddressFixture.ANY_AT_JAMES.asString())
-                .build(),
-            MailAddressFixture.ANY_AT_JAMES);
-        expectedResult.addHeaderForRecipient(
-            PerRecipientHeaders.Header.builder()
-                .name(AddDeliveredToHeader.DELIVERED_TO)
-                .value(MailAddressFixture.OTHER_AT_JAMES.asString())
-                .build(),
-            MailAddressFixture.OTHER_AT_JAMES);
+        PerRecipientHeaders expectedResult = new PerRecipientHeaders()
+            .addHeaderForRecipient(
+                PerRecipientHeaders.Header.builder()
+                    .name(AddDeliveredToHeader.DELIVERED_TO)
+                    .value(MailAddressFixture.ANY_AT_JAMES.asString())
+                    .build(),
+                MailAddressFixture.ANY_AT_JAMES)
+            .addHeaderForRecipient(
+                PerRecipientHeaders.Header.builder()
+                    .name(AddDeliveredToHeader.DELIVERED_TO)
+                    .value(MailAddressFixture.OTHER_AT_JAMES.asString())
+                    .build(),
+                MailAddressFixture.OTHER_AT_JAMES);
 
         assertThat(mail.getPerRecipientSpecificHeaders())
             .isEqualTo(expectedResult);

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java
index 0bdfb82..5eae0e7 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java
@@ -43,4 +43,5 @@ public class Constants {
     public static final String PASSWORD = "secret";
     public static final String FROM = "user@" + DEFAULT_DOMAIN;
     public static final String RECIPIENT = "user2@" + DEFAULT_DOMAIN;
+    public static final String RECIPIENT2 = "user3@" + DEFAULT_DOMAIN;
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 3eb88bc..970fe48 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -25,6 +25,7 @@ import static 
org.apache.james.mailets.configuration.Constants.IMAP_PORT;
 import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
 import static org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.RECIPIENT;
+import static org.apache.james.mailets.configuration.Constants.RECIPIENT2;
 import static org.apache.james.mailets.configuration.Constants.SMTP_PORT;
 import static 
org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -78,12 +79,6 @@ public class SpamAssassinTest {
                         .matcher(All.class)
                         .mailet(SpamAssassin.class)
                         .addProperty(SpamAssassin.SPAMD_HOST, 
spamAssassinContainer.getContainerIp()))
-                    .addMailet(MailetConfiguration.builder()
-                        .matcher(All.class)
-                        .mailet(MailAttributesToMimeHeaders.class)
-                        .addProperty("simplemapping",
-                            SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME + ";" 
+ SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME + "," +
-                                SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME 
+ ";" + SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME))
                     .addMailetsFrom(CommonProcessors.deliverOnlyTransport()));
 
         jamesServer = TemporaryJamesServer.builder()
@@ -95,6 +90,7 @@ public class SpamAssassinTest {
         probe.addDomain(DEFAULT_DOMAIN);
         probe.addUser(FROM, PASSWORD);
         probe.addUser(RECIPIENT, PASSWORD);
+        probe.addUser(RECIPIENT2, PASSWORD);
     }
 
     @After
@@ -105,7 +101,7 @@ public class SpamAssassinTest {
     @Test
     public void spamAssassinShouldAppendNewHeaderOnMessage() throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(mailWithContent("This is the content"))
+            .sendMessage(mailWithContent("This is the content", RECIPIENT))
             .awaitSent(awaitAtMostOneMinute);
 
         messageReader.connect(LOCALHOST_IP, IMAP_PORT)
@@ -122,7 +118,7 @@ public class SpamAssassinTest {
     @Test
     public void 
spamAssassinShouldAppendNewHeaderWhichDetectIsSpamWhenSpamMessage() throws 
Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(mailWithContent(SPAM_CONTENT))
+            .sendMessage(mailWithContent(SPAM_CONTENT, RECIPIENT))
             .awaitSent(awaitAtMostOneMinute);
 
         messageReader.connect(LOCALHOST_IP, IMAP_PORT)
@@ -138,7 +134,7 @@ public class SpamAssassinTest {
     @Test
     public void spamAssassinShouldAppendNewHeaderWhichNoWhenNonSpamMessage() 
throws Exception {
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
-            .sendMessage(mailWithContent("This is the content"))
+            .sendMessage(mailWithContent("This is the content", RECIPIENT))
             .awaitSent(awaitAtMostOneMinute);
 
         messageReader.connect(LOCALHOST_IP, IMAP_PORT)
@@ -151,14 +147,42 @@ public class SpamAssassinTest {
         
assertThat(receivedHeaders).contains(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME
 + ": No");
     }
 
-    private FakeMail.Builder mailWithContent(String textContent) throws 
MessagingException {
+    @Test
+    public void spamAssassinShouldAppendNewHeaderPerRecipientOnMessage() 
throws Exception {
+        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+            .sendMessage(mailWithContent("This is the content", RECIPIENT, 
RECIPIENT2))
+            .awaitSent(awaitAtMostOneMinute);
+
+        messageReader.connect(LOCALHOST_IP, IMAP_PORT)
+            .login(RECIPIENT, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .awaitMessage(awaitAtMostOneMinute);
+
+        assertThat(messageReader.readFirstMessageHeaders())
+            .contains(
+                SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME,
+                SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME);
+
+        messageReader.disconnect()
+            .connect(LOCALHOST_IP, IMAP_PORT)
+            .login(RECIPIENT2, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .awaitMessage(awaitAtMostOneMinute);
+
+        assertThat(messageReader.readFirstMessageHeaders())
+            .contains(
+                SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME,
+                SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME);
+    }
+
+    private FakeMail.Builder mailWithContent(String textContent, String... 
recipients) throws MessagingException {
         return FakeMail.builder()
             .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
                 .setSender(FROM)
-                .addToRecipient(RECIPIENT)
+                .addToRecipient(recipients)
                 .setSubject("This is the subject")
                 .setText(textContent))
             .sender(FROM)
-            .recipient(RECIPIENT);
+            .recipients(recipients);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index 6112cb3..e704497 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -33,6 +33,7 @@ import org.apache.james.util.Port;
 import org.apache.james.util.scanner.SpamAssassinInvoker;
 import org.apache.james.util.scanner.SpamAssassinResult;
 import org.apache.mailet.Mail;
+import org.apache.mailet.PerRecipientHeaders;
 import org.apache.mailet.base.GenericMailet;
 import org.apache.mailet.base.MailetUtil;
 
@@ -107,9 +108,12 @@ public class SpamAssassin extends GenericMailet {
     private void querySpamAssassin(Mail mail, MimeMessage message, 
SpamAssassinInvoker sa, MailAddress recipient) throws MessagingException, 
UsersRepositoryException {
         SpamAssassinResult result = sa.scanMail(message, 
usersRepository.getUser(recipient));
 
-        // Add headers as attribute to mail object
+        // Add headers per recipient to mail object
         for (String key : result.getHeadersAsAttribute().keySet()) {
-            mail.setAttribute(key, result.getHeadersAsAttribute().get(key));
+            
mail.addSpecificHeaderForRecipient(PerRecipientHeaders.Header.builder()
+                    .name(key)
+                    .value(result.getHeadersAsAttribute().get(key))
+                    .build(), recipient);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java
index 252f53b..bbea0c9 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.transport.matchers;
 
-import java.io.Serializable;
 import java.util.Collection;
 import java.util.Locale;
 
@@ -30,11 +29,11 @@ import org.apache.james.util.scanner.SpamAssassinResult;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMatcher;
 
-import com.google.common.collect.ImmutableList;
+import com.github.steveash.guavate.Guavate;
 
 /**
  * <p>
- * Matches mails having a <pre>org.apache.james.spamassassin.status</pre> 
attribute with a <pre>Yes</pre> value.
+ * Matches mails having a <pre>org.apache.james.spamassassin.status</pre> per 
recipient header with a <pre>Yes</pre> value.
  * </p>
  * 
  * As an example, here is a part of a mailet pipeline which can be used in 
your LocalDelivery processor:
@@ -57,7 +56,7 @@ public class IsMarkedAsSpam extends GenericMatcher {
 
     @Override
     public String getMatcherInfo() {
-        return "Has org.apache.james.spamassassin.status attribute with a Yes 
value Matcher";
+        return "Has org.apache.james.spamassassin.status per recipient header 
with a Yes value";
     }
 
     @Override
@@ -66,18 +65,17 @@ public class IsMarkedAsSpam extends GenericMatcher {
 
     @Override
     public Collection<MailAddress> match(Mail mail) {
-        Serializable attribute = 
mail.getAttribute(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME);
-        if (isMarkedAsSpam(attribute)) {
-            return mail.getRecipients();
-        }
-        return ImmutableList.of();
+        return mail.getRecipients()
+            .stream()
+            .filter(recipient -> isMarkedAsSpam(mail, recipient))
+            .collect(Guavate.toImmutableList());
     }
 
-    private boolean isMarkedAsSpam(Serializable attribute) {
-        return attribute instanceof String &&
-            ((String) attribute)
-                    .toLowerCase(Locale.US)
-                    .startsWith(YES);
+    public boolean isMarkedAsSpam(Mail mail, MailAddress recipient) {
+        return 
mail.getPerRecipientSpecificHeaders().getHeadersForRecipient(recipient)
+            .stream()
+            .filter(header -> 
header.getName().equals(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME))
+            .anyMatch(header -> 
header.getValue().toLowerCase(Locale.US).startsWith(YES));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
index 466ad0c..81f9674 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java
@@ -24,6 +24,7 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.user.memory.MemoryUsersRepository;
@@ -32,11 +33,14 @@ import org.apache.james.util.scanner.SpamAssassinResult;
 import org.apache.james.utils.MockSpamd;
 import org.apache.james.utils.MockSpamdTestRule;
 import org.apache.mailet.Mail;
+import org.apache.mailet.PerRecipientHeaders;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.junit.Rule;
 import org.junit.Test;
 
+import com.github.steveash.guavate.Guavate;
+
 public class SpamAssassinTest {
 
     @Rule
@@ -93,7 +97,7 @@ public class SpamAssassinTest {
     }
 
     @Test
-    public void initShouldThrowWhenSpamdPortIsNotNumber() throws Exception {
+    public void initShouldThrowWhenSpamdPortIsNotNumber() {
         assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_PORT, "noNumber")
@@ -101,7 +105,7 @@ public class SpamAssassinTest {
     }
 
     @Test
-    public void initShouldThrowWhenSpamdPortIsNegative() throws Exception {
+    public void initShouldThrowWhenSpamdPortIsNegative() {
         assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_PORT, "-1")
@@ -109,7 +113,7 @@ public class SpamAssassinTest {
     }
 
     @Test
-    public void initShouldThrowWhenSpamdPortIsZero() throws Exception {
+    public void initShouldThrowWhenSpamdPortIsZero() {
         assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_PORT, "0")
@@ -117,7 +121,7 @@ public class SpamAssassinTest {
     }
 
     @Test
-    public void initShouldThrowWhenSpamdPortTooBig() throws Exception {
+    public void initShouldThrowWhenSpamdPortTooBig() {
         assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder()
             .mailetName("SpamAssassin")
             .setProperty(SpamAssassin.SPAMD_PORT,
@@ -157,8 +161,16 @@ public class SpamAssassinTest {
 
         mailet.service(mail);
 
-        assertThat(mail.getAttributeNames())
-            .containsOnly(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, 
SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME);
+
+
+        assertThat(
+            mail.getPerRecipientSpecificHeaders()
+                .getHeadersByRecipient()
+                .get(new MailAddress("us...@exemple.com"))
+                .stream()
+                .map(PerRecipientHeaders.Header::getName)
+                .collect(Guavate.toImmutableList()))
+            .contains(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, 
SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME);
     }
 
     @Test
@@ -182,7 +194,18 @@ public class SpamAssassinTest {
 
         mailet.service(mail);
 
-        
assertThat(mail.getAttribute(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("NO");
+        assertThat(mail.getPerRecipientSpecificHeaders())
+            .isEqualTo(new PerRecipientHeaders()
+                .addHeaderForRecipient(
+                    PerRecipientHeaders.Header.builder()
+                        .name(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)
+                        .value("NO"),
+                    new MailAddress("us...@exemple.com"))
+                .addHeaderForRecipient(
+                    PerRecipientHeaders.Header.builder()
+                        .name(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME)
+                        .value("No, hits=3 required=5"),
+                    new MailAddress("us...@exemple.com")));
     }
 
     @Test
@@ -206,11 +229,22 @@ public class SpamAssassinTest {
 
         mailet.service(mail);
 
-        
assertThat(mail.getAttribute(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("YES");
+        assertThat(mail.getPerRecipientSpecificHeaders())
+            .isEqualTo(new PerRecipientHeaders()
+                .addHeaderForRecipient(
+                    PerRecipientHeaders.Header.builder()
+                        .name(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)
+                        .value("YES"),
+                    new MailAddress("us...@exemple.com"))
+                .addHeaderForRecipient(
+                    PerRecipientHeaders.Header.builder()
+                        .name(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME)
+                        .value("Yes, hits=1000 required=5"),
+                    new MailAddress("us...@exemple.com")));
     }
 
     @Test
-    public void getMailetInfoShouldReturnSpamAssasinMailetInformation() throws 
Exception {
+    public void getMailetInfoShouldReturnSpamAssasinMailetInformation() {
         assertThat(mailet.getMailetInfo()).isEqualTo("Checks message against 
SpamAssassin");
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java
index a33f763..825384a 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Collection;
 
 import org.apache.james.core.MailAddress;
+import org.apache.mailet.PerRecipientHeaders;
 import org.apache.mailet.base.test.FakeMail;
 import org.junit.Before;
 import org.junit.Test;
@@ -39,81 +40,106 @@ public class IsMarkedAsSpamTest {
     @Test
     public void isMarkedAsSpamShouldNotMatchWhenNoHeader() throws Exception {
         FakeMail mail = FakeMail.builder()
-                .sender("sen...@james.org")
-                .recipient("t...@james.org")
-                .build();
+            .sender("sen...@james.org")
+            .recipient("t...@james.org")
+            .build();
 
         Collection<MailAddress> matches = matcher.match(mail);
         assertThat(matches).isEmpty();
     }
 
     @Test
-    public void isMarkedAsSpamShouldNotMatchWhenHeaderButNullValue() throws 
Exception {
+    public void isMarkedAsSpamShouldNotMatchWhenHeaderButEmptyValue() throws 
Exception {
         FakeMail mail = FakeMail.builder()
-                .sender("sen...@james.org")
-                .recipient("t...@james.org")
-                .attribute("org.apache.james.spamassassin.status", null)
-                .build();
+            .sender("sen...@james.org")
+            .recipient("t...@james.org")
+            .addHeaderForRecipient(PerRecipientHeaders.Header.builder()
+                    .name("org.apache.james.spamassassin.status")
+                    .value("other")
+                    .build(),
+                new MailAddress("t...@james.org"))
+            .build();
 
         Collection<MailAddress> matches = matcher.match(mail);
         assertThat(matches).isEmpty();
     }
 
     @Test
-    public void isMarkedAsSpamShouldNotMatchWhenHeaderButEmptyValue() throws 
Exception {
+    public void isMarkedAsSpamShouldNotMatchWhenHeaderButOtherValue() throws 
Exception {
         FakeMail mail = FakeMail.builder()
-                .sender("sen...@james.org")
-                .recipient("t...@james.org")
-                .attribute("org.apache.james.spamassassin.status", "")
-                .build();
+            .sender("sen...@james.org")
+            .recipient("t...@james.org")
+            .addHeaderForRecipient(PerRecipientHeaders.Header.builder()
+                    .name("org.apache.james.spamassassin.status")
+                    .value("other")
+                    .build(),
+                new MailAddress("t...@james.org"))
+            .build();
 
         Collection<MailAddress> matches = matcher.match(mail);
         assertThat(matches).isEmpty();
     }
 
     @Test
-    public void isMarkedAsSpamShouldNotMatchWhenHeaderButOtherValue() throws 
Exception {
+    public void isMarkedAsSpamShouldNotMatchWhenHeaderButNoValue() throws 
Exception {
         FakeMail mail = FakeMail.builder()
-                .sender("sen...@james.org")
-                .recipient("t...@james.org")
-                .attribute("org.apache.james.spamassassin.status", "other")
-                .build();
+            .sender("sen...@james.org")
+            .recipient("t...@james.org")
+            .addHeaderForRecipient(PerRecipientHeaders.Header.builder()
+                    .name("org.apache.james.spamassassin.status")
+                    .value("No, hits=1.8 required=5.0")
+                    .build(),
+                new MailAddress("t...@james.org"))
+            .build();
 
         Collection<MailAddress> matches = matcher.match(mail);
         assertThat(matches).isEmpty();
     }
 
     @Test
-    public void isMarkedAsSpamShouldNotMatchWhenHeaderButNoValue() throws 
Exception {
+    public void isMarkedAsSpamShouldMatchWhenHeaderAndYesValue() throws 
Exception {
         FakeMail mail = FakeMail.builder()
-                .sender("sen...@james.org")
-                .recipient("t...@james.org")
-                .attribute("org.apache.james.spamassassin.status", "No, 
hits=1.8 required=5.0")
-                .build();
+            .sender("sen...@james.org")
+            .recipient("t...@james.org")
+            .addHeaderForRecipient(PerRecipientHeaders.Header.builder()
+                    .name("org.apache.james.spamassassin.status")
+                    .value("Yes, hits=6.8 required=5.0")
+                    .build(),
+                new MailAddress("t...@james.org"))
+            .attribute("org.apache.james.spamassassin.status", "Yes, hits=6.8 
required=5.0")
+            .build();
 
         Collection<MailAddress> matches = matcher.match(mail);
-        assertThat(matches).isEmpty();
+        assertThat(matches).contains(new MailAddress("t...@james.org"));
     }
 
     @Test
-    public void isMarkedAsSpamShouldMatchWhenHeaderAndYesValue() throws 
Exception {
+    public void isMarkedAsSpamShouldMatchOnlyRecipientsWithHeaderAndYesValue() 
throws Exception {
         FakeMail mail = FakeMail.builder()
-                .sender("sen...@james.org")
-                .recipient("t...@james.org")
-                .attribute("org.apache.james.spamassassin.status", "Yes, 
hits=6.8 required=5.0")
-                .build();
+            .sender("sen...@james.org")
+            .recipients("t...@james.org", "t...@james.org")
+            .addHeaderForRecipient(PerRecipientHeaders.Header.builder()
+                    .name("org.apache.james.spamassassin.status")
+                    .value("Yes, hits=6.8 required=5.0")
+                    .build(),
+                new MailAddress("t...@james.org"))
+            .build();
 
         Collection<MailAddress> matches = matcher.match(mail);
-        assertThat(matches).contains(new MailAddress("t...@james.org"));
+        assertThat(matches).contains(new MailAddress("t...@james.org"));
     }
 
     @Test
     public void isMarkedAsSpamShouldMatchWhenHeaderAndYesValueInOtherCase() 
throws Exception {
         FakeMail mail = FakeMail.builder()
-                .sender("sen...@james.org")
-                .recipient("t...@james.org")
-                .attribute("org.apache.james.spamassassin.status", "YES, 
hits=6.8 required=5.0")
-                .build();
+            .sender("sen...@james.org")
+            .recipient("t...@james.org")
+            .addHeaderForRecipient(PerRecipientHeaders.Header.builder()
+                    .name("org.apache.james.spamassassin.status")
+                    .value("YES, hits=6.8 required=5.0")
+                    .build(),
+                new MailAddress("t...@james.org"))
+            .build();
 
         Collection<MailAddress> matches = matcher.match(mail);
         assertThat(matches).contains(new MailAddress("t...@james.org"));

http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java
----------------------------------------------------------------------
diff --git 
a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java 
b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java
index 5912cf3..071c8a8 100644
--- a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java
+++ b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java
@@ -51,6 +51,11 @@ public class IMAPMessageReader extends ExternalResource 
implements Closeable {
         return this;
     }
 
+    public IMAPMessageReader disconnect() throws IOException {
+        imapClient.disconnect();
+        return this;
+    }
+
     public IMAPMessageReader login(String user, String password) throws 
IOException {
         imapClient.login(user, password);
         return this;


---------------------------------------------------------------------
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