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 d1ccaad97ebf1e850169be99b87812163e828a07 Author: Benoit Tellier <[email protected]> AuthorDate: Wed Aug 21 15:09:41 2019 +0700 JAMES-2866 JSON serialization for Response --- .../apache/james/mock/smtp/server/Response.java | 29 +++++++++- .../james/mock/smtp/server/ResponseTest.java | 65 ++++++++++++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/Response.java b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/Response.java index 9adb043..04f3ea0 100644 --- a/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/Response.java +++ b/server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/Response.java @@ -19,8 +19,12 @@ package org.apache.james.mock.smtp.server; +import java.util.Arrays; import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; import com.google.common.base.Preconditions; class Response { @@ -53,10 +57,19 @@ class Response { private final int code; - private SMTPStatusCode(int code) { + @JsonCreator + public static SMTPStatusCode of(int code) { + return Arrays.stream(values()) + .filter(value -> value.code == code) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(code + " is not a supported SMTP code")); + } + + SMTPStatusCode(int code) { this.code = code; } + @JsonValue public int getCode() { return code; } @@ -74,7 +87,10 @@ class Response { private final String message; private final boolean serverRejected; - private Response(SMTPStatusCode code, String message, boolean serverRejected) { + @JsonCreator + private Response(@JsonProperty("code") SMTPStatusCode code, + @JsonProperty("message") String message, + @JsonProperty("rejected") boolean serverRejected) { Preconditions.checkNotNull(message); Preconditions.checkNotNull(code); @@ -87,10 +103,19 @@ class Response { return code.getCode() + " " + message; } + @JsonProperty("rejected") boolean isServerRejected() { return serverRejected; } + public SMTPStatusCode getCode() { + return code; + } + + public String getMessage() { + return message; + } + @Override public final boolean equals(Object o) { if (o instanceof Response) { diff --git a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ResponseTest.java b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ResponseTest.java index cd5f39f..cc2cfb6 100644 --- a/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ResponseTest.java +++ b/server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ResponseTest.java @@ -19,15 +19,61 @@ 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; 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 nl.jqno.equalsverifier.EqualsVerifier; class ResponseTest { + static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + static final int OK_250_CODE = 250; + static final Response.SMTPStatusCode OK_250 = Response.SMTPStatusCode.of(OK_250_CODE); + + @Nested + class SMTPStatusCodeTest { + @Test + void shouldMatchBeanContract() { + EqualsVerifier.forClass(Response.SMTPStatusCode.class) + .verify(); + } + + @Test + void constructorShouldThrowWhenStatusCodeIsNegative() { + assertThatThrownBy(() -> Response.SMTPStatusCode.of(-1)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void constructorShouldThrowWhenStatusCodeIsZero() { + assertThatThrownBy(() -> Response.SMTPStatusCode.of(0)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void constructorShouldThrowWhenStatusCodeIsTooBig() { + assertThatThrownBy(() -> Response.SMTPStatusCode.of(600)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void constructorShouldThrowWhenStatusCodeIsTooLittle() { + assertThatThrownBy(() -> Response.SMTPStatusCode.of(99)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void getCodeShouldReturnInternalValue() { + assertThat(OK_250.getCode()) + .isEqualTo(OK_250_CODE); + } + } @Test void shouldMatchBeanContract() { @@ -70,4 +116,23 @@ class ResponseTest { assertThat(Response.serverAccept(SMTPStatusCode.ACTION_COMPLETE_250, "message").isServerRejected()) .isFalse(); } + + @Nested + class JSONTest { + @Test + void jacksonShouldDeserializeResponse() throws Exception { + Response response = OBJECT_MAPPER.readValue( + "{\"code\":250, \"message\":\"OK\", \"rejected\":false}", + Response.class); + + assertThat(response).isEqualTo(Response.serverAccept(Response.SMTPStatusCode.of(250), "OK")); + } + + @Test + void jacksonShouldSerializeResponse() throws Exception { + String json = OBJECT_MAPPER.writeValueAsString(Response.serverAccept(Response.SMTPStatusCode.of(250), "OK")); + + assertThatJson(json).isEqualTo("{\"code\":250, \"message\":\"OK\", \"rejected\":false}"); + } + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
