From 27e5dfc6921da8d5c176ba3837d4f51e75c51039 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Wed, 3 Feb 2021 08:13:06 +0100 Subject: [PATCH] OZG-157 dummy implementation to create command --- goofy-server/pom.xml | 6 +++- .../vorgang/command/CommandController.java | 6 ++-- .../goofy/vorgang/command/CommandService.java | 16 ++++++++-- .../goofy/vorgang/command/VorgangCommand.java | 19 ++++++++++++ .../command/VorgangCommandProcessor.java | 2 +- .../test/java/de/itvsh/goofy/TestUtils.java | 31 +++++++++++++++++++ .../command/CommandControllerTest.java | 20 ++++++++++-- .../command/VorgangCommandTestFactory.java | 6 +++- .../command/createVorgangCommand.json.tmpl | 3 ++ pom.xml | 22 ++++++++----- 10 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 goofy-server/src/test/java/de/itvsh/goofy/TestUtils.java create mode 100644 goofy-server/src/test/resources/jsonTemplates/command/createVorgangCommand.json.tmpl diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml index a92d657af8..f8d753f5d5 100644 --- a/goofy-server/pom.xml +++ b/goofy-server/pom.xml @@ -85,11 +85,15 @@ <scope>runtime</scope> </dependency> - <!-- common lang --> + <!-- commons --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + </dependency> <!-- Test --> <dependency> diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandController.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandController.java index 0240ea1d87..096ff2d2f6 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandController.java @@ -7,6 +7,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseStatus; @@ -25,8 +26,9 @@ public class CommandController { @PostMapping @ResponseStatus(code = HttpStatus.CREATED) - public ResponseEntity<Void> createCommandByVorgang(@PathVariable String vorgangId, @PathVariable long vorgangVersion) { - var created = service.createVorgangCommand(vorgangId, vorgangVersion); + public ResponseEntity<Void> createCommandByVorgang(@PathVariable String vorgangId, @PathVariable long vorgangVersion, + @RequestBody VorgangCommand command) { + var created = service.createVorgangCommand(vorgangId, vorgangVersion, command); return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandService.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandService.java index b7f49d2e81..f547e8b37b 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/CommandService.java @@ -1,11 +1,23 @@ package de.itvsh.goofy.vorgang.command; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + import org.springframework.stereotype.Service; +import de.itvsh.goofy.vorgang.command.VorgangCommand.CommandStatus; + @Service class CommandService { - public VorgangCommand createVorgangCommand(String vorgangId, long version) { - return null; + private Map<String, VorgangCommand> idToCommand = new HashMap<>(); + + public VorgangCommand createVorgangCommand(String vorgangId, long version, VorgangCommand command) { + // FIXME(Replace dummy implementation) + + var newCommand = VorgangCommand.builder().id(UUID.randomUUID().toString()).status(CommandStatus.DONE).order(command.getOrder()).build(); + idToCommand.put(newCommand.getId(), newCommand); + return newCommand; } } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommand.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommand.java index 02e55b89e4..74969e7590 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommand.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommand.java @@ -1,12 +1,31 @@ package de.itvsh.goofy.vorgang.command; +import com.fasterxml.jackson.annotation.JsonIgnore; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; @Builder @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class VorgangCommand { + enum CommandStatus { + DONE; + } + + enum VorgangCommandOrder { + ANNEHMEN + } + + @JsonIgnore private String id; + @JsonIgnore + private CommandStatus status; + private VorgangCommandOrder order; } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommandProcessor.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommandProcessor.java index 3b0ab87ca1..ec0bcee4a4 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommandProcessor.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/command/VorgangCommandProcessor.java @@ -32,7 +32,7 @@ class VorgangCommandProcessor implements RepresentationModelProcessor<EntityMode private EntityModel<? extends Vorgang> addLinkIfTransactionAllowed(VorgangStatus newStatus, LinkRelation relation, Vorgang vorgang, EntityModel<? extends Vorgang> model) { if (vorgang.getStatus().isTransactionAllowedTo(newStatus)) { - return model.add(linkTo(methodOn(CommandByVorgangController.class).createCommandByVorgang(vorgang.getId(), 42)) + return model.add(linkTo(methodOn(CommandByVorgangController.class).createCommandByVorgang(vorgang.getId(), 42, null)) .withRel(relation)); } return model; diff --git a/goofy-server/src/test/java/de/itvsh/goofy/TestUtils.java b/goofy-server/src/test/java/de/itvsh/goofy/TestUtils.java new file mode 100644 index 0000000000..0ad86d064c --- /dev/null +++ b/goofy-server/src/test/java/de/itvsh/goofy/TestUtils.java @@ -0,0 +1,31 @@ +package de.itvsh.goofy; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.io.IOUtils; + +public class TestUtils { + private TestUtils() { + } + + public static InputStream loadFile(final String fileName) { + InputStream stream = TestUtils.class.getClassLoader().getResourceAsStream(fileName); + if (stream == null) { + throw new RuntimeException("File '" + fileName + "' not found."); // NOSONAR + } + return stream; + } + + public static String loadTextFile(final String fileName) { + try { + return IOUtils.toString(loadFile(fileName), "UTF-8"); + } catch (IOException e) { + throw new RuntimeException(e); // NOSONAR + } + } + + public static String loadTextFile(final String fileName, final String... args) { + return String.format(loadTextFile(fileName), (Object[]) args); + } +} diff --git a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/CommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/CommandControllerTest.java index 515d37444d..428499d54c 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/CommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/CommandControllerTest.java @@ -1,6 +1,7 @@ package de.itvsh.goofy.vorgang.command; import static de.itvsh.goofy.vorgang.command.CommandController.*; +import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -10,14 +11,19 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; 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 org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import de.itvsh.goofy.TestUtils; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; import de.itvsh.goofy.vorgang.command.CommandController.CommandByVorgangController; +import de.itvsh.goofy.vorgang.command.VorgangCommand.VorgangCommandOrder; class CommandControllerTest { @@ -39,12 +45,16 @@ class CommandControllerTest { void initTest() { mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); - when(service.createVorgangCommand(anyString(), anyLong())).thenReturn(VorgangCommandTestFactory.create()); + when(service.createVorgangCommand(anyString(), anyLong(), any())).thenReturn(VorgangCommandTestFactory.create()); } @Nested @DisplayName("Create Command by Vorgang") class CreateCommand { + + @Captor + private ArgumentCaptor<VorgangCommand> commandCaptor; + @DisplayName("should return CREATED") @Test void returnCreated() throws Exception { @@ -56,7 +66,8 @@ class CommandControllerTest { void callService() throws Exception { doRequest(); - verify(service).createVorgangCommand(VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION); + verify(service).createVorgangCommand(eq(VorgangHeaderTestFactory.ID), eq(VorgangHeaderTestFactory.VERSION), commandCaptor.capture()); + assertThat(commandCaptor.getValue().getOrder()).isEqualTo(VorgangCommandTestFactory.ORDER); } @DisplayName("should have location header") @@ -68,7 +79,10 @@ class CommandControllerTest { private ResultActions doRequest() throws Exception { return mockMvc - .perform(post(CommandByVorgangController.BY_VORGANG_PATH, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION)) + .perform(post(CommandByVorgangController.BY_VORGANG_PATH, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtils.loadTextFile("jsonTemplates/command/createVorgangCommand.json.tmpl", + VorgangCommandOrder.ANNEHMEN.name()))) .andExpect(status().is2xxSuccessful()); } } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/VorgangCommandTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/VorgangCommandTestFactory.java index 30ad7b2f44..895c8957e2 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/VorgangCommandTestFactory.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/command/VorgangCommandTestFactory.java @@ -2,9 +2,12 @@ package de.itvsh.goofy.vorgang.command; import java.util.UUID; +import de.itvsh.goofy.vorgang.command.VorgangCommand.VorgangCommandOrder; + public class VorgangCommandTestFactory { public static final String ID = UUID.randomUUID().toString(); + public static final VorgangCommandOrder ORDER = VorgangCommandOrder.ANNEHMEN; public static VorgangCommand create() { return createBuilder().build(); @@ -12,6 +15,7 @@ public class VorgangCommandTestFactory { public static VorgangCommand.VorgangCommandBuilder createBuilder() { return VorgangCommand.builder() - .id(ID); + .id(ID) + .order(ORDER); } } diff --git a/goofy-server/src/test/resources/jsonTemplates/command/createVorgangCommand.json.tmpl b/goofy-server/src/test/resources/jsonTemplates/command/createVorgangCommand.json.tmpl new file mode 100644 index 0000000000..64d27c8846 --- /dev/null +++ b/goofy-server/src/test/resources/jsonTemplates/command/createVorgangCommand.json.tmpl @@ -0,0 +1,3 @@ +{ + "order": "%s" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5ed3a1e9cb..5770a4d82f 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ <grpc.spring-boot-starter.version>2.10.1.RELEASE</grpc.spring-boot-starter.version> <spring-admin.version>2.3.1</spring-admin.version> <mapstruct.version>1.4.1.Final</mapstruct.version> + <commons-io.version>2.8.0</commons-io.version> <lorem.version>2.1</lorem.version> @@ -46,13 +47,13 @@ <scope>import</scope> </dependency> <!-- keycloak --> - <dependency> - <groupId>org.keycloak.bom</groupId> - <artifactId>keycloak-adapter-bom</artifactId> - <version>12.0.2</version> - <type>pom</type> - <scope>import</scope> - </dependency> + <dependency> + <groupId>org.keycloak.bom</groupId> + <artifactId>keycloak-adapter-bom</artifactId> + <version>12.0.2</version> + <type>pom</type> + <scope>import</scope> + </dependency> <dependency> <groupId>de.codecentric</groupId> @@ -60,6 +61,13 @@ <version>${spring-admin.version}</version> </dependency> + <!-- commons --> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>${commons-io.version}</version> + </dependency> + <!-- tools --> <dependency> <groupId>org.mapstruct</groupId> -- GitLab