diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml index a92d657af8673df68b85264952515f03fb7879c9..f8d753f5d528032048c252681d424c6395df787e 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 0240ea1d8764f1f86974bc5ef385460410df4670..096ff2d2f6a411f9650626cf5b6019520899f1b4 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 b7f49d2e81af2af23a238f9f2ec55f5a207dc542..f547e8b37bfa85fd0d4be9af29dc8d413108275b 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 02e55b89e4c6895098bdcb2f0014932a02072f10..74969e75909567dd1bea6a1f783a57d51a6fd884 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 3b0ab87ca109d393e3df0e4a9525c512b97a5a89..ec0bcee4a4afb7e4a03efbb861cdc7548e682b41 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 0000000000000000000000000000000000000000..0ad86d064ce150bc341d74db49763941ed82e1cc --- /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 515d37444d5604812d1ccf8cbf06a3abcdf0a96a..428499d54c8b56b60aca5524d0a6eb71167626ec 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 30ad7b2f447b98448afc99edcd15de3c685a8108..895c8957e2ee1b81e9ebd8e1b3ee4418d3915cca 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 0000000000000000000000000000000000000000..64d27c8846dd5cd0654e7af502fded4231eb7b4e --- /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 5ed3a1e9cb3ec33fd3024d5cdba11fb50b9b4815..5770a4d82f4985ce47179e06cfd653593d4f2f32 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>