diff --git a/{{cookiecutter.app_name}}/domain/pom.xml b/{{cookiecutter.app_name}}/domain/pom.xml
new file mode 100644
index 0000000..b8c79b5
--- /dev/null
+++ b/{{cookiecutter.app_name}}/domain/pom.xml
@@ -0,0 +1,44 @@
+
+
+
+ {{cookiecutter.group_id}}
+ {{cookiecutter.artifact_id}}-parent
+ 1.0-SNAPSHOT
+
+ 4.0.0
+ domain
+
+
+ {{cookiecutter.group_id}}
+ domain-api
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+
+
+
+ com.societegenerale.commons
+ arch-unit-maven-plugin
+
+
+
+ com.societegenerale.commons.plugin.rules.NoStandardStreamRuleTest
+ com.societegenerale.commons.plugin.rules.NoJodaTimeRuleTest
+ com.societegenerale.commons.plugin.rules.NoJavaUtilDateRuleTest
+ com.societegenerale.commons.plugin.rules.NoPrefixForInterfacesRuleTest
+ com.societegenerale.commons.plugin.rules.NoPublicFieldRuleTest
+ com.societegenerale.commons.plugin.rules.NoInjectedFieldTest
+ com.societegenerale.commons.plugin.rules.NoAutowiredFieldTest
+
+
+
+
+
+
+
diff --git a/{{cookiecutter.app_name}}/domain/src/main/java/{{cookiecutter.package_name}}/domain/{{cookiecutter.domain_capitalized}}Domain.java b/{{cookiecutter.app_name}}/domain/src/main/java/{{cookiecutter.package_name}}/domain/{{cookiecutter.domain_capitalized}}Domain.java
new file mode 100644
index 0000000..72d382d
--- /dev/null
+++ b/{{cookiecutter.app_name}}/domain/src/main/java/{{cookiecutter.package_name}}/domain/{{cookiecutter.domain_capitalized}}Domain.java
@@ -0,0 +1,32 @@
+package {{cookiecutter.package_name}}.domain;
+
+import java.util.List;
+import lombok.NonNull;
+import {{cookiecutter.package_name}}.domain.exception.{{cookiecutter.domain_capitalized}}NotFoundException;
+import {{cookiecutter.package_name}}.domain.model.{{cookiecutter.domain_capitalized}};
+import {{cookiecutter.package_name}}.domain.port.Obtain{{cookiecutter.domain_capitalized}};
+import {{cookiecutter.package_name}}.domain.port.Request{{cookiecutter.domain_capitalized}};
+
+public class {{cookiecutter.domain_capitalized}}Domain implements Request{{cookiecutter.domain_capitalized}} {
+
+ private final Obtain{{cookiecutter.domain_capitalized}} obtain{{cookiecutter.domain_capitalized}};
+
+ public {{cookiecutter.domain_capitalized}}Domain() {
+ this(new Obtain{{cookiecutter.domain_capitalized}}() {});
+ }
+
+ public {{cookiecutter.domain_capitalized}}Domain(Obtain{{cookiecutter.domain_capitalized}} obtain{{cookiecutter.domain_capitalized}}) {
+ this.obtain{{cookiecutter.domain_capitalized}} = obtain{{cookiecutter.domain_capitalized}};
+ }
+
+ @Override
+ public List<{{cookiecutter.domain_capitalized}}> get{{cookiecutter.domain_plural_capitalized}}() {
+ return obtain{{cookiecutter.domain_capitalized}}.getAll{{cookiecutter.domain_plural_capitalized}}();
+ }
+
+ @Override
+ public {{cookiecutter.domain_capitalized}} get{{cookiecutter.domain_capitalized}}ByCode(@NonNull Long code) {
+ var {{cookiecutter.domain}} = obtain{{cookiecutter.domain_capitalized}}.get{{cookiecutter.domain_capitalized}}ByCode(code);
+ return {{cookiecutter.domain}}.orElseThrow(() -> new {{cookiecutter.domain_capitalized}}NotFoundException(code));
+ }
+}
diff --git a/{{cookiecutter.app_name}}/domain/src/test/java/{{cookiecutter.package_name}}/AcceptanceTest.java b/{{cookiecutter.app_name}}/domain/src/test/java/{{cookiecutter.package_name}}/AcceptanceTest.java
new file mode 100644
index 0000000..fb82876
--- /dev/null
+++ b/{{cookiecutter.app_name}}/domain/src/test/java/{{cookiecutter.package_name}}/AcceptanceTest.java
@@ -0,0 +1,92 @@
+package {{cookiecutter.package_name}};
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.List;
+import java.util.Optional;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import {{cookiecutter.package_name}}.domain.{{cookiecutter.domain_capitalized}}Domain;
+import {{cookiecutter.package_name}}.domain.exception.{{cookiecutter.domain_capitalized}}NotFoundException;
+import {{cookiecutter.package_name}}.domain.model.{{cookiecutter.domain_capitalized}};
+import {{cookiecutter.package_name}}.domain.port.Obtain{{cookiecutter.domain_capitalized}};
+
+@ExtendWith(MockitoExtension.class)
+public class AcceptanceTest {
+
+ @Test
+ @DisplayName("should be able to get {{cookiecutter.domain_plural}} when asked for {{cookiecutter.domain_plural}} from hard coded {{cookiecutter.domain_plural}}")
+ public void get{{cookiecutter.domain_plural_capitalized}}FromHardCoded() {
+ /*
+ Request{{cookiecutter.domain_capitalized}} - left side port
+ {{cookiecutter.domain_capitalized}}Domain - hexagon (domain)
+ Obtain{{cookiecutter.domain_capitalized}} - right side port
+ */
+ var request{{cookiecutter.domain_capitalized}} = new {{cookiecutter.domain_capitalized}}Domain(); // the {{cookiecutter.domain}} is hard coded
+ var {{cookiecutter.domain_plural}} = request{{cookiecutter.domain_capitalized}}.get{{cookiecutter.domain_plural_capitalized}}();
+ assertThat({{cookiecutter.domain_plural}})
+ .hasSize(1)
+ .extracting("description")
+ .contains(
+ "If you could read a leaf or tree\r\nyoud have no need of books.\r\n-- Alistair Cockburn (1987)");
+ }
+
+ @Test
+ @DisplayName("should be able to get {{cookiecutter.domain_plural}} when asked for {{cookiecutter.domain_plural}} from stub")
+ public void get{{cookiecutter.domain_plural_capitalized}}FromMockedStub(@Mock Obtain{{cookiecutter.domain_capitalized}} obtain{{cookiecutter.domain_capitalized}}) {
+ // Stub
+ var {{cookiecutter.domain}} =
+ {{cookiecutter.domain_capitalized}}.builder()
+ .code(1L)
+ .description(
+ "I want to sleep\r\nSwat the flies\r\nSoftly, please.\r\n\r\n-- Masaoka Shiki (1867-1902)")
+ .build();
+ Mockito.lenient().when(obtain{{cookiecutter.domain_capitalized}}.getAll{{cookiecutter.domain_plural_capitalized}}()).thenReturn(List.of({{cookiecutter.domain}}));
+ // hexagon
+ var request{{cookiecutter.domain_capitalized}} = new {{cookiecutter.domain_capitalized}}Domain(obtain{{cookiecutter.domain_capitalized}});
+ var {{cookiecutter.domain_plural}} = request{{cookiecutter.domain_capitalized}}.get{{cookiecutter.domain_plural_capitalized}}();
+ assertThat({{cookiecutter.domain_plural}})
+ .hasSize(1)
+ .extracting("description")
+ .contains(
+ "I want to sleep\r\nSwat the flies\r\nSoftly, please.\r\n\r\n-- Masaoka Shiki (1867-1902)");
+ }
+
+ @Test
+ @DisplayName("should be able to get {{cookiecutter.domain}} when asked for {{cookiecutter.domain}} by id from stub")
+ public void get{{cookiecutter.domain_capitalized}}ByIdFromMockedStub(@Mock Obtain{{cookiecutter.domain_capitalized}} obtain{{cookiecutter.domain_capitalized}}) {
+ // Given
+ // Stub
+ var code = 1L;
+ var description =
+ "I want to sleep\\r\\nSwat the flies\\r\\nSoftly, please.\\r\\n\\r\\n-- Masaoka Shiki (1867-1902)";
+ var expected{{cookiecutter.domain_capitalized}} = {{cookiecutter.domain_capitalized}}.builder().code(code).description(description).build();
+ Mockito.lenient()
+ .when(obtain{{cookiecutter.domain_capitalized}}.get{{cookiecutter.domain_capitalized}}ByCode(code))
+ .thenReturn(Optional.of(expected{{cookiecutter.domain_capitalized}}));
+ // When
+ var request{{cookiecutter.domain_capitalized}} = new {{cookiecutter.domain_capitalized}}Domain(obtain{{cookiecutter.domain_capitalized}});
+ var actual{{cookiecutter.domain_capitalized}} = request{{cookiecutter.domain_capitalized}}.get{{cookiecutter.domain_capitalized}}ByCode(code);
+ assertThat(actual{{cookiecutter.domain_capitalized}}).isNotNull().isEqualTo(expected{{cookiecutter.domain_capitalized}});
+ }
+
+ @Test
+ @DisplayName("should throw exception when asked for {{cookiecutter.domain}} by id that does not exists from stub")
+ public void getExceptionWhenAsked{{cookiecutter.domain_capitalized}}ByIdThatDoesNotExist(@Mock Obtain{{cookiecutter.domain_capitalized}} obtain{{cookiecutter.domain_capitalized}}) {
+ // Given
+ // Stub
+ var code = -1000L;
+ Mockito.lenient().when(obtain{{cookiecutter.domain_capitalized}}.get{{cookiecutter.domain_capitalized}}ByCode(code)).thenReturn(Optional.empty());
+ // When
+ var request{{cookiecutter.domain_capitalized}} = new {{cookiecutter.domain_capitalized}}Domain(obtain{{cookiecutter.domain_capitalized}});
+ // Then
+ assertThatThrownBy(() -> request{{cookiecutter.domain_capitalized}}.get{{cookiecutter.domain_capitalized}}ByCode(code))
+ .isInstanceOf({{cookiecutter.domain_capitalized}}NotFoundException.class)
+ .hasMessageContaining("{{cookiecutter.domain_capitalized}} with code " + code + " does not exist");
+ }
+}
diff --git a/{{cookiecutter.app_name}}/pom.xml b/{{cookiecutter.app_name}}/pom.xml
index ab40947..af650ec 100644
--- a/{{cookiecutter.app_name}}/pom.xml
+++ b/{{cookiecutter.app_name}}/pom.xml
@@ -35,14 +35,25 @@
domain-api
-
+
+
+ {{cookiecutter.group_id}}
+ domain-api
+ ${project.version}
+
+
+ {{cookiecutter.group_id}}
+ domain
+ ${project.version}
+
org.junit