diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..fa1466b7ef0d476c42fbef9ce64e2cf96e00ad05 --- /dev/null +++ b/bescheid-manager/pom.xml @@ -0,0 +1,40 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>de.itvsh.kop.common</groupId> + <artifactId>kop-common-parent</artifactId> + <version>1.7.0</version> + <relativePath /> + </parent> + + <groupId>de.ozgcloud.bescheid</groupId> + <artifactId>bescheid-manager</artifactId> + <name>OZG-Cloud Bescheid Manager</name> + <version>1.0.0-SNAPSHOT</version> + + <properties> + <pluto.version>1.12.0-SNAPSHOT</pluto.version> + </properties> + + <dependencies> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-interface</artifactId> + </dependency> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-command</artifactId> + <version>${pluto.version}</version> + </dependency> + + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-command</artifactId> + <version>${pluto.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..9b05e714cdf1a1b1bffaeb21aa819040f7df1959 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java @@ -0,0 +1,43 @@ +package de.ozgcloud.bescheid; + +import java.time.LocalDate; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import de.itvsh.ozg.pluto.command.Command; +import de.itvsh.ozg.pluto.command.CommandCreatedEvent; + +@Component +class BescheidEventListener { + + public static final String ORDER = "CREATE_BESCHEID"; + + private static final String IS_CREATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_COMMAND.test(event.getSource())}"; + + public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> command.getOrder().equals(ORDER); + + static final String BESCHEID_VOM_BODYKEY = "bescheidVom"; + static final String GENEHMIGT_BODYKEY = "genehmigt"; + + @Autowired + private BescheidService service; + + @EventListener(condition = IS_CREATE_BESCHEID) + public void createBescheid(CommandCreatedEvent event) { + service.createBescheid(createRequest(event.getSource().getBodyObject())); + } + + private BescheidRequest createRequest(Map<String, Object> eventBody) { + var builder = BescheidRequest.builder(); + + Optional.ofNullable(eventBody.get(BESCHEID_VOM_BODYKEY)).map(LocalDate.class::cast).ifPresent(builder::bescheidVom); + Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)).map(Boolean.class::cast).ifPresent(builder::genehmigt); + + return builder.build(); + } +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..d5aa5798e6a60d6c0cd9252ddb00805c32e699c4 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java @@ -0,0 +1,14 @@ +package de.ozgcloud.bescheid; + +import java.time.LocalDate; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class BescheidRequest { + + private LocalDate bescheidVom; + private boolean genehmigt; +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java new file mode 100644 index 0000000000000000000000000000000000000000..ae4f6ca50ae5c77d989b05274e064f0330e265d3 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java @@ -0,0 +1,13 @@ +package de.ozgcloud.bescheid; + +import org.springframework.stereotype.Service; + +@Service +class BescheidService { + + public void createBescheid(BescheidRequest request) { + // TODO Auto-generated method stub + + } + +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..b1ce78f231cea6aa2bba69034f6ce9da00af99da --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java @@ -0,0 +1,46 @@ +package de.ozgcloud.bescheid; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.ApplicationEventPublisher; + +import de.itvsh.kop.common.test.ITCase; +import de.itvsh.ozg.pluto.command.Command; +import de.itvsh.ozg.pluto.command.CommandCreatedEventTestFactory; +import de.itvsh.ozg.pluto.command.CommandTestFactory; + +@ITCase +class BescheidEventListenerITCase { + + @Autowired + private ApplicationEventPublisher publisher; + + @MockBean + private BescheidService service; + + @Nested + class TestCreateBesched { + + private Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.ORDER).build(); + + @Test + void shouldCallService() { + publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); + + verify(service).createBescheid(any()); + } + + @Test + void shouldNotReactOnOtherOrder() { + publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(CommandTestFactory.createBuilder().order("OTHER").build())); + + verifyNoInteractions(service); + } + } + +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..fbe026513714e7e4ff751aa441c050a797432997 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java @@ -0,0 +1,47 @@ +package de.ozgcloud.bescheid; + +import static de.ozgcloud.bescheid.BescheidEventListener.*; +import static de.ozgcloud.bescheid.BescheidRequestTestFactory.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Map; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import de.itvsh.ozg.pluto.command.Command; +import de.itvsh.ozg.pluto.command.CommandCreatedEventTestFactory; +import de.itvsh.ozg.pluto.command.CommandTestFactory; + +class BescheidEventListenerTest { + + @InjectMocks + private BescheidEventListener listener; + + @Mock + private BescheidService service; + + @Nested + class TestCreateBescheid { + + @Captor + private ArgumentCaptor<BescheidRequest> requestCaptor; + private Command command = CommandTestFactory.createBuilder() + .bodyObject(Map.of(BESCHEID_VOM_BODYKEY, BESCHEID_VOM, GENEHMIGT_BODYKEY, GENEHMIGT)) + .build(); + + @Test + void shouldCallService() { + listener.createBescheid(CommandCreatedEventTestFactory.withCommand(command)); + + verify(service).createBescheid(requestCaptor.capture()); + assertThat(requestCaptor.getValue()).usingRecursiveComparison().isEqualTo(BescheidRequestTestFactory.create()); + } + } + +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..09b4686cedaf3d7713e555b9185d4af8a3056221 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java @@ -0,0 +1,21 @@ +package de.ozgcloud.bescheid; + +import java.time.LocalDate; + +public class BescheidRequestTestFactory { + + static final String BESCHEID_VOM_STRING = "2023-01-04"; + static final LocalDate BESCHEID_VOM = LocalDate.parse(BESCHEID_VOM_STRING); + static final boolean GENEHMIGT = true; + + static BescheidRequest create() { + return createBuilder().build(); + } + + static BescheidRequest.BescheidRequestBuilder createBuilder() { + return BescheidRequest.builder() + .bescheidVom(BESCHEID_VOM) + .genehmigt(GENEHMIGT); + + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..de2313e4f7a3c241a4f314c8e7b267a7f443c72f --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java @@ -0,0 +1,10 @@ +package de.ozgcloud.bescheid; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan({ "de.ozgcloud.*", "de.itvsh.*" }) +public class BescheidTestApplication { + +} diff --git a/bescheid-manager/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/bescheid-manager/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension new file mode 100644 index 0000000000000000000000000000000000000000..79b126e6cdb86bec1f4f08c205de8961bde1934a --- /dev/null +++ b/bescheid-manager/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -0,0 +1 @@ +org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/bescheid-manager/src/test/resources/junit-platform.properties b/bescheid-manager/src/test/resources/junit-platform.properties new file mode 100644 index 0000000000000000000000000000000000000000..1cebb76d5a58ac034b2627d12411d82d1e85821e --- /dev/null +++ b/bescheid-manager/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandCreatedEventTestFactory.java b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandCreatedEventTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..6b3a6241f9adc95a33f7ea54472e3f55dce3f49b --- /dev/null +++ b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandCreatedEventTestFactory.java @@ -0,0 +1,13 @@ +package de.itvsh.ozg.pluto.command; + +public class CommandCreatedEventTestFactory { + + public static CommandCreatedEvent create() { + return new CommandCreatedEvent(CommandTestFactory.create()); + } + + public static CommandCreatedEvent withCommand(Command command) { + return new CommandCreatedEvent(command); + } + +} diff --git a/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..02a27895aeba9eac5974353c8f55973dd0d45772 --- /dev/null +++ b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java @@ -0,0 +1,18 @@ +package de.itvsh.ozg.pluto.command; + +import java.util.Map; + +public class CommandTestFactory { + + public static final String ORDER = "DO_TEST"; + + public static Command create() { + return createBuilder().build(); + } + + public static TestCommand.TestCommandBuilder createBuilder() { + return TestCommand.builder() + .body(Map.of()) + .bodyObject(Map.of()); + } +} diff --git a/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/TestCommand.java b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/TestCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..40dbdb44adb39c130e5d454f1ed36dbf4cdcc2f1 --- /dev/null +++ b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/TestCommand.java @@ -0,0 +1,32 @@ +package de.itvsh.ozg.pluto.command; + +import java.time.ZonedDateTime; +import java.util.Map; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class TestCommand implements Command { + + private String id; + private String vorgangId; + private String relationId; + private long relationVersion; + + private String order; + + private ZonedDateTime createdAt; + private ZonedDateTime finishedAt; + private String createdBy; + private String createdByName; + + private CommandStatus status; + + private Map<String, Object> bodyObject; + private Map<String, String> body; + + private String errorMessage; + +} diff --git a/pom.xml b/pom.xml index 4ad85b176adb8135b289fda5bdf6b4057123e162..e529cbcac1dc607547cc8a67c71a66a8f4a7fecb 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,7 @@ <module>pluto-utils</module> <module>notification-manager</module> <module>pluto-command</module> + <module>bescheid-manager</module> </modules> <build>