You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/11/20 07:32:04 UTC

[james-project] 21/41: JAMES-2813 demonstrate how to handle nested DTOs with some tests

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 475c53908d5ed456eefa21a1e4b4f81a91969e5c
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Mon Oct 21 12:04:52 2019 +0200

    JAMES-2813 demonstrate how to handle nested DTOs with some tests
---
 .../src/test/java/org/apache/DTOConverterTest.java | 11 ++++---
 .../java/org/apache/JsonGenericSerializerTest.java | 28 +++++++++++++++--
 json/src/test/java/org/apache/dto/FirstDTO.java    | 14 +++++++--
 .../java/org/apache/dto/FirstDomainObject.java     | 11 +++++--
 .../dto/{SecondDTO.java => FirstNestedDTO.java}    | 34 ++++++++-------------
 ...econdDomainObject.java => FirstNestedType.java} | 26 ++++++----------
 .../{SecondDomainObject.java => NestedType.java}   | 34 +--------------------
 json/src/test/java/org/apache/dto/SecondDTO.java   | 15 ++++++++--
 .../java/org/apache/dto/SecondDomainObject.java    | 12 ++++++--
 .../dto/{SecondDTO.java => SecondNestedDTO.java}   | 33 ++++++++------------
 ...condDomainObject.java => SecondNestedType.java} | 26 ++++++----------
 json/src/test/java/org/apache/dto/TestModules.java | 33 +++++++++++++++++---
 ...condDomainObject.java => TestNestedModule.java} | 35 ++++------------------
 13 files changed, 153 insertions(+), 159 deletions(-)

diff --git a/json/src/test/java/org/apache/DTOConverterTest.java b/json/src/test/java/org/apache/DTOConverterTest.java
index 3987dbd..d75fffe 100644
--- a/json/src/test/java/org/apache/DTOConverterTest.java
+++ b/json/src/test/java/org/apache/DTOConverterTest.java
@@ -29,6 +29,7 @@ import java.util.stream.Stream;
 import org.apache.dto.BaseType;
 import org.apache.dto.FirstDTO;
 import org.apache.dto.FirstDomainObject;
+import org.apache.dto.NestedType;
 import org.apache.dto.SecondDTO;
 import org.apache.dto.SecondDomainObject;
 import org.apache.dto.TestModules;
