This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit ff6e5e8e3b72ad9a17f690fbbc738784705e33a4 Author: Benoit Tellier <[email protected]> AuthorDate: Wed Aug 21 15:30:12 2019 +0700 JAMES-2866 JSON serialization for MockSMTPBehavior --- server/mailet/mock-smtp-server/pom.xml | 4 ++ .../james/mock/smtp/server/MockSMTPBehavior.java | 55 ++++++++++++++++- .../mock/smtp/server/MockSMTPBehaviorTest.java | 68 ++++++++++++++++++++++ 3 files changed, 125 insertions(+), 2 deletions(-) diff --git a/server/mailet/mock-smtp-server/pom.xml b/server/mailet/mock-smtp-server/pom.xml index bdcbea7..ce806b9 100644 --- a/server/mailet/mock-smtp-server/pom.xml +++ b/server/mailet/mock-smtp-server/pom.xml @@ -46,6 +46,10 @@ <artifactId>jackson-databind</artifactId> </dependency> <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jdk8</artifactId> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> diff --git a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockSMTPBehavior.java b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockSMTPBehavior.java index 371b2ea..2d8596a 100644 --- a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockSMTPBehavior.java +++ b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockSMTPBehavior.java @@ -22,8 +22,13 @@ package org.apache.james.mock.smtp.server; import java.util.Objects; import java.util.Optional; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import com.google.common.base.Preconditions; +@JsonDeserialize(builder = MockSMTPBehavior.Builder.class) public class MockSMTPBehavior { public static final class NumberOfAnswersPolicy { @@ -31,6 +36,7 @@ public class MockSMTPBehavior { return new NumberOfAnswersPolicy(Optional.empty()); } + @JsonCreator public static NumberOfAnswersPolicy times(int times) { Preconditions.checkArgument(times > 0, "times should be positive"); return new NumberOfAnswersPolicy(Optional.of(times)); @@ -42,6 +48,7 @@ public class MockSMTPBehavior { this.numberOfAnswers = numberOfAnswers; } + @JsonValue public Optional<Integer> getNumberOfAnswers() { return numberOfAnswers; } @@ -62,6 +69,50 @@ public class MockSMTPBehavior { } } + @JsonPOJOBuilder(withPrefix = "") + public static class Builder { + private SMTPCommand smtpCommand; + private Optional<Condition> condition; + private Response response; + private Optional<NumberOfAnswersPolicy> numberOfAnswers; + + public Builder() { + condition = Optional.empty(); + numberOfAnswers = Optional.empty(); + } + + public Builder command(SMTPCommand command) { + this.smtpCommand = command; + return this; + } + + public Builder response(Response response) { + this.response = response; + return this; + } + + public Builder condition(Condition condition) { + this.condition = Optional.of(condition); + return this; + } + + public Builder numberOfAnswer(Optional<NumberOfAnswersPolicy> numberOfAnswers) { + this.numberOfAnswers = numberOfAnswers; + return this; + } + + public MockSMTPBehavior build() { + Preconditions.checkState(smtpCommand != null, "You need to specify an smtpCommand"); + Preconditions.checkState(response != null, "You need to specify a response"); + + return new MockSMTPBehavior( + smtpCommand, + condition, + response, + numberOfAnswers.orElse(NumberOfAnswersPolicy.anytime())); + } + } + private final SMTPCommand smtpCommand; private final Optional<Condition> condition; private final Response response; @@ -79,7 +130,7 @@ public class MockSMTPBehavior { this.numberOfAnswers = numberOfAnswers; } - public SMTPCommand getSmtpCommand() { + public SMTPCommand getCommand() { return smtpCommand; } @@ -91,7 +142,7 @@ public class MockSMTPBehavior { return response; } - public NumberOfAnswersPolicy getNumberOfAnswers() { + public NumberOfAnswersPolicy getNumberOfAnswer() { return numberOfAnswers; } diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPBehaviorTest.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPBehaviorTest.java index 57f16cd..606c4bc 100644 --- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPBehaviorTest.java +++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPBehaviorTest.java @@ -19,6 +19,7 @@ package org.apache.james.mock.smtp.server; +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -28,10 +29,40 @@ import org.apache.james.mock.smtp.server.Response.SMTPStatusCode; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; + +import net.javacrumbs.jsonunit.core.Option; +import net.javacrumbs.jsonunit.core.internal.Options; import nl.jqno.equalsverifier.EqualsVerifier; class MockSMTPBehaviorTest { private static final Response RESPONSE = Response.serverAccept(SMTPStatusCode.ACTION_COMPLETE_250, "message"); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(new Jdk8Module()); + + private static final String JSON_COMPULSORY_FIELDS = "{" + + " \"response\": {\"code\":250, \"message\":\"OK\", \"rejected\":false}," + + " \"command\": \"EHLO\"" + + "}"; + + private static final MockSMTPBehavior POJO_COMPULSORY_FIELDS = new MockSMTPBehavior( + SMTPCommand.EHLO, + Optional.empty(), + Response.serverAccept(Response.SMTPStatusCode.of(250), "OK"), + MockSMTPBehavior.NumberOfAnswersPolicy.anytime()); + + private static final String JSON_ALL_FIELDS = "{" + + " \"response\": {\"code\":250, \"message\":\"OK\", \"rejected\":false}," + + " \"condition\": {\"operator\":\"contains\", \"matchingValue\":\"matchme\"}," + + " \"command\": \"EHLO\"," + + " \"numberOfAnswer\": 7" + + "}"; + + private static final MockSMTPBehavior POJO_ALL_FIELDS = new MockSMTPBehavior( + SMTPCommand.EHLO, + Optional.of(new Condition.OperatorCondition(Operator.CONTAINS, "matchme")), + Response.serverAccept(Response.SMTPStatusCode.of(250), "OK"), + MockSMTPBehavior.NumberOfAnswersPolicy.times(7)); @Nested class NumberOfAnswersPolicyTest { @@ -95,4 +126,41 @@ class MockSMTPBehaviorTest { assertThatThrownBy(() -> new MockSMTPBehavior(SMTPCommand.NOOP, Optional.empty(), RESPONSE, null)) .isInstanceOf(NullPointerException.class); } + + @Nested + class JSONTest { + @Test + void jacksonShouldDeserializeMockSMTPBehaviorWithAllField() throws Exception { + MockSMTPBehavior behavior = OBJECT_MAPPER.readValue(JSON_ALL_FIELDS, MockSMTPBehavior.class); + + assertThat(behavior) + .isEqualTo(POJO_ALL_FIELDS); + } + + @Test + void jacksonShouldSerializeMockSMTPBehaviorWithAllField() throws Exception { + String json = OBJECT_MAPPER.writeValueAsString(POJO_ALL_FIELDS); + + assertThatJson(json) + .withOptions(new Options(Option.TREATING_NULL_AS_ABSENT)) + .isEqualTo(JSON_ALL_FIELDS); + } + + @Test + void jacksonShouldDeserializeMockSMTPBehaviorWithCompulsoryField() throws Exception { + MockSMTPBehavior behavior = OBJECT_MAPPER.readValue(JSON_COMPULSORY_FIELDS, MockSMTPBehavior.class); + + assertThat(behavior) + .isEqualTo(POJO_COMPULSORY_FIELDS); + } + + @Test + void jacksonShouldSerializeMockSMTPBehaviorWithCompulsoryField() throws Exception { + String json = OBJECT_MAPPER.writeValueAsString(POJO_COMPULSORY_FIELDS); + + assertThatJson(json) + .withOptions(new Options(Option.TREATING_NULL_AS_ABSENT)) + .isEqualTo(JSON_COMPULSORY_FIELDS); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
