You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2020/12/30 03:35:13 UTC

[james-project] 01/29: JAMES-3431 Mock SMTP server ReceivedMailRepository should keep ESMTP parameters as part of the envelope

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e4f5612bc3f1bec4b0bffd757444f12e65b28715
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Dec 23 11:01:30 2020 +0700

    JAMES-3431 Mock SMTP server ReceivedMailRepository should keep ESMTP parameters as part of the envelope
    
    We modified the JSON format used to describe a mail envelope.
---
 .../james/mailets/RemoteDeliveryErrorTest.java     |   6 +-
 .../james/mock/smtp/server/MockMessageHandler.java |   2 +-
 .../apache/james/mock/smtp/server/model/Mail.java  | 217 +++++++++++++++++++--
 .../org/apache/james/mock/smtp/server/Fixture.java |  75 +++++--
 .../smtp/server/HTTPConfigurationServerTest.java   |  34 +++-
 .../james/mock/smtp/server/MockSMTPServerTest.java |   4 +-
 .../smtp/server/ReceivedMailRepositoryTest.java    |   8 +-
 .../james/mock/smtp/server/model/MailTest.java     |  21 +-
 .../james/mock/smtp/server/model/MailsTest.java    | 103 +++++++++-
 9 files changed, 410 insertions(+), 60 deletions(-)

diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryErrorTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryErrorTest.java
index 20afca4..a729062 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryErrorTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryErrorTest.java
@@ -124,9 +124,9 @@ public class RemoteDeliveryErrorTest {
         RECIPIENT1_ADDRESS = new MailAddress(RECIPIENT1);
         RECIPIENT2_ADDRESS = new MailAddress(RECIPIENT2);
 
-        FROM_RECIPIENT_ENVELOPE = new Mail.Envelope(FROM_ADDRESS, RECIPIENT_ADDRESS);
-        FROM_RECIPIENT1_ENVELOPE = new Mail.Envelope(FROM_ADDRESS, RECIPIENT1_ADDRESS);
-        FROM_RECIPIENT2_ENVELOPE = new Mail.Envelope(FROM_ADDRESS, RECIPIENT2_ADDRESS);
+        FROM_RECIPIENT_ENVELOPE = Mail.Envelope.ofAddresses(FROM_ADDRESS, RECIPIENT_ADDRESS);
+        FROM_RECIPIENT1_ENVELOPE = Mail.Envelope.ofAddresses(FROM_ADDRESS, RECIPIENT1_ADDRESS);
+        FROM_RECIPIENT2_ENVELOPE = Mail.Envelope.ofAddresses(FROM_ADDRESS, RECIPIENT2_ADDRESS);
     }
 
     @Before
diff --git a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java
index 10a09ec..b0372cb 100644
--- a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java
+++ b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java
@@ -124,7 +124,7 @@ public class MockMessageHandler implements MessageHandler {
         Optional<Behavior<MailAddress>> recipientBehavior = firstMatchedBehavior(SMTPCommand.RCPT_TO, recipient);
 
         recipientBehavior
-            .orElseGet(() -> envelopeBuilder::addRecipient)
+            .orElseGet(() -> envelopeBuilder::addRecipientMailAddress)
             .behave(parse(recipient));
     }
 
