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 cf3700459cc0dc2993c8fdcf3e5550ecf79cfd6a Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Wed Dec 18 13:14:38 2019 +0700 JAMES-2993 Use JsonSerializationVerifier for Task manager event DTO tests --- .../apache/james/JsonSerializationVerifier.java | 28 ++++--- .../james/JsonSerializationVerifierTest.java | 5 +- server/task/task-distributed/pom.xml | 6 ++ .../distributed/TaskEventsSerializationTest.java | 88 +++++++++------------- 4 files changed, 60 insertions(+), 67 deletions(-) diff --git a/json/src/test/java/org/apache/james/JsonSerializationVerifier.java b/json/src/test/java/org/apache/james/JsonSerializationVerifier.java index 2d717e2..a842ca9 100644 --- a/json/src/test/java/org/apache/james/JsonSerializationVerifier.java +++ b/json/src/test/java/org/apache/james/JsonSerializationVerifier.java @@ -34,26 +34,34 @@ import com.github.fge.lambdas.Throwing; import com.google.common.collect.ImmutableList; public class JsonSerializationVerifier<T, U extends DTO> { + @FunctionalInterface public interface RequireJson<T, U extends DTO> { JsonSerializationVerifier<T, U> json(String json); } public static <T, U extends DTO> JsonSerializationVerifier<T, U> dtoModule(DTOModule<T, U> dtoModule) { - return new JsonSerializationVerifier<>(dtoModule, ImmutableList.of()); + return new JsonSerializationVerifier<>(JsonGenericSerializer + .forModules(dtoModule) + .withoutNestedType(), + ImmutableList.of()); + } + + public static <T, U extends DTO> JsonSerializationVerifier<T, U> serializer(JsonGenericSerializer<T, U> serializer) { + return new JsonSerializationVerifier<>(serializer, ImmutableList.of()); } - private final DTOModule<T, U> dtoModule; private final List<Pair<String, T>> testValues; + private final JsonGenericSerializer<T, U> serializer; - private JsonSerializationVerifier(DTOModule<T, U> dtoModule, List<Pair<String, T>> testValues) { - this.dtoModule = dtoModule; + private JsonSerializationVerifier( JsonGenericSerializer<T, U> serializer, List<Pair<String, T>> testValues) { this.testValues = testValues; + this.serializer = serializer; } public RequireJson<T, U> bean(T bean) { return json -> new JsonSerializationVerifier<>( - dtoModule, + serializer, ImmutableList.<Pair<String, T>>builder() .addAll(testValues) .add(Pair.of(json, bean)) @@ -65,15 +73,11 @@ public class JsonSerializationVerifier<T, U extends DTO> { } private void verify(Pair<String, T> testValue) throws IOException { - JsonGenericSerializer<T, U> seriliazer = JsonGenericSerializer - .forModules(dtoModule) - .withoutNestedType(); - - assertThatJson(seriliazer.serialize(testValue.getRight())) - .describedAs("Serialization test") + assertThatJson(serializer.serialize(testValue.getRight())) + .describedAs("Serialization test [" + testValue.getRight() + "]") .isEqualTo(testValue.getLeft()); - assertThat(seriliazer.deserialize(testValue.getLeft())) + assertThat(serializer.deserialize(testValue.getLeft())) .describedAs("Deserialization test [" + testValue.getRight() + "]") .isEqualToComparingFieldByFieldRecursively(testValue.getRight()); } diff --git a/json/src/test/java/org/apache/james/JsonSerializationVerifierTest.java b/json/src/test/java/org/apache/james/JsonSerializationVerifierTest.java index 4758ab8..88f5737 100644 --- a/json/src/test/java/org/apache/james/JsonSerializationVerifierTest.java +++ b/json/src/test/java/org/apache/james/JsonSerializationVerifierTest.java @@ -48,7 +48,8 @@ class JsonSerializationVerifierTest { .json(FIRST_JSON_BAD) .verify()) .isInstanceOf(AssertionFailedError.class) - .hasMessageContaining("[Serialization test] JSON documents are different:\n" + - "Different value found in node \"id\""); + .hasMessageContaining("[Serialization test [org.apache.james.dto.FirstDomainObject@7650497c]]") + .hasMessageContaining("JSON documents are different:") + .hasMessageContaining("Different value found in node \"id\""); } } diff --git a/server/task/task-distributed/pom.xml b/server/task/task-distributed/pom.xml index 2e590a6..40fab57 100644 --- a/server/task/task-distributed/pom.xml +++ b/server/task/task-distributed/pom.xml @@ -69,6 +69,12 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>james-json</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>james-server-lifecycle-api</artifactId> </dependency> <dependency> diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java index bad55dd..8246466 100644 --- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java +++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java @@ -19,17 +19,14 @@ package org.apache.james.task.eventsourcing.distributed; -import static org.assertj.core.api.Assertions.assertThat; - import java.time.Instant; import java.util.Set; -import java.util.stream.Stream; +import org.apache.james.JsonSerializationVerifier; import org.apache.james.eventsourcing.EventId; -import org.apache.james.eventsourcing.eventstore.cassandra.JsonEventSerializer; import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule; import org.apache.james.json.DTOConverter; -import org.apache.james.server.task.json.JsonTaskAdditionalInformationSerializer; +import org.apache.james.json.JsonGenericSerializer; import org.apache.james.server.task.json.JsonTaskSerializer; import org.apache.james.server.task.json.dto.AdditionalInformationDTO; import org.apache.james.server.task.json.dto.MemoryReferenceWithCounterTaskAdditionalInformationDTO; @@ -49,19 +46,14 @@ import org.apache.james.task.eventsourcing.Created; import org.apache.james.task.eventsourcing.Failed; import org.apache.james.task.eventsourcing.Started; import org.apache.james.task.eventsourcing.TaskAggregateId; -import org.apache.james.task.eventsourcing.TaskEvent; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.api.Test; -import net.javacrumbs.jsonunit.assertj.JsonAssertions; import scala.Option; class TaskEventsSerializationTest { static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z"); static final DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> ADDITIONAL_INFORMATION_CONVERTER = DTOConverter.of(MemoryReferenceWithCounterTaskAdditionalInformationDTO.SERIALIZATION_MODULE); static final DTOConverter<Task, TaskDTO> TASK_CONVERTER = DTOConverter.of(TestTaskDTOModules.COMPLETED_TASK_MODULE); - static final JsonTaskAdditionalInformationSerializer TASK_ADDITIONNAL_INFORMATION_SERIALIZER = JsonTaskAdditionalInformationSerializer.of(MemoryReferenceWithCounterTaskAdditionalInformationDTO.SERIALIZATION_MODULE); static final TaskAggregateId AGGREGATE_ID = new TaskAggregateId(TaskId.fromString("2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd")); static final EventId EVENT_ID = EventId.fromSerialized(42); static final Task TASK = new CompletedTask(); @@ -75,47 +67,37 @@ class TaskEventsSerializationTest { ADDITIONAL_INFORMATION_CONVERTER, TASK_CONVERTER); - JsonEventSerializer serializer = JsonEventSerializer - .forModules(list) - .withNestedTypeModules( - MemoryReferenceWithCounterTaskAdditionalInformationDTO.SERIALIZATION_MODULE, - TestTaskDTOModules.COMPLETED_TASK_MODULE); - - @ParameterizedTest - @MethodSource - void taskShouldBeSerializable(TaskEvent event, String serializedJson) throws Exception { - JsonAssertions.assertThatJson(serializer.serialize(event)).isEqualTo(serializedJson); - } - - static Stream<Arguments> taskShouldBeSerializable() throws Exception { - return validTasks(); - } - - @ParameterizedTest - @MethodSource - void taskShouldBeDeserializable(TaskEvent event, String serializedJson) throws Exception { - assertThat(serializer.deserialize(serializedJson)).isEqualToComparingFieldByFieldRecursively(event); + @Test + void taskManagerEventsShouldBeSerializable() throws Exception { + JsonSerializationVerifier.serializer(JsonGenericSerializer + .forModules(list) + .withNestedTypeModules( + MemoryReferenceWithCounterTaskAdditionalInformationDTO.SERIALIZATION_MODULE, + TestTaskDTOModules.COMPLETED_TASK_MODULE)) + .bean(new Created(AGGREGATE_ID, EVENT_ID, TASK, HOSTNAME)) + .json("{\"task\":{\"type\":\"completed-task\"},\"type\":\"task-manager-created\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"hostname\":\"foo\"}") + .bean(new Started(AGGREGATE_ID, EVENT_ID, HOSTNAME)) + .json("{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-started\",\"hostname\":\"foo\"}") + .bean(new CancelRequested(AGGREGATE_ID, EVENT_ID, HOSTNAME)) + .json("{\"type\":\"task-manager-cancel-requested\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"hostname\":\"foo\"}") + .bean(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.COMPLETED, Option.empty())) + .json("{\"result\":\"COMPLETED\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\"}") + .bean(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.PARTIAL, Option.empty())) + .json("{\"result\":\"PARTIAL\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\"}") + .bean(new Failed(AGGREGATE_ID, EVENT_ID, Option.empty(), Option.empty(), Option.empty())) + .json("{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\"}") + .bean(new Failed(AGGREGATE_ID, EVENT_ID, Option.empty(), Option.apply("contextual message"), Option.apply("my exception"))) + .json("{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\", \"errorMessage\": \"contextual message\", \"exception\": \"my exception\"}") + .bean(new Cancelled(AGGREGATE_ID, EVENT_ID, Option.empty())) + .json("{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-cancelled\"}") + .bean(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.COMPLETED, Option.apply(COUNTER_ADDITIONAL_INFORMATION))) + .json("{\"result\":\"COMPLETED\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}") + .bean(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.PARTIAL, Option.apply(COUNTER_ADDITIONAL_INFORMATION))) + .json("{\"result\":\"PARTIAL\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}") + .bean(new Failed(AGGREGATE_ID, EVENT_ID, Option.apply(COUNTER_ADDITIONAL_INFORMATION), Option.empty(), Option.empty())) + .json("{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}") + .bean(new Cancelled(AGGREGATE_ID, EVENT_ID, Option.apply(COUNTER_ADDITIONAL_INFORMATION))) + .json("{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-cancelled\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}") + .verify(); } - - static Stream<Arguments> taskShouldBeDeserializable() throws Exception { - return validTasks(); - } - - static Stream<Arguments> validTasks() throws Exception { - return Stream.of( - Arguments.of(new Created(AGGREGATE_ID, EVENT_ID, TASK, HOSTNAME), "{\"task\":{\"type\":\"completed-task\"},\"type\":\"task-manager-created\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"hostname\":\"foo\"}\n"), - Arguments.of(new Started(AGGREGATE_ID, EVENT_ID, HOSTNAME), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-started\",\"hostname\":\"foo\"}"), - Arguments.of(new CancelRequested(AGGREGATE_ID, EVENT_ID, HOSTNAME), "{\"type\":\"task-manager-cancel-requested\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"hostname\":\"foo\"}\n"), - Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.COMPLETED, Option.empty()), "{\"result\":\"COMPLETED\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\"}"), - Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.PARTIAL, Option.empty()), "{\"result\":\"PARTIAL\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\"}"), - Arguments.of(new Failed(AGGREGATE_ID, EVENT_ID, Option.empty(), Option.empty(), Option.empty()), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\"}"), - Arguments.of(new Failed(AGGREGATE_ID, EVENT_ID, Option.empty(), Option.apply("contextual message"), Option.apply("my exception")), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\", \"errorMessage\": \"contextual message\", \"exception\": \"my exception\"}"), - Arguments.of(new Cancelled(AGGREGATE_ID, EVENT_ID, Option.empty()), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-cancelled\"}"), - Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.COMPLETED, Option.apply(COUNTER_ADDITIONAL_INFORMATION)), "{\"result\":\"COMPLETED\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}"), - Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.PARTIAL, Option.apply(COUNTER_ADDITIONAL_INFORMATION)), "{\"result\":\"PARTIAL\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}"), - Arguments.of(new Failed(AGGREGATE_ID, EVENT_ID, Option.apply(COUNTER_ADDITIONAL_INFORMATION), Option.empty(), Option.empty()), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}"), - Arguments.of(new Cancelled(AGGREGATE_ID, EVENT_ID, Option.apply(COUNTER_ADDITIONAL_INFORMATION)), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-cancelled\",\"additionalInformation\":{\"type\":\"memory-reference-task-with-counter\",\"count\":3,\"timestamp\":\"2018-11-13T12:00:55Z\"}}") - ); - } - } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org