@@ -40,10 +41,12 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 class DTOConverterTest {
-    private static final FirstDomainObject FIRST = new FirstDomainObject(Optional.of(1L), ZonedDateTime.parse("2016-04-03T02:01+07:00[Asia/Vientiane]"), "first payload");
-    private static final FirstDTO FIRST_DTO = new FirstDTO("first", Optional.of(1L), "2016-04-03T02:01+07:00[Asia/Vientiane]", "first payload");
-    private static final SecondDomainObject SECOND = new SecondDomainObject(UUID.fromString("4a2c853f-7ffc-4ce3-9410-a47e85b3b741"), "second payload");
-    private static final SecondDTO SECOND_DTO = new SecondDTO("second", "4a2c853f-7ffc-4ce3-9410-a47e85b3b741", "second payload");
+    private static final Optional<NestedType> NO_CHILD = Optional.empty();
+    private static final Optional<DTO> NO_CHILD_DTO = Optional.empty();
+    private static final FirstDomainObject FIRST = new FirstDomainObject(Optional.of(1L), ZonedDateTime.parse("2016-04-03T02:01+07:00[Asia/Vientiane]"), "first payload", NO_CHILD);
+    private static final FirstDTO FIRST_DTO = new FirstDTO("first", Optional.of(1L), "2016-04-03T02:01+07:00[Asia/Vientiane]", "first payload", NO_CHILD_DTO);
+    private static final SecondDomainObject SECOND = new SecondDomainObject(UUID.fromString("4a2c853f-7ffc-4ce3-9410-a47e85b3b741"), "second payload", NO_CHILD);
+    private static final SecondDTO SECOND_DTO = new SecondDTO("second", "4a2c853f-7ffc-4ce3-9410-a47e85b3b741", "second payload", NO_CHILD_DTO);
 
     @SuppressWarnings("unchecked")
     @Test
diff --git a/json/src/test/java/org/apache/JsonGenericSerializerTest.java b/json/src/test/java/org/apache/JsonGenericSerializerTest.java
index 8205553..3fc6c45 100644
--- a/json/src/test/java/org/apache/JsonGenericSerializerTest.java
+++ b/json/src/test/java/org/apache/JsonGenericSerializerTest.java
@@ -30,7 +30,10 @@ import java.util.stream.Stream;
 
 import org.apache.dto.BaseType;
 import org.apache.dto.FirstDomainObject;
+import org.apache.dto.FirstNestedType;
+import org.apache.dto.NestedType;
 import org.apache.dto.SecondDomainObject;
+import org.apache.dto.SecondNestedType;
 import org.apache.dto.TestModules;
 import org.apache.james.json.DTO;
 import org.apache.james.json.JsonGenericSerializer;
@@ -40,13 +43,18 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 class JsonGenericSerializerTest {
-    private static final FirstDomainObject FIRST = new FirstDomainObject(Optional.of(1L), ZonedDateTime.parse("2016-04-03T02:01+07:00[Asia/Vientiane]"), "first payload");
-    private static final SecondDomainObject SECOND = new SecondDomainObject(UUID.fromString("4a2c853f-7ffc-4ce3-9410-a47e85b3b741"), "second payload");
+    private static final Optional<NestedType> NO_CHILD = Optional.empty();
+    private static final FirstDomainObject FIRST = new FirstDomainObject(Optional.of(1L), ZonedDateTime.parse("2016-04-03T02:01+07:00[Asia/Vientiane]"), "first payload", NO_CHILD);
+    private static final SecondDomainObject SECOND = new SecondDomainObject(UUID.fromString("4a2c853f-7ffc-4ce3-9410-a47e85b3b741"), "second payload", NO_CHILD);
+    private static final SecondDomainObject SECOND_WITH_NESTED = new SecondDomainObject(UUID.fromString("4a2c853f-7ffc-4ce3-9410-a47e85b3b741"), "second payload", Optional.of(new FirstNestedType(12)));
+    private static final FirstDomainObject FIRST_WITH_NESTED = new FirstDomainObject(Optional.of(1L), ZonedDateTime.parse("2016-04-03T02:01+07:00[Asia/Vientiane]"), "payload", Optional.of(new SecondNestedType("bar")));
 
     private static final String MISSING_TYPE_JSON = "{\"id\":1,\"time\":\"2016-04-03T02:01+07:00[Asia/Vientiane]\",\"payload\":\"first payload\"}";
     private static final String DUPLICATE_TYPE_JSON = "{\"type\":\"first\", \"type\":\"second\", \"id\":1,\"time\":\"2016-04-03T02:01+07:00[Asia/Vientiane]\",\"payload\":\"first payload\"}";
     private static final String FIRST_JSON = "{\"type\":\"first\",\"id\":1,\"time\":\"2016-04-03T02:01+07:00[Asia/Vientiane]\",\"payload\":\"first payload\"}";
+    private static final String FIRST_JSON_WITH_NESTED = "{\"type\":\"first\",\"id\":1,\"time\":\"2016-04-03T02:01+07:00[Asia/Vientiane]\",\"payload\":\"payload\", \"child\": {\"bar\": \"bar\", \"type\": \"second-nested\"}}";
     private static final String SECOND_JSON = "{\"type\":\"second\",\"id\":\"4a2c853f-7ffc-4ce3-9410-a47e85b3b741\",\"payload\":\"second payload\"}";
+    private static final String SECOND_WITH_NESTED_JSON = "{\"type\":\"second\",\"id\":\"4a2c853f-7ffc-4ce3-9410-a47e85b3b741\",\"payload\":\"second payload\", \"child\": {\"foo\": 12, \"type\": \"first-nested\"}}";
 
     @SuppressWarnings("unchecked")
     @Test
@@ -58,6 +66,22 @@ class JsonGenericSerializerTest {
 
     @SuppressWarnings("unchecked")
     @Test
+    void shouldDeserializeNestedTypeWithSecond() throws Exception {
+        assertThat(JsonGenericSerializer.of(TestModules.FIRST_TYPE, TestModules.SECOND_TYPE, TestModules.FIRST_NESTED, TestModules.SECOND_NESTED)
+            .deserialize(SECOND_WITH_NESTED_JSON))
+            .isEqualTo(SECOND_WITH_NESTED);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    void shouldDeserializeNestedTypeWithFirst() throws Exception {
+        assertThat(JsonGenericSerializer.of(TestModules.FIRST_TYPE, TestModules.SECOND_TYPE, TestModules.FIRST_NESTED, TestModules.SECOND_NESTED)
+            .deserialize(FIRST_JSON_WITH_NESTED))
+            .isEqualTo(FIRST_WITH_NESTED);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
     void shouldThrowWhenDeserializeEventWithMissingType() {
         assertThatThrownBy(() -> JsonGenericSerializer.of(TestModules.FIRST_TYPE)
             .deserialize(MISSING_TYPE_JSON))
diff --git a/json/src/test/java/org/apache/dto/FirstDTO.java b/json/src/test/java/org/apache/dto/FirstDTO.java
index 9e4f46b..b1bdf23 100644
--- a/json/src/test/java/org/apache/dto/FirstDTO.java
+++ b/json/src/test/java/org/apache/dto/FirstDTO.java
@@ -23,6 +23,7 @@ import java.time.ZonedDateTime;
 import java.util.Optional;
 
 import org.apache.james.json.DTO;
+import org.apache.james.json.DTOConverter;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -33,17 +34,20 @@ public class FirstDTO implements DTO {
     private final Optional<Long> id;
     private final String time;
     private final String payload;
+    private final Optional<DTO> child;
 
     @JsonCreator
     public FirstDTO(
             @JsonProperty("type") String type,
             @JsonProperty("id") Optional<Long> id,
             @JsonProperty("time") String time,
-            @JsonProperty("payload") String payload) {
+            @JsonProperty("payload") String payload,
+            @JsonProperty("child") Optional<DTO> child) {
         this.type = type;
         this.id = id;
         this.time = time;
         this.payload = payload;
+        this.child = child;
     }
 
     public String getType() {
@@ -62,8 +66,12 @@ public class FirstDTO implements DTO {
         return payload;
     }
 
+    public Optional<DTO> getChild() {
+        return child;
+    }
+
     @JsonIgnore
-    public FirstDomainObject toDomainObject() {
-        return new FirstDomainObject(id, ZonedDateTime.parse(time), payload);
+    public FirstDomainObject toDomainObject(DTOConverter<NestedType, DTO> converter) {
+        return new FirstDomainObject(id, ZonedDateTime.parse(time), payload, child.flatMap(converter::convert));
     }
 }
diff --git a/json/src/test/java/org/apache/dto/FirstDomainObject.java b/json/src/test/java/org/apache/dto/FirstDomainObject.java
index 6c8a787..13e8462 100644
--- a/json/src/test/java/org/apache/dto/FirstDomainObject.java
+++ b/json/src/test/java/org/apache/dto/FirstDomainObject.java
@@ -27,11 +27,13 @@ public class FirstDomainObject implements BaseType {
     private final Optional<Long> id;
     private final ZonedDateTime time;
     private final String payload;
+    private final Optional<NestedType> child;
 
-    public FirstDomainObject(Optional<Long> id, ZonedDateTime time, String payload) {
+    public FirstDomainObject(Optional<Long> id, ZonedDateTime time, String payload, Optional<NestedType> child) {
         this.id = id;
         this.time = time;
         this.payload = payload;
+        this.child = child;
     }
 
     public Optional<Long> getId() {
@@ -46,6 +48,10 @@ public class FirstDomainObject implements BaseType {
         return payload;
     }
 
+    public Optional<NestedType> getChild() {
+        return child;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -53,11 +59,12 @@ public class FirstDomainObject implements BaseType {
         FirstDomainObject that = (FirstDomainObject) o;
         return Objects.equals(id, that.id) &&
                 Objects.equals(time, that.time) &&
+                Objects.equals(child, that.child) &&
                 Objects.equals(payload, that.payload);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(id, time, payload);
+        return Objects.hash(id, time, child, payload);
     }
 }
diff --git a/json/src/test/java/org/apache/dto/SecondDTO.java b/json/src/test/java/org/apache/dto/FirstNestedDTO.java
similarity index 73%
copy from json/src/test/java/org/apache/dto/SecondDTO.java
copy to json/src/test/java/org/apache/dto/FirstNestedDTO.java
index d31929a..9fd7498 100644
--- a/json/src/test/java/org/apache/dto/SecondDTO.java
+++ b/json/src/test/java/org/apache/dto/FirstNestedDTO.java
@@ -19,43 +19,35 @@
 
 package org.apache.dto;
 
-import java.util.UUID;
-
 import org.apache.james.json.DTO;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class SecondDTO implements DTO {
+public class FirstNestedDTO implements DTO {
+    private final int foo;
     private final String type;
-    private final String id;
-    private final String payload;
 
     @JsonCreator
-    public SecondDTO(
-            @JsonProperty("type") String type,
-            @JsonProperty("id") String id,
-            @JsonProperty("payload") String payload) {
+    public FirstNestedDTO(@JsonProperty("foo") int foo,
+                          @JsonProperty("type") String type) {
+        this.foo = foo;
         this.type = type;
-        this.id = id;
-        this.payload = payload;
-    }
-
-    public String getType() {
-        return type;
     }
 
-    public String getId() {
-        return id;
+    public int getFoo() {
+        return foo;
     }
 
-    public String getPayload() {
-        return payload;
+    @Override
+    public String getType() {
+        return type;
     }
 
     @JsonIgnore
-    public SecondDomainObject toDomainObject() {
-        return new SecondDomainObject(UUID.fromString(id), payload);
+    public FirstNestedType toDomainObject() {
+        return new FirstNestedType(foo);
     }
+
 }
diff --git a/json/src/test/java/org/apache/dto/SecondDomainObject.java b/json/src/test/java/org/apache/dto/FirstNestedType.java
similarity index 72%
copy from json/src/test/java/org/apache/dto/SecondDomainObject.java
copy to json/src/test/java/org/apache/dto/FirstNestedType.java
index 30ac702..745a582 100644
--- a/json/src/test/java/org/apache/dto/SecondDomainObject.java
+++ b/json/src/test/java/org/apache/dto/FirstNestedType.java
@@ -20,36 +20,28 @@
 package org.apache.dto;
 
 import java.util.Objects;
-import java.util.UUID;
 
-public class SecondDomainObject implements BaseType {
-    private final UUID id;
-    private final String payload;
+public class FirstNestedType implements NestedType{
+    final int foo;
 
-    public SecondDomainObject(UUID id, String payload) {
-        this.id = id;
-        this.payload = payload;
+    public FirstNestedType(int foo) {
+        this.foo = foo;
     }
 
-    public UUID getId() {
-        return id;
-    }
-
-    public String getPayload() {
-        return payload;
+    public int getFoo() {
+        return foo;
     }
 
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
-        SecondDomainObject that = (SecondDomainObject) o;
-        return Objects.equals(id, that.id) &&
-                Objects.equals(payload, that.payload);
+        FirstNestedType that = (FirstNestedType) o;
+        return foo == that.foo;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(id, payload);
+        return Objects.hash(foo);
     }
 }
diff --git a/json/src/test/java/org/apache/dto/SecondDomainObject.java b/json/src/test/java/org/apache/dto/NestedType.java
similarity index 60%
copy from json/src/test/java/org/apache/dto/SecondDomainObject.java
copy to json/src/test/java/org/apache/dto/NestedType.java
index 30ac702..80145ee 100644
--- a/json/src/test/java/org/apache/dto/SecondDomainObject.java
+++ b/json/src/test/java/org/apache/dto/NestedType.java
@@ -19,37 +19,5 @@
 
 package org.apache.dto;
 
-import java.util.Objects;
-import java.util.UUID;
-
-public class SecondDomainObject implements BaseType {
-    private final UUID id;
-    private final String payload;
-
-    public SecondDomainObject(UUID id, String payload) {
-        this.id = id;
-        this.payload = payload;
-    }
-
-    public UUID getId() {
-        return id;
-    }
-
-    public String getPayload() {
-        return payload;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        SecondDomainObject that = (SecondDomainObject) o;
-        return Objects.equals(id, that.id) &&
-                Objects.equals(payload, that.payload);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, payload);
-    }
+public interface NestedType {
 }
diff --git a/json/src/test/java/org/apache/dto/SecondDTO.java b/json/src/test/java/org/apache/dto/SecondDTO.java
index d31929a..be66948 100644
--- a/json/src/test/java/org/apache/dto/SecondDTO.java
+++ b/json/src/test/java/org/apache/dto/SecondDTO.java
@@ -19,9 +19,11 @@
 
 package org.apache.dto;
 
+import java.util.Optional;
 import java.util.UUID;
 
 import org.apache.james.json.DTO;
+import org.apache.james.json.DTOConverter;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -31,15 +33,18 @@ public class SecondDTO implements DTO {
     private final String type;
     private final String id;
     private final String payload;
+    private final Optional<DTO> child;
 
     @JsonCreator
     public SecondDTO(
             @JsonProperty("type") String type,
             @JsonProperty("id") String id,
-            @JsonProperty("payload") String payload) {
+            @JsonProperty("payload") String payload,
+            @JsonProperty("child") Optional<DTO> child) {
         this.type = type;
         this.id = id;
         this.payload = payload;
+        this.child = child;
     }
 
     public String getType() {
@@ -54,8 +59,12 @@ public class SecondDTO implements DTO {
         return payload;
     }
 
+    public Optional<DTO> getChild() {
+        return child;
+    }
+
     @JsonIgnore
-    public SecondDomainObject toDomainObject() {
-        return new SecondDomainObject(UUID.fromString(id), payload);
+    public SecondDomainObject toDomainObject(DTOConverter<NestedType, DTO> converter) {
+        return new SecondDomainObject(UUID.fromString(id), payload, child.flatMap(converter::convert));
     }
 }
diff --git a/json/src/test/java/org/apache/dto/SecondDomainObject.java b/json/src/test/java/org/apache/dto/SecondDomainObject.java
index 30ac702..5c20fc8 100644
--- a/json/src/test/java/org/apache/dto/SecondDomainObject.java
+++ b/json/src/test/java/org/apache/dto/SecondDomainObject.java
@@ -20,15 +20,18 @@
 package org.apache.dto;
 
 import java.util.Objects;
+import java.util.Optional;
 import java.util.UUID;
 
 public class SecondDomainObject implements BaseType {
     private final UUID id;
     private final String payload;
+    private final Optional<NestedType> child;
 
-    public SecondDomainObject(UUID id, String payload) {
+    public SecondDomainObject(UUID id, String payload, Optional<NestedType> child) {
         this.id = id;
         this.payload = payload;
+        this.child = child;
     }
 
     public UUID getId() {
@@ -39,17 +42,22 @@ public class SecondDomainObject implements BaseType {
         return payload;
     }
 
+    public Optional<NestedType> getChild() {
+        return child;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         SecondDomainObject that = (SecondDomainObject) o;
         return Objects.equals(id, that.id) &&
+                Objects.equals(child, that.child) &&
                 Objects.equals(payload, that.payload);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(id, payload);
+        return Objects.hash(id, child, payload);
     }
 }
diff --git a/json/src/test/java/org/apache/dto/SecondDTO.java b/json/src/test/java/org/apache/dto/SecondNestedDTO.java
similarity index 73%
copy from json/src/test/java/org/apache/dto/SecondDTO.java
copy to json/src/test/java/org/apache/dto/SecondNestedDTO.java
index d31929a..9b86497 100644
--- a/json/src/test/java/org/apache/dto/SecondDTO.java
+++ b/json/src/test/java/org/apache/dto/SecondNestedDTO.java
@@ -19,43 +19,34 @@
 
 package org.apache.dto;
 
-import java.util.UUID;
-
 import org.apache.james.json.DTO;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class SecondDTO implements DTO {
+public class SecondNestedDTO implements DTO {
+    private final String bar;
     private final String type;
-    private final String id;
-    private final String payload;
 
     @JsonCreator
-    public SecondDTO(
-            @JsonProperty("type") String type,
-            @JsonProperty("id") String id,
-            @JsonProperty("payload") String payload) {
+    public SecondNestedDTO(@JsonProperty("bar") String bar,
+                           @JsonProperty("type") String type) {
+        this.bar = bar;
         this.type = type;
-        this.id = id;
-        this.payload = payload;
     }
 
-    public String getType() {
-        return type;
+    public String getBar() {
+        return bar;
     }
 
-    public String getId() {
-        return id;
-    }
-
-    public String getPayload() {
-        return payload;
+    @Override
+    public String getType() {
+        return type;
     }
 
     @JsonIgnore
-    public SecondDomainObject toDomainObject() {
-        return new SecondDomainObject(UUID.fromString(id), payload);
+    public SecondNestedType toDomainObject() {
+        return new SecondNestedType(bar);
     }
 }
diff --git a/json/src/test/java/org/apache/dto/SecondDomainObject.java b/json/src/test/java/org/apache/dto/SecondNestedType.java
similarity index 72%
copy from json/src/test/java/org/apache/dto/SecondDomainObject.java
copy to json/src/test/java/org/apache/dto/SecondNestedType.java
index 30ac702..0bbbf2f 100644
--- a/json/src/test/java/org/apache/dto/SecondDomainObject.java
+++ b/json/src/test/java/org/apache/dto/SecondNestedType.java
@@ -20,36 +20,28 @@
 package org.apache.dto;
 
 import java.util.Objects;
-import java.util.UUID;
 
-public class SecondDomainObject implements BaseType {
-    private final UUID id;
-    private final String payload;
+public class SecondNestedType implements NestedType {
+    final String bar;
 
-    public SecondDomainObject(UUID id, String payload) {
-        this.id = id;
-        this.payload = payload;
+    public SecondNestedType(String bar) {
+        this.bar = bar;
     }
 
-    public UUID getId() {
-        return id;
-    }
-
-    public String getPayload() {
-        return payload;
+    public String getBar() {
+        return bar;
     }
 
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
-        SecondDomainObject that = (SecondDomainObject) o;
-        return Objects.equals(id, that.id) &&
-                Objects.equals(payload, that.payload);
+        SecondNestedType that = (SecondNestedType) o;
+        return Objects.equals(bar, that.bar);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(id, payload);
+        return Objects.hash(bar);
     }
 }
diff --git a/json/src/test/java/org/apache/dto/TestModules.java b/json/src/test/java/org/apache/dto/TestModules.java
index 45c5418..ad4d04b 100644
--- a/json/src/test/java/org/apache/dto/TestModules.java
+++ b/json/src/test/java/org/apache/dto/TestModules.java
@@ -19,20 +19,44 @@
 
 package org.apache.dto;
 
+import org.apache.james.json.DTO;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.json.DTOModule;
 
 public interface TestModules {
+    TestNestedModule FIRST_NESTED = DTOModule
+        .forDomainObject(FirstNestedType.class)
+        .convertToDTO(FirstNestedDTO.class)
+        .toDomainObjectConverter(FirstNestedDTO::toDomainObject)
+        .toDTOConverter((domainObject, typeName) -> new FirstNestedDTO(
+            domainObject.getFoo(),
+            typeName))
+            .typeName("first-nested")
+        .withFactory(TestNestedModule::new);
+
+    TestNestedModule SECOND_NESTED = DTOModule
+        .forDomainObject(SecondNestedType.class)
+        .convertToDTO(SecondNestedDTO.class)
+        .toDomainObjectConverter(SecondNestedDTO::toDomainObject)
+        .toDTOConverter((domainObject, typeName) -> new SecondNestedDTO(
+            domainObject.getBar(),
+            typeName))
+        .typeName("second-nested")
+        .withFactory(TestNestedModule::new);
+
+    DTOConverter NESTED_CONVERTERS = DTOConverter.of(FIRST_NESTED, SECOND_NESTED);
 
     @SuppressWarnings("rawtypes")
     TestModule FIRST_TYPE = DTOModule
         .forDomainObject(FirstDomainObject.class)
         .convertToDTO(FirstDTO.class)
-        .toDomainObjectConverter(FirstDTO::toDomainObject)
+        .toDomainObjectConverter(dto -> dto.toDomainObject(NESTED_CONVERTERS))
         .toDTOConverter((domainObject, typeName) -> new FirstDTO(
             typeName,
             domainObject.getId(),
             domainObject.getTime().toString(),
-            domainObject.getPayload()))
+            domainObject.getPayload(),
+            NESTED_CONVERTERS.convert(domainObject.getChild())))
         .typeName("first")
         .withFactory(TestModule::new);
 
@@ -40,11 +64,12 @@ public interface TestModules {
     TestModule SECOND_TYPE = DTOModule
         .forDomainObject(SecondDomainObject.class)
         .convertToDTO(SecondDTO.class)
-        .toDomainObjectConverter(SecondDTO::toDomainObject)
+        .toDomainObjectConverter(dto -> dto.toDomainObject(NESTED_CONVERTERS))
         .toDTOConverter((domainObject, typeName) -> new SecondDTO(
             typeName,
             domainObject.getId().toString(),
-            domainObject.getPayload()))
+            domainObject.getPayload(),
+            NESTED_CONVERTERS.convert(domainObject.getChild())))
         .typeName("second")
         .withFactory(TestModule::new);
 
diff --git a/json/src/test/java/org/apache/dto/SecondDomainObject.java b/json/src/test/java/org/apache/dto/TestNestedModule.java
similarity index 60%
copy from json/src/test/java/org/apache/dto/SecondDomainObject.java
copy to json/src/test/java/org/apache/dto/TestNestedModule.java
index 30ac702..e67df12 100644
--- a/json/src/test/java/org/apache/dto/SecondDomainObject.java
+++ b/json/src/test/java/org/apache/dto/TestNestedModule.java
@@ -19,37 +19,12 @@
 
 package org.apache.dto;
 
-import java.util.Objects;
-import java.util.UUID;
+import org.apache.james.json.DTO;
+import org.apache.james.json.DTOModule;
 
-public class SecondDomainObject implements BaseType {
-    private final UUID id;
-    private final String payload;
+public class TestNestedModule<T extends NestedType, U extends DTO> extends DTOModule<T, U> {
 
-    public SecondDomainObject(UUID id, String payload) {
-        this.id = id;
-        this.payload = payload;
-    }
-
-    public UUID getId() {
-        return id;
-    }
-
-    public String getPayload() {
-        return payload;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        SecondDomainObject that = (SecondDomainObject) o;
-        return Objects.equals(id, that.id) &&
-                Objects.equals(payload, that.payload);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, payload);
+    protected TestNestedModule(DTOConverter<T, U> converter, DomainObjectConverter<T, U> toDomainObjectConverter, Class<T> domainObjectType, Class<U> dtoType, String typeName) {
+        super(converter, toDomainObjectConverter, domainObjectType, dtoType, typeName);
     }
 }


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