diff --git a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Mail.java b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Mail.java
index 2c1cb6a..c2e5d3a 100644
--- a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Mail.java
+++ b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Mail.java
@@ -20,20 +20,178 @@
 package org.apache.james.mock.smtp.server.model;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Stream;
 
 import org.apache.james.core.MailAddress;
 
 import com.fasterxml.jackson.annotation.JsonUnwrapped;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.github.steveash.guavate.Guavate;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 @JsonDeserialize(builder = Mail.Builder.class)
 public class Mail {
+    @JsonDeserialize(builder = Parameter.Builder.class)
+    public static class Parameter {
+        @JsonPOJOBuilder(withPrefix = "")
+        public static class Builder {
+            private String name;
+            private String value;
+
+            public Builder() {
+
+            }
+
+            public Builder name(String name) {
+                this.name = name;
+                return this;
+            }
+
+            public Builder value(String value) {
+                this.value = value;
+                return this;
+            }
+
+            public Parameter build() {
+                Preconditions.checkState(name != null, "'name' field cannot be omitted");
+                Preconditions.checkState(value != null, "'value' field cannot be omitted");
+
+                return new Parameter(name, value);
+            }
+        }
+
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        private final String name;
+        private final String value;
+
+        private Parameter(String name, String value) {
+            this.name = name;
+            this.value = value;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof Parameter) {
+                Parameter that = (Parameter) o;
+
+                return Objects.equals(this.name, that.name)
+                    && Objects.equals(this.value, that.value);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(name, value);
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("name", name)
+                .add("value", value)
+                .toString();
+        }
+    }
+
+    @JsonDeserialize(builder = Recipient.Builder.class)
+    public static class Recipient {
+        @JsonPOJOBuilder(withPrefix = "")
+        public static class Builder {
+            private MailAddress address;
+            private ImmutableList.Builder<Parameter> parameters;
+
+            public Builder() {
+                parameters = new ImmutableList.Builder<>();
+            }
+
+            public Builder address(MailAddress address) {
+                this.address = address;
+                return this;
+            }
+
+            public Builder addParameter(Parameter parameter) {
+                this.parameters.add(parameter);
+                return this;
+            }
+
+            public Builder parameters(Collection<Parameter> parameters) {
+                this.parameters.addAll(parameters);
+                return this;
+            }
+
+            public Recipient build() {
+                Preconditions.checkState(address != null, "'address' field cannot be omitted");
+
+                return new Recipient(address, parameters.build());
+            }
+        }
+
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        public static Recipient of(MailAddress address) {
+            return new Recipient(address, ImmutableList.of());
+        }
+
+        private final MailAddress address;
+        private final List<Parameter> parameters;
+
+        private Recipient(MailAddress address, List<Parameter> parameters) {
+            this.address = address;
+            this.parameters = parameters;
+        }
+
+        public MailAddress getAddress() {
+            return address;
+        }
+
+        public List<Parameter> getParameters() {
+            return parameters;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof Recipient) {
+                Recipient that = (Recipient) o;
+
+                return Objects.equals(this.address, that.address)
+                    && Objects.equals(this.parameters, that.parameters);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(address, parameters);
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("address", address)
+                .add("parameters", parameters)
+                .toString();
+        }
+    }
 
     @JsonDeserialize(builder = Mail.Envelope.Builder.class)
     public static class Envelope {
@@ -41,10 +199,12 @@ public class Mail {
         @JsonPOJOBuilder(withPrefix = "")
         public static class Builder {
             private MailAddress from;
-            private ImmutableList.Builder<MailAddress> recipients;
+            private ImmutableList.Builder<Recipient> recipients;
+            private ImmutableList.Builder<Parameter> mailParameters;
 
             public Builder() {
                 recipients = new ImmutableList.Builder<>();
+                mailParameters = new ImmutableList.Builder<>();
             }
 
             public Builder from(MailAddress from) {
@@ -52,29 +212,56 @@ public class Mail {
                 return this;
             }
 
-            public Builder addRecipient(MailAddress recipient) {
+            public Builder addRecipientMailAddress(MailAddress mailAddress) {
+                this.recipients.add(Recipient.of(mailAddress));
+                return this;
+            }
+
+            public Builder addMailParameter(Parameter parameter) {
+                this.mailParameters.add(parameter);
+                return this;
+            }
+
+            public Builder mailParameters(Collection<Parameter> parameters) {
+                this.mailParameters.addAll(parameters);
+                return this;
+            }
+
+            public Builder addRecipient(Recipient recipient) {
                 this.recipients.add(recipient);
                 return this;
             }
 
-            public Builder recipients(List<MailAddress> recipients) {
+            public Builder recipients(List<Recipient> recipients) {
                 this.recipients.addAll(recipients);
                 return this;
             }
 
             public Envelope build() {
-                return new Envelope(from, recipients.build());
+                return new Envelope(from, recipients.build(), mailParameters.build());
             }
         }
 
-        private final MailAddress from;
-        private final List<MailAddress> recipients;
+        public static Builder builder() {
+            return new Builder();
+        }
 
-        public Envelope(MailAddress from, MailAddress... recipients) {
-            this(from, ImmutableList.copyOf(Arrays.asList(recipients)));
+        public static Envelope ofAddresses(MailAddress from, MailAddress... recipients) {
+            return new Envelope(from, Stream.of(recipients)
+                .map(Recipient::of)
+                .collect(Guavate.toImmutableList()), ImmutableList.of());
         }
 
-        public Envelope(MailAddress from, List<MailAddress> recipients) {
+        public static Envelope of(MailAddress from, Recipient... recipients) {
+            return new Envelope(from, ImmutableList.copyOf(Arrays.asList(recipients)), ImmutableList.of());
+        }
+
+        private final MailAddress from;
+        private final List<Recipient> recipients;
+        private final List<Parameter> mailParameters;
+
+        private Envelope(MailAddress from, List<Recipient> recipients, List<Parameter> mailParameters) {
+            this.mailParameters = mailParameters;
             Preconditions.checkNotNull(from);
             Preconditions.checkNotNull(recipients);
             Preconditions.checkArgument(!recipients.isEmpty(), "'recipients' field should not be empty");
@@ -87,24 +274,29 @@ public class Mail {
             return from;
         }
 
-        public List<MailAddress> getRecipients() {
+        public List<Recipient> getRecipients() {
             return recipients;
         }
 
+        public List<Parameter> getMailParameters() {
+            return mailParameters;
+        }
+
         @Override
         public final boolean equals(Object o) {
             if (o instanceof Envelope) {
                 Envelope envelope = (Envelope) o;
 
                 return Objects.equals(this.from, envelope.from)
-                    && Objects.equals(this.recipients, envelope.recipients);
+                    && Objects.equals(this.recipients, envelope.recipients)
+                    && Objects.equals(this.mailParameters, envelope.mailParameters);
             }
             return false;
         }
 
         @Override
         public final int hashCode() {
-            return Objects.hash(from, recipients);
+            return Objects.hash(from, recipients, mailParameters);
         }
 
         @Override
@@ -112,6 +304,7 @@ public class Mail {
             return MoreObjects.toStringHelper(this)
                 .add("from", from)
                 .add("recipients", recipients)
+                .add("mailParameters", mailParameters)
                 .toString();
         }
     }
diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/Fixture.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/Fixture.java
index 1646bea..e08b77d 100644
--- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/Fixture.java
+++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/Fixture.java
@@ -43,13 +43,30 @@ public interface Fixture {
         static {
             try {
                 MAIL_1 = new Mail(
-                new Mail.Envelope(
-                    new MailAddress(BOB), new MailAddress(ALICE), new MailAddress(JACK)),
-                "bob to alice and jack");
+                    Mail.Envelope.builder()
+                        .from(new MailAddress(BOB))
+                        .addRecipientMailAddress(new MailAddress(ALICE))
+                        .addRecipient(Mail.Recipient.builder()
+                            .address(new MailAddress(JACK))
+                            .addParameter(Mail.Parameter.builder()
+                                .name("param1")
+                                .value("value1")
+                                .build())
+                            .addParameter(Mail.Parameter.builder()
+                                .name("param2")
+                                .value("value2")
+                                .build())
+                            .build())
+                        .addMailParameter(Mail.Parameter.builder()
+                            .name("param3")
+                            .value("value3")
+                            .build())
+                        .build(),
+                    "bob to alice and jack");
 
                 MAIL_2 = new Mail(
-                new Mail.Envelope(
-                    new MailAddress(ALICE), new MailAddress(BOB)),
+                    Mail.Envelope.ofAddresses(
+                        new MailAddress(ALICE), new MailAddress(BOB)),
                 "alice to bob");
             } catch (Exception e) {
                 throw new RuntimeException(e);
@@ -119,10 +136,46 @@ public interface Fixture {
         BEHAVIOR_COMPULSORY_FIELDS);
     MockSmtpBehaviors BEHAVIORS = new MockSmtpBehaviors(BEHAVIOR_LIST);
 
-    String JSON_MAILS_LIST = "[" +
-        "  {\"from\":\"bob@james.org\",\"recipients\":[\"alice@james.org\", \"jack@james.org\"],\"message\":\"bob to alice and jack\"}," +
-        "  {\"from\":\"alice@james.org\",\"recipients\":[\"bob@james.org\"],\"message\":\"alice to bob\"}" +
-        "]";
-
-    String JSON_MAIL = "[{\"from\":\"bob@james.org\",\"recipients\":[\"alice@james.org\", \"jack@james.org\"],\"message\":\"bob to alice and jack\"}]";
+    String JSON_MAILS_LIST = "[{" +
+        "  \"from\": \"bob@james.org\"," +
+        "  \"recipients\": [{" +
+        "    \"address\": \"alice@james.org\"," +
+        "    \"parameters\": []" +
+        "  }, {" +
+        "    \"address\": \"jack@james.org\"," +
+        "    \"parameters\": []" +
+        "  }]," +
+        "  \"mailParameters\": []," +
+        "  \"message\": \"bob to alice and jack\"" +
+        "}, {" +
+        "  \"from\": \"alice@james.org\"," +
+        "  \"recipients\": [{" +
+        "    \"address\": \"bob@james.org\"," +
+        "    \"parameters\": []" +
+        "  }]," +
+        "  \"mailParameters\": []," +
+        "  \"message\": \"alice to bob\"" +
+        "}]";
+
+    String JSON_MAIL = "[{" +
+        "    \"from\": \"bob@james.org\"," +
+        "    \"mailParameters\": [{" +
+        "        \"name\": \"param3\"," +
+        "        \"value\": \"value3\"" +
+        "    }]," +
+        "    \"message\": \"bob to alice and jack\"," +
+        "    \"recipients\": [{" +
+        "        \"address\": \"alice@james.org\"," +
+        "        \"parameters\": []" +
+        "    }, {" +
+        "        \"address\": \"jack@james.org\"," +
+        "        \"parameters\": [{" +
+        "            \"name\": \"param1\"," +
+        "            \"value\": \"value1\"" +
+        "        }, {" +
+        "            \"name\": \"param2\"," +
+        "            \"value\": \"value2\"" +
+        "        }]" +
+        "    }]" +
+        "}]";
 }
diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/HTTPConfigurationServerTest.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/HTTPConfigurationServerTest.java
index 4bb0edd..b94a27f 100644
--- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/HTTPConfigurationServerTest.java
+++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/HTTPConfigurationServerTest.java
@@ -177,7 +177,7 @@ class HTTPConfigurationServerTest {
             mailRepository.store(MailsFixutre.MAIL_1);
 
             String response = when()
-                    .get()
+                    .get().prettyPeek()
                 .then()
                     .contentType(ContentType.JSON)
                     .extract()
@@ -194,7 +194,7 @@ class HTTPConfigurationServerTest {
             mailRepository.store(MailsFixutre.MAIL_2);
 
             String response = when()
-                    .get()
+                    .get().prettyPeek()
                 .then()
                     .contentType(ContentType.JSON)
                     .extract()
@@ -202,7 +202,35 @@ class HTTPConfigurationServerTest {
 
             assertThatJson(response)
                 .withOptions(new Options(Option.TREATING_NULL_AS_ABSENT, Option.IGNORING_ARRAY_ORDER))
-                .isEqualTo(JSON_MAILS_LIST);
+                .isEqualTo("[{" +
+                    "    \"from\": \"bob@james.org\"," +
+                    "    \"mailParameters\": [{" +
+                    "        \"name\": \"param3\"," +
+                    "        \"value\": \"value3\"" +
+                    "    }]," +
+                    "    \"message\": \"bob to alice and jack\"," +
+                    "    \"recipients\": [{" +
+                    "        \"address\": \"alice@james.org\"," +
+                    "        \"parameters\": []" +
+                    "    }, {" +
+                    "        \"address\": \"jack@james.org\"," +
+                    "        \"parameters\": [{" +
+                    "            \"name\": \"param1\"," +
+                    "            \"value\": \"value1\"" +
+                    "        }, {" +
+                    "            \"name\": \"param2\"," +
+                    "            \"value\": \"value2\"" +
+                    "        }]" +
+                    "    }]" +
+                    "}, {" +
+                    "    \"from\": \"alice@james.org\"," +
+                    "    \"mailParameters\": []," +
+                    "    \"message\": \"alice to bob\"," +
+                    "    \"recipients\": [{" +
+                    "        \"address\": \"bob@james.org\"," +
+                    "        \"parameters\": []" +
+                    "    }]" +
+                    "}]");
         }
 
         @Test
diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPServerTest.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPServerTest.java
index d3d76e9..ccb475c 100644
--- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPServerTest.java
+++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPServerTest.java
@@ -122,9 +122,9 @@ class MockSMTPServerTest {
             Awaitility.await().atMost(Duration.TEN_SECONDS)
                 .untilAsserted(() -> {
                     List<Mail> mails = mailRepository.list();
-                    Mail.Envelope expectedEnvelope = new Mail.Envelope(
+                    Mail.Envelope expectedEnvelope = Mail.Envelope.ofAddresses(
                         new MailAddress(BOB),
-                        ImmutableList.of(new MailAddress(ALICE), new MailAddress(JACK)));
+                        new MailAddress(ALICE), new MailAddress(JACK));
                     assertThat(mails)
                         .hasSize(1)
                         .allSatisfy(Throwing.consumer(assertedMail -> {
diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ReceivedMailRepositoryTest.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ReceivedMailRepositoryTest.java
index 28cecad..c5c2139 100644
--- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ReceivedMailRepositoryTest.java
+++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ReceivedMailRepositoryTest.java
@@ -49,14 +49,14 @@ class ReceivedMailRepositoryTest {
             .setText("any text")
             .build();
         mail = new Mail(
-            new Mail.Envelope(
+            Mail.Envelope.ofAddresses(
                 new MailAddress(BOB),
-                ImmutableList.of(new MailAddress(ALICE), new MailAddress(JACK))),
+                new MailAddress(ALICE), new MailAddress(JACK)),
                 MimeMessageUtil.asString(message));
         mail2 = new Mail(
-            new Mail.Envelope(
+            Mail.Envelope.ofAddresses(
                 new MailAddress(ALICE),
-                ImmutableList.of(new MailAddress(BOB), new MailAddress(JACK))),
+                new MailAddress(BOB), new MailAddress(JACK)),
                 MimeMessageUtil.asString(message));
     }
 
diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailTest.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailTest.java
index e65e4d0..9544392 100644
--- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailTest.java
+++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailTest.java
@@ -41,7 +41,7 @@ class MailTest {
     void setUp() throws Exception {
         bob = new MailAddress("bob@domain.tld");
         alice = new MailAddress("alice@domain.tld");
-        envelope = new Mail.Envelope(alice, ImmutableList.of(bob));
+        envelope = Mail.Envelope.ofAddresses(alice, bob);
     }
 
     @Nested
@@ -51,25 +51,6 @@ class MailTest {
            EqualsVerifier.forClass(Mail.Envelope.class)
                .verify();
         }
-
-        @Test
-        void constructorShouldThrowWhenNullFrom() {
-            assertThatThrownBy(() -> new Mail.Envelope(null, ImmutableList.of(bob)))
-                .isInstanceOf(NullPointerException.class);
-        }
-
-        @Test
-        void constructorShouldThrowWhenNullRecipients() {
-            List<MailAddress> nullList = null;
-            assertThatThrownBy(() -> new Mail.Envelope(bob, nullList))
-                .isInstanceOf(NullPointerException.class);
-        }
-
-        @Test
-        void constructorShouldThrowWhenEmptyRecipients() {
-            assertThatThrownBy(() -> new Mail.Envelope(bob, ImmutableList.of()))
-                .isInstanceOf(IllegalArgumentException.class);
-        }
     }
 
     @Test
diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailsTest.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailsTest.java
index bb1e9be..0011706 100644
--- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailsTest.java
+++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailsTest.java
@@ -38,23 +38,101 @@ import net.javacrumbs.jsonunit.core.internal.Options;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 class MailsTest {
+    public static final String MAILS_WITH_PARAMETERS = "[{" +
+        "    \"from\": \"bob@james.org\"," +
+        "    \"recipients\": [{" +
+        "        \"address\": \"alice@james.org\"," +
+        "        \"parameters\": []" +
+        "    }, {" +
+        "        \"address\": \"jack@james.org\"," +
+        "        \"parameters\": [{" +
+        "            \"name\": \"param1\"," +
+        "            \"value\": \"value1\"" +
+        "        }, {" +
+        "            \"name\": \"param2\"," +
+        "            \"value\": \"value2\"" +
+        "        }]" +
+        "    }]," +
+        "    \"mailParameters\": [{" +
+        "        \"name\": \"param3\"," +
+        "        \"value\": \"value3\"" +
+        "    }]," +
+        "    \"message\": \"bob to alice and jack\"" +
+        "}, {" +
+        "    \"from\": \"bob@james.org\"," +
+        "    \"recipients\": [{" +
+        "        \"address\": \"alice@james.org\"," +
+        "        \"parameters\": [{" +
+        "            \"name\": \"param1\"," +
+        "            \"value\": \"value1\"" +
+        "        }]" +
+        "    }]," +
+        "    \"mailParameters\": [{" +
+        "        \"name\": \"param2\"," +
+        "        \"value\": \"value2\"" +
+        "    }]," +
+        "    \"message\": \"alice to bob\"" +
+        "}]";
+
     private Mails mails;
+    private Mails mailsWithParams;
 
     @BeforeEach
     void setup() throws Exception {
         Mail mail1 = new Mail(
-            new Mail.Envelope(
+            Mail.Envelope.ofAddresses(
                 new MailAddress(BOB),
-                ImmutableList.of(new MailAddress(ALICE), new MailAddress(JACK))),
+                new MailAddress(ALICE), new MailAddress(JACK)),
             "bob to alice and jack");
 
         Mail mail2 = new Mail(
-            new Mail.Envelope(
+            Mail.Envelope.ofAddresses(
                 new MailAddress(ALICE),
-                ImmutableList.of(new MailAddress(BOB))),
+                new MailAddress(BOB)),
             "alice to bob");
 
         mails = new Mails(ImmutableList.of(mail1, mail2));
+
+        Mail mail1WithParams = new Mail(
+            Mail.Envelope.builder()
+                .from(new MailAddress(BOB))
+                .addRecipientMailAddress(new MailAddress(ALICE))
+                .addRecipient(Mail.Recipient.builder()
+                    .address(new MailAddress(JACK))
+                    .addParameter(Mail.Parameter.builder()
+                        .name("param1")
+                        .value("value1")
+                        .build())
+                    .addParameter(Mail.Parameter.builder()
+                        .name("param2")
+                        .value("value2")
+                        .build())
+                    .build())
+                .addMailParameter(Mail.Parameter.builder()
+                    .name("param3")
+                    .value("value3")
+                    .build())
+                .build(),
+            "bob to alice and jack");
+
+        Mail mail2WithParams = new Mail(
+            Mail.Envelope.builder()
+                .from(new MailAddress(BOB))
+                .addRecipient(Mail.Recipient.builder()
+                    .address(new MailAddress(ALICE))
+                    .addParameter(Mail.Parameter.builder()
+                        .name("param1")
+                        .value("value1")
+                        .build())
+                    .build())
+                .addMailParameter(Mail.Parameter.builder()
+                    .name("param2")
+                    .value("value2")
+                    .build())
+                .build(),
+            "alice to bob");
+
+        mailsWithParams = new Mails(ImmutableList.of(mail1WithParams, mail2WithParams));
     }
 
     @Test
@@ -79,4 +157,21 @@ class MailsTest {
             .withOptions(new Options(Option.TREATING_NULL_AS_ABSENT, Option.IGNORING_ARRAY_ORDER))
             .isEqualTo(JSON_MAILS_LIST);
     }
+
+    @Test
+    void jacksonShouldDeserializeMailsWithParameters() throws Exception {
+        Mails actualMails = OBJECT_MAPPER.readValue(MAILS_WITH_PARAMETERS, Mails.class);
+
+        assertThat(actualMails)
+            .isEqualTo(mailsWithParams);
+    }
+
+    @Test
+    void jacksonShouldSerializeMailsWithParameters() throws Exception {
+        String json = OBJECT_MAPPER.writeValueAsString(mailsWithParams);
+
+        assertThatJson(json)
+            .withOptions(new Options(Option.TREATING_NULL_AS_ABSENT, Option.IGNORING_ARRAY_ORDER))
+            .isEqualTo(MAILS_WITH_PARAMETERS);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org