diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java b/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java index 86ab1dac41cdd74d3173b50c733a8d339ee47bdd..02b27c1a4f34a300244bc68e25ab3fcee78217f6 100644 --- a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java +++ b/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java @@ -5,7 +5,6 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.nio.file.Files; -import java.util.List; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; @@ -24,10 +23,9 @@ import org.springframework.core.io.Resource; import org.springframework.test.context.ActiveProfiles; import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; +import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; import de.ozgcloud.eingang.router.VorgangRemoteService; -import de.ozgcloud.vorgang.common.GrpcObject; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcPostfachAddress; import lombok.SneakyThrows; @ActiveProfiles({ "local", "itcase" }) @@ -37,6 +35,7 @@ class SendFormEndpointITCase { private final static String FILE_BASE_PATH = "classpath:formular/"; private final static String FORMULAR_JSON = "RequestJsonContent.json"; + private final static String FORMULAR_POSTFACH_ID = "51522620-03d2-4507-b1f0-08d86920efed"; @Autowired private ApplicationContext applicationContext; @@ -49,8 +48,6 @@ class SendFormEndpointITCase { @Captor private ArgumentCaptor<FormData> formDataCaptor; @Captor - private ArgumentCaptor<GrpcEingang> grpcEingangCaptor; - @Captor private ArgumentCaptor<Optional<String>> organisationsEinheitIdCaptor; @DisplayName("Receive form") @@ -75,7 +72,7 @@ class SendFormEndpointITCase { void shouldCallRemoteService() { callEndpoint(); - verify(vorgangRemoteService).createVorgang(any(FormData.class), any(GrpcEingang.class), any()); + verify(vorgangRemoteService).createVorgang(any(FormData.class), any()); } @DisplayName("service konto") @@ -86,21 +83,21 @@ class SendFormEndpointITCase { void shouldExist() { callEndpoint(); - assertThat(grpcEingangCaptor.getValue().getHeader().getServiceKonto()).isNotNull(); + assertThat(formDataCaptor.getValue().getHeader().getServiceKonto()).isNotNull(); } @Test void shouldContainsType() { callEndpoint(); - assertThat(grpcEingangCaptor.getValue().getHeader().getServiceKonto().getType()).isEqualTo("OSI"); + assertThat(formDataCaptor.getValue().getHeader().getServiceKonto().getType()).isEqualTo("OSI"); } @Test void shouldContainsPostfachAddress() { callEndpoint(); - assertThat(grpcEingangCaptor.getValue().getHeader().getServiceKonto().getPostfachAddressesList()).hasSize(1); + assertThat(formDataCaptor.getValue().getHeader().getServiceKonto().getPostfachAddresses()).hasSize(1); } @Nested @@ -124,15 +121,12 @@ class SendFormEndpointITCase { void shouldContainsIdentifier() { callEndpoint(); - assertThat(getPostfachAddress().getIdentifier()).isInstanceOf(GrpcObject.class); - assertThat(getPostfachAddress().getIdentifier().getPropertyList()).hasSize(1); - assertThat(getPostfachAddress().getIdentifier().getPropertyList().get(0).getName()).isEqualTo("postfachId"); - assertThat(getPostfachAddress().getIdentifier().getPropertyList().get(0).getValue(0)) - .isEqualTo("51522620-03d2-4507-b1f0-08d86920efed"); + assertThat(getPostfachAddress().getIdentifier()).isInstanceOf(StringBasedIdentifier.class); + assertThat(((StringBasedIdentifier) getPostfachAddress().getIdentifier()).getPostfachId()).isEqualTo(FORMULAR_POSTFACH_ID); } - private GrpcPostfachAddress getPostfachAddress() { - List<GrpcPostfachAddress> addresses = grpcEingangCaptor.getValue().getHeader().getServiceKonto().getPostfachAddressesList(); + private PostfachAddress getPostfachAddress() { + var addresses = formDataCaptor.getValue().getHeader().getServiceKonto().getPostfachAddresses(); assertThat(addresses).isNotEmpty(); return addresses.get(0); } @@ -142,7 +136,7 @@ class SendFormEndpointITCase { private void callEndpoint() { endpoint.receiveForm(request); - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), grpcEingangCaptor.capture(), organisationsEinheitIdCaptor.capture()); + verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), organisationsEinheitIdCaptor.capture()); } private Resource getResource(String fileName) { diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java index 17c560fb68e7670a05e0dd8feb2102cbc15fd609..54523201fd281dea6af56fdf32489b5e0ead3316 100644 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java +++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java @@ -35,7 +35,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.util.Collection; import java.util.List; -import java.util.Optional; +import java.util.UUID; import javax.xml.namespace.QName; import javax.xml.transform.Source; @@ -51,9 +51,11 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.ApplicationContext; import org.springframework.core.io.Resource; import org.springframework.oxm.jaxb.Jaxb2Marshaller; @@ -64,12 +66,17 @@ import org.springframework.ws.test.server.ResponseMatchers; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory; +import de.ozgcloud.eingang.router.ManagableStub; +import de.ozgcloud.eingang.router.VorgangManagerServerResolver; import de.ozgcloud.eingang.router.VorgangRemoteService; +import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; import de.ozgcloud.vorgang.vorgang.GrpcAntragsteller; import de.ozgcloud.vorgang.vorgang.GrpcEingang; import de.ozgcloud.vorgang.vorgang.GrpcFormData; import de.ozgcloud.vorgang.vorgang.GrpcIncomingFile; import de.ozgcloud.vorgang.vorgang.GrpcIncomingFileGroup; +import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; +import io.grpc.Channel; import lombok.SneakyThrows; @SpringBootTest @@ -86,20 +93,34 @@ class FormDataEndpointITCase { @Autowired private ApplicationContext applicationContext; - @MockBean + @SpyBean private VorgangRemoteService vorgangRemoteService; + @MockBean + private VorgangManagerServerResolver resolver; + + @Mock + private ManagableStub<VorgangServiceBlockingStub> vorgangManageableServiceStub; + @Mock + private VorgangServiceBlockingStub vorgangServiceStub; + @Mock + private ManagableStub<BinaryFileServiceStub> binaryFileManageableServiceStub; + @Mock + private BinaryFileServiceStub binaryFileServiceStub; + + @Mock + private Channel channel; @Captor private ArgumentCaptor<FormData> formDataCaptor; @Captor private ArgumentCaptor<GrpcEingang> grpcEingangCaptor; - @Captor - private ArgumentCaptor<Optional<String>> organisationsEinheitIdCaptor; private MockWebServiceClient mockClient; private DepositData depositData; + private final String vorgangId = UUID.randomUUID().toString(); + @BeforeAll static void setupMarshaller() { marshaller = new Jaxb2Marshaller(); @@ -109,6 +130,16 @@ class FormDataEndpointITCase { @BeforeEach void initTest() { mockClient = MockWebServiceClient.createClient(applicationContext); + + when(resolver.resolveVorgangServiceBlockingStubByOrganisationseinheitenId(any())).thenReturn(vorgangManageableServiceStub); + when(vorgangManageableServiceStub.get()).thenReturn(vorgangServiceStub); + when(vorgangServiceStub.getChannel()).thenReturn(channel); + when(channel.authority()).thenReturn("authorityDummy"); + + when(resolver.resolveBinaryFileServiceStubByOrganisationsEinheitId(any())).thenReturn(binaryFileManageableServiceStub); + when(binaryFileManageableServiceStub.get()).thenReturn(binaryFileServiceStub); + + doReturn(vorgangId).when(vorgangRemoteService).createVorgang(any(), any(), any(), any()); } @DisplayName("send antrag with many attachments") @@ -154,8 +185,7 @@ class FormDataEndpointITCase { assertThat(representationVendorIds).containsExactly( XML_ATTACHMENT_ID, XML_ROHFORM_ATTACHMENT_ID, - XML_ORIGINALFORM_ATTACHMENT_ID - ); + XML_ORIGINALFORM_ATTACHMENT_ID); } @DisplayName("should have attachments") @@ -182,8 +212,7 @@ class FormDataEndpointITCase { PDF2_ATTACHMENT_ID, ODT_ATTACHMENT_ID, JPG_ATTACHMENT_ID, - PNG_ATTACHMENT_ID - ); + PNG_ATTACHMENT_ID); } @DisplayName("should have organisationseinheitenID") @@ -191,9 +220,6 @@ class FormDataEndpointITCase { void shouldHaveOrganisationseinheitenId() { sendDepositAndCaptureCreateVorgang(); - var oeid = organisationsEinheitIdCaptor.getValue(); - assertThat(oeid).hasValue(ORGANISATIONSEINHEITEN_ID); - var eingang = grpcEingangCaptor.getValue(); assertThat(eingang.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEITEN_ID); } @@ -211,8 +237,7 @@ class FormDataEndpointITCase { withEmptyName(createPdf()), createPdf(), withEmptyName(createPng()), - createPng() - )); + createPng())); } private Attachment withEmptyName(Attachment attachment) { @@ -264,7 +289,7 @@ class FormDataEndpointITCase { .andExpect(ResponseMatchers.noFault()) .andExpect(ResponseMatchers.payload(getResource(RESPONSE))); - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), grpcEingangCaptor.capture(), organisationsEinheitIdCaptor.capture()); + verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), grpcEingangCaptor.capture(), any(), any()); } @SneakyThrows @@ -290,7 +315,7 @@ class FormDataEndpointITCase { void shouldSendRequest() { sendRequest(); - verify(vorgangRemoteService).createVorgang(any(FormData.class), any(GrpcEingang.class), any()); + verify(vorgangRemoteService).createVorgang(any(FormData.class), any(GrpcEingang.class), any(), any()); } @Nested @@ -318,7 +343,7 @@ class FormDataEndpointITCase { void validateOrganisationsEinheitId() { sendRequest(); - assertThat(organisationsEinheitIdCaptor.getValue()).isPresent().hasValue("10363455"); + assertThat(grpcEingangCaptor.getValue().getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo("10363455"); } @Test @@ -473,7 +498,7 @@ class FormDataEndpointITCase { void shouldHaveOrgaId() { sendWebserviceRequest(SOAP_REQUEST_OTHER_NAME); - verify(vorgangRemoteService).createVorgang(any(), grpcEingangCaptor.capture(), any()); + verify(vorgangRemoteService).createVorgang(any(), grpcEingangCaptor.capture(), any(), any()); assertThat(grpcEingangCaptor.getValue().getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo("0815"); } @@ -549,7 +574,7 @@ class FormDataEndpointITCase { private GrpcFormData requestFormData() { sendWebserviceRequest(REQUEST_XML_NAME); - verify(vorgangRemoteService).createVorgang(any(), grpcEingangCaptor.capture(), any()); + verify(vorgangRemoteService).createVorgang(any(), grpcEingangCaptor.capture(), any(), any()); return grpcEingangCaptor.getValue().getFormData(); } } @@ -560,7 +585,7 @@ class FormDataEndpointITCase { .andExpect(ResponseMatchers.noFault()) .andExpect(ResponseMatchers.payload(getResource(RESPONSE))); - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), grpcEingangCaptor.capture(), organisationsEinheitIdCaptor.capture()); + verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), grpcEingangCaptor.capture(), any(), any()); return response; } diff --git a/router/src/main/java/de/ozgcloud/eingang/router/VorgangService.java b/router/src/main/java/de/ozgcloud/eingang/router/VorgangService.java index 08e4bddd5d01e6c049f7e0da2256555da694b919..de97243af9a356da303522e4555b1509b540dc16 100644 --- a/router/src/main/java/de/ozgcloud/eingang/router/VorgangService.java +++ b/router/src/main/java/de/ozgcloud/eingang/router/VorgangService.java @@ -23,11 +23,14 @@ */ package de.ozgcloud.eingang.router; +import java.util.List; import java.util.Optional; import org.springframework.stereotype.Service; import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormHeader; +import de.ozgcloud.eingang.common.formdata.ServiceKonto; import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; import lombok.AllArgsConstructor; @@ -55,7 +58,8 @@ public class VorgangService { } private boolean hasNoPostfachAddress(FormData formData) { - return formData.getHeader().getServiceKonto().getPostfachAddresses().isEmpty(); + return Optional.ofNullable(formData.getHeader()).map(FormHeader::getServiceKonto).map(ServiceKonto::getPostfachAddresses).map(List::isEmpty) + .orElse(true); } private FormData clearServiceKonto(FormData formData) { diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangServiceTest.java index c5745c2a12f2bcca89eb17bb88f713ed67f3541e..2db3d04b7e3ad7bdb2240c7a1a66d8b39cbb4ca8 100644 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangServiceTest.java +++ b/router/src/test/java/de/ozgcloud/eingang/router/VorgangServiceTest.java @@ -24,6 +24,7 @@ package de.ozgcloud.eingang.router; import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Optional; @@ -108,5 +109,14 @@ class VorgangServiceTest { assertThat(consistentFormData.getHeader().getServiceKonto()).isEqualTo(FormHeaderTestFactory.SERVICE_KONTO); } + + @DisplayName("should proceed without exception on missing serviceKonto") + @Test + void shouldProceedWithoutException() { + var formDataWithoutServiceKonto = FormDataTestFactory.createBuilder() + .header(FormHeaderTestFactory.createBuilder().serviceKonto(null).build()).build(); + + assertDoesNotThrow(() -> service.preserveConsistency(formDataWithoutServiceKonto)); + } } } \ No newline at end of file