diff --git a/enterprise-adapter/pom.xml b/enterprise-adapter/pom.xml index 96d272d79816e7c89ccb25e7294ac1ba79fc2752..362c7f196cf5511c026a170c6fdfd4c9357c3bb0 100644 --- a/enterprise-adapter/pom.xml +++ b/enterprise-adapter/pom.xml @@ -30,6 +30,20 @@ <groupId>de.itvsh.kop.eingangsadapter</groupId> <artifactId>common</artifactId> </dependency> + + <!--dev tools--> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct</artifactId> + </dependency> + + <!--test --> + <dependency> + <groupId>de.itvsh.kop.eingangsadapter</groupId> + <artifactId>common</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java new file mode 100644 index 0000000000000000000000000000000000000000..96ff9a79fd58081775581a678c3ee2c6869fcf22 --- /dev/null +++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java @@ -0,0 +1,29 @@ +package de.ozgcloud.eingang.enterprise.entry; + +import java.io.IOException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Controller +@ResponseBody +@RequestMapping("antrag") +public class EntryController { + + @Autowired + private EntryDataMapper mapper; + + @ResponseStatus(HttpStatus.ACCEPTED) + @PostMapping(consumes = "multipart/form-data", produces = MediaType.APPLICATION_JSON_VALUE) + public void receiveAntrag(@RequestPart Resource formData) throws IOException { + mapper.mapEntryData(formData.getInputStream()); + } +} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryData.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryData.java index fd0a4ed23de2012b532a795ba688ada1262ecee3..ac18bfda3d1d8dc20d0a69e22d78aeff1a06fc22 100644 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryData.java +++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryData.java @@ -35,11 +35,4 @@ public class EntryData { private String address; } } - - @Builder - @Getter - @Jacksonized - public static class EntryFormData { - - } } diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java index bb40354bfc7e8fe34cc7464d06c60789d1dc7d92..1c2c5340499d72c4101fc52bbbd40ddec37c3c2d 100644 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java +++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java @@ -15,10 +15,11 @@ class EntryDataMapper { @Autowired private ObjectMapper objectMapper; + @Autowired + private FormDataMapper formDataMapper; public FormData mapEntryData(InputStream request) { - // TODO Auto-generated method stub - return null; + return formDataMapper.mapEntryData(readRequest(request)); } EntryData readRequest(InputStream request) { @@ -29,4 +30,5 @@ class EntryDataMapper { } } + } diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..6bf2030f3366f1c47d919fdf36c3c7494e40ab4c --- /dev/null +++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java @@ -0,0 +1,38 @@ +package de.ozgcloud.eingang.enterprise.entry; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormHeader; +import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; + +@Mapper +public interface FormDataMapper { + + @Mapping(target = "antragsteller", ignore = true) + @Mapping(target = "attachment", ignore = true) + @Mapping(target = "attachments", ignore = true) + @Mapping(target = "numberOfAttachments", ignore = true) + @Mapping(target = "representation", ignore = true) + @Mapping(target = "representations", ignore = true) + @Mapping(target = "numberOfRepresentations", ignore = true) + + @Mapping(target = "id", ignore = true) + @Mapping(target = "header", source = "control") + + @Mapping(target = "zustaendigeStelle", source = "control.zustaendigeStelle") + FormData mapEntryData(EntryData entryData); + + @Mapping(target = "createdAt", ignore = true) + @Mapping(target = "formEngineName", constant = "EnterpriseSoftware") + @Mapping(target = "requestId", source = "transactionId") + @Mapping(target = "sender", ignore = true) // TODO fill from authentication + @Mapping(target = "serviceKonto", ignore = true) + FormHeader mapHeader(EntryData.ControlData controlData); + + default ZustaendigeStelle fromId(String organisationsEinheitenId) { + return ZustaendigeStelle.builder().organisationseinheitenId(organisationsEinheitenId).build(); + } + +} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryControllerTest.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bb94507c82029ff753428b9099c11a1f6329d8dc --- /dev/null +++ b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryControllerTest.java @@ -0,0 +1,72 @@ +package de.ozgcloud.eingang.enterprise.entry; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.io.InputStream; + +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.BeforeEach; +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.mock.web.MockMultipartFile; +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.kop.common.test.TestUtils; +import lombok.SneakyThrows; + +class EntryControllerTest { + + @InjectMocks + private EntryController controller; + + @Mock + private EntryDataMapper mapper; + + private MockMvc mockMvc; + + @BeforeEach + void init() { + mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); + } + + @Nested + class ReceiveAntrag { + + @Captor + private ArgumentCaptor<InputStream> streamCaptor; + + @Test + @SneakyThrows + void shouldReturnAccepted() { + doPostRequest().andExpect(status().isAccepted()); + } + + @Test + @SneakyThrows + void shouldCallMapper() { + var request = TestUtils.loadTextFile("request/simple.json"); + + doPostRequest(); + + verify(mapper).mapEntryData(streamCaptor.capture()); + var inputBytes = IOUtils.readFully(streamCaptor.getValue(), request.getBytes().length); + assertThat(inputBytes).hasSameSizeAs(request.getBytes()).isEqualTo(request.getBytes()); + } + + @SneakyThrows + private ResultActions doPostRequest() { + return mockMvc.perform(multipart("/antrag") + .file(new MockMultipartFile("formData", TestUtils.loadTextFile("request/simple.json").getBytes()))); + } + } + +} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapperTest.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapperTest.java index 9ae7f427464b5c23530855e1fbee2e88ef82565d..238ce95c1997b70c0a76bdc323c0078eaff7fb67 100644 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapperTest.java +++ b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapperTest.java @@ -1,40 +1,79 @@ package de.ozgcloud.eingang.enterprise.entry; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.io.InputStream; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.Spy; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import de.itvsh.kop.common.test.TestUtils; +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; +import lombok.SneakyThrows; class EntryDataMapperTest { + @Spy @InjectMocks private EntryDataMapper mapper; + @Mock + private FormDataMapper formDataMapper; @Spy - private ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + private ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); @Nested class TestMappingEntryData { + private InputStream jsonInput = TestUtils.loadFile("request/simple.json"); + @Nested class TestReadRequest { @Test void shouldReadJson() { - var jsonInput = TestUtils.loadFile("request/simple.json"); - var read = mapper.readRequest(jsonInput); assertThat(read).usingRecursiveComparison().isEqualTo(EntryDataTestFactory.create()); } } + @Test + void shouldReadRequest() { + mapper.mapEntryData(jsonInput); + + verify(mapper).readRequest(jsonInput); + } + + @Test + @SneakyThrows + void shouldCallFormDataMapper() { + var entryData = EntryDataTestFactory.create(); + doReturn(entryData).when(objectMapper).readValue(any(InputStream.class), Mockito.<Class<EntryData>>any()); + + mapper.mapEntryData(jsonInput); + + verify(formDataMapper).mapEntryData(entryData); + } + + @Test + void shouldReturnMappedResult() { + FormData formData = FormDataTestFactory.create(); + when(formDataMapper.mapEntryData(any())).thenReturn(formData); + + var result = mapper.mapEntryData(jsonInput); + + assertThat(result).isSameAs(formData); + } } } diff --git a/enterprise-adapter/src/test/resources/request/simple.json b/enterprise-adapter/src/test/resources/request/simple.json index bd399f1cbee2c2fa7a4f2e677b19540199d8924b..f364c582730cb9d53566e23a5110878122e7156f 100644 --- a/enterprise-adapter/src/test/resources/request/simple.json +++ b/enterprise-adapter/src/test/resources/request/simple.json @@ -26,7 +26,7 @@ }, "nachname": { "label": "Nachname", - "stringValue": "Test" + "stringValue": "Täst" } } }