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 1c2c5340499d72c4101fc52bbbd40ddec37c3c2d..189ebcc7becbb1b9aa524efac4555d25e3fe5198 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 @@ -28,7 +28,5 @@ class EntryDataMapper { } catch (IOException e) { throw new ReadingRequestException(e); } - } - } diff --git a/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java b/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java index 3f308dd3d9173e02b78ec94966f615ea9398bd98..a9efb992a4a141f06505a073b64460fa38f78bf5 100644 --- a/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java +++ b/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java @@ -31,6 +31,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.validation.annotation.Validated; +import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -43,9 +44,10 @@ public class GrpcClientsProperties { private Map<String, ClientProperty> client; + @Builder @Getter @Setter - static class ClientProperty { + public static class ClientProperty { @NotEmpty private String address; private String negotationType = "TLS"; diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java index 99ed3490b7a1f664d5209441d450924b4a28a942..e9264435bf6fe81dc13146d724f3f7562a26aba4 100644 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java +++ b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java @@ -69,8 +69,7 @@ class VorgangManagerListPropertiesTestFactory { } static GrpcClientsProperties createClientProperties() { - var property = new ClientProperty(); - property.setAddress(ADDRESS); + var property = new ClientProperty(ADDRESS, "TLS"); var properties = new GrpcClientsProperties(); properties.setClient(Map.of(CHANNEL_NAME, property)); return properties; diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java index ccf6f3ce4aad5162e9364c079bf07856bdc74a1d..c42fc60a26aeb1e12dcc51249d086181fe677b96 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java @@ -65,6 +65,6 @@ public class SemantikAdapter { } private FormData parseByFormAdapter(FormData formData) { - return formBasedAdapter.parseFormData(formData); + return formBasedAdapter.adaptFormData(formData); } } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java index c234ffb21472a2cba5a430312eab492b72982e43..64a5c44af69caffef810a2b4c8a8de077f6d44ac 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java @@ -27,7 +27,7 @@ import de.ozgcloud.eingang.common.formdata.FormData; interface FormBasedMapper { - FormData parseFormData(FormData formData); + FormData adaptFormData(FormData formData); boolean isResponsible(FormData formData); } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java index 823879bd947e3526e7931808bfdbc9b62749264e..a5121e8d8295c20eac12701362e33522d390fedf 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java @@ -23,41 +23,24 @@ */ package de.ozgcloud.eingang.semantik.formbased; -import java.util.Collections; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.ozgcloud.eingang.common.formdata.FormData; +import lombok.RequiredArgsConstructor; @Service +@RequiredArgsConstructor public class FormBasedSemantikAdapter { - @Autowired(required = false) - private List<FormBasedMapper> mappers = Collections.emptyList(); - - public FormData parseFormData(FormData formData) { - - return new FormDataProcessor().process(formData); - } - - class FormDataProcessor { - private FormData processedFormData; - - FormData process(FormData originalFormData) { - processedFormData = originalFormData; - mappers.stream() - .filter(mapper -> mapper.isResponsible(processedFormData)) - .forEach(this::parseWithMapper); - - return processedFormData; - } - - private void parseWithMapper(FormBasedMapper mapper) { - processedFormData = mapper.parseFormData(processedFormData); - } + private final List<FormBasedMapper> mappers; + public FormData adaptFormData(FormData formData) { + return mappers.stream() + .filter(mapper -> mapper.isResponsible(formData)) + .findFirst() + .map(mapper -> mapper.adaptFormData(formData)) + .orElse(formData); } - -} \ No newline at end of file +} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..d6e7196a5e2e471cebf54f5891fd5de2f91405ae --- /dev/null +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapper.java @@ -0,0 +1,103 @@ +package de.ozgcloud.eingang.semantik.formbased; + +import java.util.Map; +import java.util.Optional; +import java.util.function.UnaryOperator; +import java.util.stream.IntStream; + +import org.apache.commons.collections.MapUtils; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import de.ozgcloud.eingang.common.errorhandling.TechnicalException; +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Component +@RequiredArgsConstructor +@Log4j2 +public class MantelantragFormBasedMapper implements FormBasedMapper { + + private final Environment environment; + + static final String MANTELANTRAG_FORM_ID = "maa_mantelantrag/maa_mantelantrag_pvog"; + + static final String ZUSTELLUNG_NACHRICHTENBROKER_FIELD = "zustellung_nachrichtenbroker"; + + static final String ORGANISATIONSEINHEIT_ID_FIELD = "kontaktsystem_oeid"; + static final String BEZEICHNUNG_FIELD = "OrganisationseinheitenBEZEICHNUNG"; + static final String EMAIL_FIELD = "zust_emailadresse"; + static final String HAUSANSCHRIFT_STRASSE_FIELD = "zust_strasse"; + static final String HAUSANSCHRIFT_PLZ_FIELD = "zust_postleitzahl"; + static final String HAUSANSCHRIFT_ORT_FIELD = "zust_ort"; + static final String TELEFON_FIELD = "telefon"; + + @Override + public boolean isResponsible(FormData formData) { + return formData + .getHeader() + .getFormId() + .equals(MANTELANTRAG_FORM_ID); + } + + @Override + public FormData adaptFormData(FormData formData) { + try { + return adaptFormDataWithPossibleException(formData); + } catch (TechnicalException exception) { + LOG.warn("Mantelantrag is invalid: %s".formatted(exception.getMessage())); + return formData; + } + } + + FormData adaptFormDataWithPossibleException(FormData formData) { + var fieldMap = formData.getFormData(); + var slotIndex = findSlotIndex(fieldMap); + UnaryOperator<String> getValueOrEmpty = field -> getFieldByKeyOrEmpty( + fieldMap, + getNameForSlotIndex(field, slotIndex) + ); + var organisationseinheitId = getValueOrEmpty.apply(ORGANISATIONSEINHEIT_ID_FIELD); + + if (organisationseinheitId.isBlank()) { + throw new TechnicalException("OrganistaionseinheitId not found!"); + } + + return formData.toBuilder() + .zustaendigeStelle(ZustaendigeStelle.builder() + .organisationseinheitenId(organisationseinheitId) + .bezeichnung(getValueOrEmpty.apply(BEZEICHNUNG_FIELD)) + .email(getValueOrEmpty.apply(EMAIL_FIELD)) + .hausanschriftStrasse(getValueOrEmpty.apply(HAUSANSCHRIFT_STRASSE_FIELD)) + .hausanschriftPlz(getValueOrEmpty.apply(HAUSANSCHRIFT_PLZ_FIELD)) + .hausanschriftOrt(getValueOrEmpty.apply(HAUSANSCHRIFT_ORT_FIELD)) + .telefon(getValueOrEmpty.apply(TELEFON_FIELD)) + .build()) + .build(); + } + + int findSlotIndex(Map<String, Object> fieldMap) { + var identifier = environment.getProperty("ozgcloud.xta.identifier"); + return IntStream.range(0, 3) + .filter(slotIndex -> getFieldByKeyOrEmpty( + fieldMap, + getNameForSlotIndex(ZUSTELLUNG_NACHRICHTENBROKER_FIELD, slotIndex) + ).equals(identifier) + ) + .findFirst() + .orElseThrow(() -> new TechnicalException("No matching nachrichtenbroker address '%s' found!".formatted(identifier))); + } + + String getNameForSlotIndex(String name, int slotIndex) { + return slotIndex > 0 ? "%s%d".formatted(name, slotIndex + 1) : name; + } + + private String getFieldByKeyOrEmpty(Map<String, Object> fieldMap, String key) { + return Optional.ofNullable(MapUtils.getString(fieldMap, key)) + .map(String::trim) + .orElse(""); + } + +} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java index dbe206cafc115bf08a30839bab78afbc1933fdb3..0e230d638419df50c78544db57ac0735994ce13a 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java @@ -107,7 +107,7 @@ class SemantikAdapterTest { void mockEngineAdapter() { doReturn(Optional.of(engineAdapter)).when(adapter).findResponsibleEngineAdapter(formData); when(engineAdapter.parseFormData(any())).thenReturn(engineAdapterResponse); - when(formAdapter.parseFormData(any())).thenReturn(formAdapterResponse); + when(formAdapter.adaptFormData(any())).thenReturn(formAdapterResponse); } @Test @@ -128,7 +128,7 @@ class SemantikAdapterTest { void shouldCallFormAdapter() { adapter.processFormData(formData); - verify(formAdapter).parseFormData(engineAdapterResponse); + verify(formAdapter).adaptFormData(engineAdapterResponse); } @Test diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java index b5d93dca98b934def05ddc44663222dfc9484b9d..c68c9c3848ab36f3fdcb7a4e2ccdcef6eb611566 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java @@ -39,8 +39,6 @@ import org.mockito.Spy; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.formbased.FormBasedMapper; -import de.ozgcloud.eingang.semantik.formbased.FormBasedSemantikAdapter; class FormBasedSemantikAdapterTest { @@ -65,16 +63,16 @@ class FormBasedSemantikAdapterTest { @Test void shouldCallMapperIfResponsible() { - adapter.parseFormData(formData); + adapter.adaptFormData(formData); - verify(mapper).parseFormData(formData); + verify(mapper).adaptFormData(formData); } @Test - void shouldNotCallMappersIfNOTREsponsible() { + void shouldNotCallMapperIfNotResponsible() { when(mapper.isResponsible(any())).thenReturn(false); - adapter.parseFormData(formData); + adapter.adaptFormData(formData); verifyNoMoreInteractions(mapper); } @@ -82,11 +80,11 @@ class FormBasedSemantikAdapterTest { @Test void shouldReturnMappingResult() { var expected = FormDataTestFactory.create(); - when(mapper.parseFormData(any())).thenReturn(expected); + when(mapper.adaptFormData(any())).thenReturn(expected); - var result = adapter.parseFormData(formData); + var result = adapter.adaptFormData(formData); assertThat(result).isSameAs(expected); } } -} \ No newline at end of file +} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8c019e946e13b43882cbcda8d41f599cbe5d7d18 --- /dev/null +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/MantelantragFormBasedMapperTest.java @@ -0,0 +1,307 @@ +package de.ozgcloud.eingang.semantik.formbased; + +import static de.ozgcloud.eingang.semantik.formbased.MantelantragFormBasedMapper.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; + +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.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.core.env.Environment; + +import de.ozgcloud.eingang.common.errorhandling.TechnicalException; +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; +import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; +import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; + +class MantelantragFormBasedMapperTest { + private final static String TARGET_OEID = "123456"; + private static final String IDENTIFIER = "gea:test"; + + @Spy + @InjectMocks + private MantelantragFormBasedMapper mapper; + + @Mock + private Environment environment; + + @DisplayName("is responsible") + @Nested + class TestIsResponsible { + + @DisplayName("should be true if mantelantrag form id") + @Test + void shouldBeTrueIfMantelantragFormId() { + var formData = createWithFormId(MANTELANTRAG_FORM_ID); + + var isResponsibleResult = mapper.isResponsible(formData); + + assertThat(isResponsibleResult).isTrue(); + } + + @DisplayName("should be false if not mantelantrag form id") + @Test + void shouldBeFalseIfNotMantelantragFormId() { + var formData = createWithFormId("any other id"); + + var isResponsibleResult = mapper.isResponsible(formData); + + assertThat(isResponsibleResult).isFalse(); + } + + private FormData createWithFormId(String formId) { + return FormDataTestFactory.createBuilder() + .header(FormHeaderTestFactory.createBuilder() + .formId(formId) + .build()) + .build(); + } + } + + @DisplayName("adapt form data") + @Nested + class TestAdaptFormData { + + @Mock + private FormData formData; + + @Mock + private FormData formData2; + + @DisplayName("should return adapted value") + @Test + void shouldReturnAdaptedValue() { + doReturn(formData2).when(mapper).adaptFormDataWithPossibleException(formData); + + var resultFormData = mapper.adaptFormData(formData); + + assertThat(resultFormData).isEqualTo(formData2); + } + + @DisplayName("should return original value with exception") + @Test + void shouldReturnOriginalValueWithException() { + doThrow(new TechnicalException("some error")).when(mapper).adaptFormDataWithPossibleException(formData); + + var resultFormData = mapper.adaptFormData(formData); + + assertThat(resultFormData).isEqualTo(formData); + } + } + + @DisplayName("adapt form data with possible exception") + @Nested + class TestAdaptFormDataWithPossibleException { + + private FormData formData; + + private Map<String, Object> fieldMap; + + @BeforeEach + void mock() { + fieldMap = new HashMap<>(Map.of( + getOrganisationseinheitIDFieldName(1), " ", + getOrganisationseinheitIDFieldName(2), "", + getOrganisationseinheitIDFieldName(10), "1111111" + )); + formData = FormDataTestFactory.createBuilder() + .formData(fieldMap) + .build(); + } + + @DisplayName("should keep form data except zustaendigestelle") + @Test + void shouldKeepFormDataExceptZustaendigestelle() { + doReturn(10).when(mapper).findSlotIndex(fieldMap); + + var resultFormData = mapper.adaptFormData(formData); + + assertThat(resultFormData.getId()).isEqualTo(formData.getId()); + assertThat(resultFormData.getHeader()).isEqualTo(formData.getHeader()); + assertThat(resultFormData.getAntragsteller()).isEqualTo(formData.getAntragsteller()); + } + + @DisplayName("should map organisationseinheitId") + @ParameterizedTest + @ValueSource(ints = { 0, 1, 2 }) + void shouldMapOrganisationseinheitId(int slotIndex) { + mockWithOEID(slotIndex, TARGET_OEID); + + var zustaendigeStelle = getAdaptedZustaendigeStelle(); + + assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(TARGET_OEID); + } + + private String getOrganisationseinheitIDFieldName(int slotIndex) { + return mapper.getNameForSlotIndex(ORGANISATIONSEINHEIT_ID_FIELD, slotIndex); + } + + @DisplayName("should throw if organistaionseinheitId is missing") + @ParameterizedTest + @ValueSource(ints = { 0, 1, 2 }) + void shouldThrowIfOrganistationseinheitIdIsMissing(int slotIndex) { + doReturn(slotIndex).when(mapper).findSlotIndex(fieldMap); + + assertThatThrownBy(this::getAdaptedZustaendigeStelle) + .isInstanceOf(TechnicalException.class); + } + + @DisplayName("should throw if organistationseinheitId is empty") + @ParameterizedTest + @ValueSource(ints = { 0, 1, 2 }) + void shouldThrowIfOrganistationseinheitIdIsEmpty(int slotIndex) { + mockWithOEID(slotIndex, ""); + + assertThatThrownBy(this::getAdaptedZustaendigeStelle) + .isInstanceOf(TechnicalException.class); + } + + static final String TARGET_OPTIONAL_FIELD_VALUE = "optionalFieldValue"; + + static final Map<String, Function<ZustaendigeStelle, String>> FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR = Map.of( + BEZEICHNUNG_FIELD, ZustaendigeStelle::getBezeichnung, + EMAIL_FIELD, ZustaendigeStelle::getEmail, + HAUSANSCHRIFT_STRASSE_FIELD, ZustaendigeStelle::getHausanschriftStrasse, + HAUSANSCHRIFT_PLZ_FIELD, ZustaendigeStelle::getHausanschriftPlz, + HAUSANSCHRIFT_ORT_FIELD, ZustaendigeStelle::getHausanschriftOrt, + TELEFON_FIELD, ZustaendigeStelle::getTelefon + ); + + @DisplayName("should map optional field") + @ParameterizedTest + @MethodSource("fieldNameAndSlotIndex") + void shouldMapOptionalField(int slotIndex, String fieldName) { + mockWithSomeOEID(slotIndex); + fieldMap.put(mapper.getNameForSlotIndex(fieldName, slotIndex), TARGET_OPTIONAL_FIELD_VALUE); + + var zustaendigeStelle = getAdaptedZustaendigeStelle(); + + assertThat(getExpectedByFieldName(zustaendigeStelle, fieldName)).isEqualTo(TARGET_OPTIONAL_FIELD_VALUE); + } + + @DisplayName("should map missing optional fields to empty") + @ParameterizedTest + @MethodSource("fieldNameAndSlotIndex") + void shouldMapMissingOptionalFieldsToEmpty(int slotIndex, String fieldName) { + mockWithSomeOEID(slotIndex); + + var zustaendigeStelle = getAdaptedZustaendigeStelle(); + + assertThat(getExpectedByFieldName(zustaendigeStelle, fieldName)).isEmpty(); + } + + @DisplayName("should map empty optional fields to empty") + @ParameterizedTest + @MethodSource("fieldNameAndSlotIndex") + void shouldMapEmptyOptionalFieldsToEmpty(int slotIndex, String fieldName) { + mockWithSomeOEID(slotIndex); + fieldMap.put(mapper.getNameForSlotIndex(fieldName, slotIndex), ""); + + var zustaendigeStelle = getAdaptedZustaendigeStelle(); + + assertThat(getExpectedByFieldName(zustaendigeStelle, fieldName)).isEmpty(); + } + + private String getExpectedByFieldName(ZustaendigeStelle zustaendigeStelle, String fieldName) { + var valueExtractor = FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR.get(fieldName); + return valueExtractor.apply(zustaendigeStelle); + } + + private static Stream<Arguments> fieldNameAndSlotIndex() { + return Stream.of(0, 1, 2) + .flatMap(slotIndex -> FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR + .keySet().stream() + .map(fieldName -> Arguments.of(slotIndex, fieldName)) + ); + } + + private void mockWithSomeOEID(int slotIndex) { + mockWithOEID(slotIndex, "some"); + } + + private void mockWithOEID(int slotIndex, String targetOeid) { + fieldMap.put(getOrganisationseinheitIDFieldName(slotIndex), targetOeid); + doReturn(slotIndex).when(mapper).findSlotIndex(fieldMap); + } + + private ZustaendigeStelle getAdaptedZustaendigeStelle() { + var formDataResult = mapper.adaptFormDataWithPossibleException(formData); + return formDataResult.getZustaendigeStelle(); + } + + } + + @DisplayName("find slot index") + @Nested + class TestFindSlotIndex { + + private Map<String, Object> fieldMap; + + @BeforeEach + void mock() { + when(environment.getProperty("ozgcloud.xta.identifier")).thenReturn(IDENTIFIER); + + fieldMap = new HashMap<>(Map.of( + getZustaendigeStelleName(1), "unknown", + getZustaendigeStelleName(2), "" + )); + } + + @DisplayName("should return matching slot") + @ParameterizedTest + @ValueSource(ints = { 0, 1, 2 }) + void shouldReturnMatchingSlot(int slotIndex) { + fieldMap.put(getZustaendigeStelleName(slotIndex), IDENTIFIER); + + var resultSlotIndex = mapper.findSlotIndex(fieldMap); + + assertThat(resultSlotIndex).isEqualTo(slotIndex); + } + + private String getZustaendigeStelleName(int slotIndex) { + return mapper.getNameForSlotIndex(ZUSTELLUNG_NACHRICHTENBROKER_FIELD, slotIndex); + } + + @DisplayName("should throw if no slot matches") + @Test + void shouldThrowIfNoSlotMatches() { + assertThatThrownBy(() -> mapper.findSlotIndex(fieldMap)) + .isInstanceOf(TechnicalException.class); + } + } + + @DisplayName("get name for slot index") + @Nested + class TestGetNameForSlotIndex { + @DisplayName("should return name") + @ParameterizedTest + @MethodSource("nameAndSlotIndexAndExpected") + void shouldReturnName(String name, int slotIndex, String expected) { + var resultName = mapper.getNameForSlotIndex(name, slotIndex); + + assertThat(resultName).isEqualTo(expected); + } + + private static Stream<Arguments> nameAndSlotIndexAndExpected() { + return Stream.of( + Arguments.of("name", 0, "name"), + Arguments.of("name", 1, "name2"), + Arguments.of("name", 2, "name3") + ); + } + } +} diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml index 6557a321b925d9653ec245854de08eb44d3c9b91..7dd7de51735b0f977c54134c0296e4021a480677 100644 --- a/xta-adapter/pom.xml +++ b/xta-adapter/pom.xml @@ -14,6 +14,7 @@ <spring-boot.build-image.imageName>docker.ozg-sh.de/xta-adapter:build-latest</spring-boot.build-image.imageName> <okio.version>3.9.0</okio.version> <mockwebserver.version>4.12.0</mockwebserver.version> + <grpcmock.version>0.13.0</grpcmock.version> </properties> <dependencies> @@ -96,6 +97,12 @@ <version>${mockwebserver.version}</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.grpcmock</groupId> + <artifactId>grpcmock-spring-boot</artifactId> + <version>${grpcmock.version}</version> + <scope>test</scope> + </dependency> <dependency> <groupId>de.ozgcloud.eingang</groupId> <artifactId>common</artifactId> diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java index 1df581ac477f920aa8069fe84fb6677f3cac6d0e..d8e6cb0515f7d5dce0d2183b6418a33bb4b144f4 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MockResponseTestFactory.java @@ -3,8 +3,10 @@ package de.ozgcloud.eingang.xta; import java.io.IOException; import java.util.Arrays; import java.util.Base64; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -25,16 +27,30 @@ public class MockResponseTestFactory { "Content-Type", "application/xop+xml;charset=utf-8;type=\"application/soap+xml\"" ); - public static Map<String, String> MAILBOX_CONTENT = Map.of( - "urn:de:xta:messageid:dataport_xta_210:20eb297a-e224-45a0-9376-5ebd4d9bcc9a", "AFM", - "urn:de:xta:messageid:dataport_xta_210:371ce4e3-44e3-4f9d-8c82-db7f347ae760", "AFM", - "urn:de:xta:messageid:dataport_xta_210:3d280bfa-d790-4865-a6cf-f6656d7be13f", "Versammlungsanzeige", - "urn:de:xta:messageid:dataport_xta_210:749f0375-be76-4928-959d-76d52de906c3", "AFM" + public static final Map<String, String> MESSAGE_TYPE_BY_ATTACHMENT_FILENAME = Map.of( + "mantelantrag_without_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", + "dfoerdermittel_without_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", + "versammlungsanzeige.xml", "fim.S17000652.17000652001004", + "mantelantrag_with_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", + "dfoerdermittel_with_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", + "waffenschein.zip", "Geschaeftsgang.Geschaeftsgang.0201" ); - private static final Map<String, String> ATTACHMENT_FILENAME = Map.of( - "AFM", "attachment.zip", - "Versammlungsanzeige", "attachment.xml" + private static final Map<String, String> MESSAGE_ID_BY_ATTACHMENT_FILENAME = MESSAGE_TYPE_BY_ATTACHMENT_FILENAME + .keySet().stream() + .collect(Collectors.toMap(name -> name, name -> generateMessageID())); + + private static String generateMessageID() { + return "urn:de:xta:messageid:dataport_xta_210:%s".formatted(UUID.randomUUID().toString()); + } + + private static final Map<String, String> METADATA_NAME_ATTACHMENT_FILENAME = Map.of( + "mantelantrag_without_anlage.zip", "afm", + "dfoerdermittel_without_anlage.zip", "dfoerdermittel", + "versammlungsanzeige.xml", "versammlungsanzeige", + "mantelantrag_with_anlage.zip", "afm", + "dfoerdermittel_with_anlage.zip", "dfoerdermittel", + "waffenschein.zip", "afm" ); public static MockResponse create() { @@ -60,14 +76,13 @@ public class MockResponseTestFactory { .setBody(body); } - public static MockResponse createGetStatusListResponse() { - var messageMetaDataEntriesString = MAILBOX_CONTENT.entrySet().stream() - .map(kv -> TestUtils.loadTextFile("mock-responses/getStatusList/MessageMetaData/%s.template.xml".formatted(kv.getValue()), - kv.getKey())) + public static MockResponse createGetStatusListResponse(List<String> xtaAttachmentFileNames) { + var messageMetaDataEntriesString = xtaAttachmentFileNames.stream() + .map(MockResponseTestFactory::createMessageMetadataXml) .collect(Collectors.joining()); var envelopeXMLString = TestUtils.loadTextFile( "mock-responses/getStatusList/envelope.template.xml", - String.valueOf(MAILBOX_CONTENT.size()), + String.valueOf(xtaAttachmentFileNames.size()), messageMetaDataEntriesString ); @@ -83,20 +98,19 @@ public class MockResponseTestFactory { .setBody(body); } - public static MockResponse createGetMessageResponse(String messageId) { - var antragType = Objects.requireNonNull(MAILBOX_CONTENT.get(messageId)); + public static MockResponse createGetMessageResponse(String xtaAttachmentFileName) { + var messageType = Objects.requireNonNull(MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(xtaAttachmentFileName)); + var metadataMessageXml = createMessageMetadataXml(xtaAttachmentFileName); var envelopeXMLString = TestUtils.loadTextFile( - "mock-responses/getMessage/%s/envelope.template.xml".formatted(antragType), - messageId, INCLUDE_URL); - - String attachmentBase64; - try (var attachmentFile = TestUtils.loadFile( - "mock-responses/getMessage/%s/%s".formatted(antragType, Objects.requireNonNull(ATTACHMENT_FILENAME.get(antragType))))) { - attachmentBase64 = new String(Base64.getEncoder().encode(attachmentFile.readAllBytes())); - } catch (IOException e) { - throw new RuntimeException(e); - } + "mock-responses/getMessage/%s/envelope.template.xml".formatted( + messageType + ), + metadataMessageXml, + xtaAttachmentFileName, + getFileSize(getAttachmentFilePath(xtaAttachmentFileName)), + INCLUDE_URL + ); var body = combineParts( createPart( @@ -109,7 +123,9 @@ public class MockResponseTestFactory { "Content-Transfer-Encoding", "base64", "Content-Type", "application/octet-stream" ), - attachmentBase64 + loadFileAsBase64( + getAttachmentFilePath(xtaAttachmentFileName) + ) ) ); @@ -118,6 +134,46 @@ public class MockResponseTestFactory { .setBody(body); } + private static String getMessageType(String xtaAttachmentFileName) { + return Objects.requireNonNull( + MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(xtaAttachmentFileName), + "Xta-message type for '%s' has to be configured!".formatted(xtaAttachmentFileName) + ); + } + + private static String createMessageMetadataXml(String xtaAttachmentFileName) { + return TestUtils.loadTextFile( + "mock-responses/getStatusList/MessageMetaData/%s/%s.template.xml".formatted( + getMessageType(xtaAttachmentFileName), + Objects.requireNonNull( + METADATA_NAME_ATTACHMENT_FILENAME.get(xtaAttachmentFileName), + "Xta-message metadata-name for '%s' has to be configured!".formatted(xtaAttachmentFileName) + ) + ), Objects.requireNonNull(MESSAGE_ID_BY_ATTACHMENT_FILENAME.get(xtaAttachmentFileName)), + getFileSize(getAttachmentFilePath(xtaAttachmentFileName)) + ); + } + + private static String getFileSize(String filePath) { + try (var inputStream = TestUtils.loadFile(filePath)) { + return String.valueOf(inputStream.readAllBytes().length); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static String getAttachmentFilePath(String xtaAttachmentFileName) { + return "mock-responses/getMessage/%s/%s".formatted(getMessageType(xtaAttachmentFileName), xtaAttachmentFileName); + } + + private static String loadFileAsBase64(String fileName) { + try (var attachmentFile = TestUtils.loadFile(fileName)) { + return new String(Base64.getEncoder().encode(attachmentFile.readAllBytes())); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + private static String combineParts(String... parts) { return Stream.concat( Arrays.stream(parts).map(part -> "--%s\n%s\n".formatted(UUID_BOUNDARY, part)), @@ -130,4 +186,7 @@ public class MockResponseTestFactory { headers.entrySet().stream().map(kv -> "%s: %s\n".formatted(kv.getKey(), kv.getValue())).collect(Collectors.joining()), content); } + public static MockResponse createCloseResponse() { + return new MockResponse(); + } } diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java index 8f22e393ae6f75b7bf19a48b6c682e8476899b6e..48fab4d367f5eaa16cd4426de0c1189bc5b7bd9c 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java @@ -1,128 +1,281 @@ package de.ozgcloud.eingang.xta; import static org.assertj.core.api.Assertions.*; -import static org.assertj.core.api.InstanceOfAssertFactories.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; +import static org.grpcmock.GrpcMock.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.List; + +import org.grpcmock.springboot.AutoConfigureGrpcMock; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; 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.context.annotation.Bean; import org.springframework.test.context.ActiveProfiles; -import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.eingang.Application; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.eingang.router.VorgangRemoteService; - -@SpringBootTest(classes = { Application.class, ActivateXTARunnerConfig.class }) -@ActiveProfiles({ "local", "itcase" }) +import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc; +import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse; +import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangRequest; +import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangResponse; +import de.ozgcloud.vorgang.vorgang.GrpcEingang; +import de.ozgcloud.vorgang.vorgang.GrpcFinishCreationResponse; +import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc; + +@SpringBootTest(classes = { + Application.class, + XtaITCase.ActivateXTARunnerConfig.class +}) +@ActiveProfiles({ "itcase" }) +@AutoConfigureGrpcMock(name = "vorgang-manager-itcase", useInProcessServer = true) class XtaITCase { - @MockBean - private XtaRemoteService remoteService; - @MockBean - private VorgangRemoteService vorgangRemoteService; + @Autowired + private XtaMockServerConfiguration.XtaMocker xtaMocker; @Autowired private XtaRunner runner; - @Captor - private ArgumentCaptor<FormData> formDataCaptor; - - @BeforeEach - void prepareXtaRemoteService() { - when(remoteService.getMessagesMetadata()).thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create()); - - when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn( - XtaMessageTestFactory.createBuilder() - .clearMessageFiles() - .messageFile(XtaFileTestFactory.withFileContent(TestUtils.loadFile("xdomea/dfoerdermittel_without_anlage.zip"), - "dfoerdermittel_without_anlage.zip")) - .build()); - } - @Test - void shouldGetMessage() { - runner.onApplicationEvent(null); + @DisplayName("run get xta messages") + @Nested + class TestRunGetXtaMessages { + @BeforeEach + void setup() { + mockStartVorgangCreation(); + mockUploadBinaryFiles(); + mockFinishVorgangCreation(); + } - verify(remoteService).getMessage(XtaMessageTestFactory.MESSAGE_ID); - } + private void mockStartVorgangCreation() { + stubFor( + unaryMethod(VorgangServiceGrpc.getStartCreationMethod()) + .willReturn(GrpcCreateVorgangResponse.getDefaultInstance()) + ); + } - @Test - void shouldCloseMessage() { - runner.onApplicationEvent(null); + private void mockUploadBinaryFiles() { + stubFor( + clientStreamingMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod()) + .willReturn(GrpcUploadBinaryFileResponse.getDefaultInstance()) + ); + } - verify(remoteService, timeout(2000)).close(XtaMessageTestFactory.MESSAGE_ID); - } + private void mockFinishVorgangCreation() { + stubFor( + unaryMethod(VorgangServiceGrpc.getFinishCreationMethod()) + .willReturn(GrpcFinishCreationResponse.getDefaultInstance()) + ); + } - @Test - void shouldSend3Representations() { - runner.onApplicationEvent(null); + @AfterEach + void teardown() { + try { + expectOneVorgangCreateAndFinishCall(); + expectUploadCallForXmlRepresentations(); + } finally { + xtaMocker.teardownServer(); + resetMappings(); + } + } - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), any(), any()); - assertThat(formDataCaptor.getValue().getRepresentations()).hasSize(3); - assertThat(formDataCaptor.getValue().getNumberOfRepresentations()).isEqualTo(3); - } + private void expectOneVorgangCreateAndFinishCall() { + verifyThat( + calledMethod(VorgangServiceGrpc.getStartCreationMethod()) + .withRequest(GrpcCreateVorgangRequest::hasEingang), + times(1) + ); + verifyThat( + calledMethod(VorgangServiceGrpc.getFinishCreationMethod()), + times(1) + ); + } - @Test - void shouldSendNoAttachments() { - runner.onApplicationEvent(null); + private void expectUploadCallForXmlRepresentations() { + // Expect two xml representations: xdomea.xml and antrag.xml + verifyThat( + calledMethod(BinaryFileServiceGrpc.getUploadBinaryFileAsStreamMethod()) + .withRequestsContaining(request -> + request.hasMetadata() && + request.getMetadata().getContentType().contains("xml") + ), + times(2) + ); + } - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), any(), any()); - assertThat(formDataCaptor.getValue().getAttachments()).isEmpty(); - assertThat(formDataCaptor.getValue().getNumberOfAttachments()).isZero(); - } + @DisplayName("should have three representations with pdf") + @TestZipFileNamesWithPdf + void shouldHaveThreeRepresentationsWithPdf(String zipFileName) { + mockNachrichtenBroker(zipFileName); - @Test - void shouldHavePostfachId() { - runner.onApplicationEvent(null); + runner.runGetXtaMessages(); - var formData = captorFormData(); + var eingang = captureEingang(); + assertThat(eingang.getNumberOfRepresentations()).isEqualTo(3); + } - assertThat(formData.getHeader().getServiceKonto()).describedAs("ServiceKonto").isNotNull() - .extracting(ServiceKonto::getPostfachAddresses).asList().hasSize(1).first() - .asInstanceOf(type(PostfachAddress.class)) - .extracting(PostfachAddress::getIdentifier).isInstanceOf(StringBasedIdentifier.class).asInstanceOf(type(StringBasedIdentifier.class)) - .extracting(StringBasedIdentifier::getPostfachId).isEqualTo("4dd01647-b9d9-4775-1b50-08da3d83800a"); - } + @DisplayName("should send two representations without pdf") + @TestZipFileNamesWithoutPdf + void shouldSendTwoXMLRepresentationsWithoutPdf(String zipFileName) { + mockNachrichtenBroker(zipFileName); + + runner.runGetXtaMessages(); + + var eingang = captureEingang(); + assertThat(eingang.getNumberOfRepresentations()).isEqualTo(2); + } + + @DisplayName("should have no attachments") + @TestZipFileNamesWithoutAnlage + void shouldHaveNoAttachments(String zipFileName) { + mockNachrichtenBroker(zipFileName); + + runner.runGetXtaMessages(); + + var eingang = captureEingang(); + assertThat(eingang.getNumberOfAttachments()).isZero(); + } + + @DisplayName("should have one attachment") + @TestZipFileNamesWithAnlage + void shouldHaveOneAttachment(String zipFileName) { + mockNachrichtenBroker(zipFileName); + + runner.runGetXtaMessages(); - @Test - void shouldHaveOrganisationsEinheitId() { - runner.onApplicationEvent(null); + var eingang = captureEingang(); + assertThat(eingang.getNumberOfAttachments()).isEqualTo(1); + } - var formData = captorFormData(); + @DisplayName("should have postfach id") + @TestZipFileNamesWithServiceKonto + void shouldHavePostfachId(String zipFileName) { + mockNachrichtenBroker(zipFileName); - assertThat(formData.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo("9795669"); + runner.runGetXtaMessages(); + + var serviceKonto = captureEingang() + .getHeader() + .getServiceKonto(); + assertThat(serviceKonto).isNotNull(); + var postfachId = serviceKonto + .getPostfachAddresses(0) + .getIdentifier() + .getProperty(0) + .getValue(0); + assertThat(postfachId).isEqualTo("4dd01647-b9d9-4775-1b50-08da3d83800a"); + } + + @DisplayName("should have organistationseinheit ID") + @TestZipFileNames + void shouldHaveOrganistationseinheitId(String zipFileName) { + mockNachrichtenBroker(zipFileName); + + runner.runGetXtaMessages(); + + var organisationseinheitenId = captureEingang() + .getZustaendigeStelle() + .getOrganisationseinheitenId(); + assertThat(organisationseinheitenId).isEqualTo("9795669"); + } + + @DisplayName("should have vorgang nummer") + @TestZipFileNames + void shouldHaveVorgangNummer(String zipFileName) { + mockNachrichtenBroker(zipFileName); + + runner.runGetXtaMessages(); + + var vorgangNummer = captureEingang() + .getHeader() + .getVorgangNummer(); + assertThat(vorgangNummer).hasSize(9); + } + + private GrpcEingang captureEingang() { + return capturedRequestsFor( + calledMethod(VorgangServiceGrpc.getStartCreationMethod()) + ) + .getFirst() + .requests() + .getFirst() + .getEingang(); + } } - @Test - void shouldHaveVorgangNummer() { - runner.onApplicationEvent(null); + private void mockNachrichtenBroker(String zipFileName) { + xtaMocker.setupServer(List.of(zipFileName), true); + } - var formData = captorFormData(); + @Target({ ElementType.METHOD }) + @Retention(RetentionPolicy.RUNTIME) + @ParameterizedTest + @ValueSource(strings = { "dfoerdermittel_without_anlage.zip", "mantelantrag_without_anlage.zip" }) + @interface TestZipFileNamesWithoutAnlage { + } - assertThat(formData.getHeader().getVorgangNummer()).hasSize(9); + @Target({ ElementType.METHOD }) + @Retention(RetentionPolicy.RUNTIME) + @ParameterizedTest + @ValueSource(strings = { "dfoerdermittel_with_anlage.zip", "mantelantrag_with_anlage.zip" }) + @interface TestZipFileNamesWithAnlage { } - private FormData captorFormData() { - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), any(), any()); + @Target({ ElementType.METHOD }) + @Retention(RetentionPolicy.RUNTIME) + @ParameterizedTest + @ValueSource(strings = { + "dfoerdermittel_without_anlage.zip", + "mantelantrag_without_anlage.zip", + "dfoerdermittel_with_anlage.zip", + "mantelantrag_with_anlage.zip", + }) + @interface TestZipFileNamesWithPdf { + } - return formDataCaptor.getValue(); + @Target({ ElementType.METHOD }) + @Retention(RetentionPolicy.RUNTIME) + @ParameterizedTest + @ValueSource(strings = { + "waffenschein.zip" + }) + @interface TestZipFileNamesWithoutPdf { } -} + @Target({ ElementType.METHOD }) + @Retention(RetentionPolicy.RUNTIME) + @ParameterizedTest + @ValueSource(strings = { + "dfoerdermittel_without_anlage.zip", + "dfoerdermittel_with_anlage.zip", + }) + @interface TestZipFileNamesWithServiceKonto { + } + + @Target({ ElementType.METHOD }) + @Retention(RetentionPolicy.RUNTIME) + @ParameterizedTest + @ValueSource(strings = { + "dfoerdermittel_without_anlage.zip", + "mantelantrag_without_anlage.zip", + "dfoerdermittel_with_anlage.zip", + "mantelantrag_with_anlage.zip", + "waffenschein.zip" + }) + @interface TestZipFileNames { + } -class ActivateXTARunnerConfig { - @Bean - XtaRunner xtaRunner() { - return new XtaRunner(); + static class ActivateXTARunnerConfig { + @Bean + XtaRunner xtaRunner() { + return new XtaRunner(); + } } } diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMockServerConfiguration.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMockServerConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..5484189046e19e820bcc6f9f0065c068af85908d --- /dev/null +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMockServerConfiguration.java @@ -0,0 +1,93 @@ +package de.ozgcloud.eingang.xta; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.net.InetAddress; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import okhttp3.mockwebserver.MockWebServer; + +@Configuration +public class XtaMockServerConfiguration { + + @Bean + XtaMocker xtaMockServer(XtaProperties properties) { + return new XtaMocker(properties); + } + + @RequiredArgsConstructor + @Getter + public static class XtaMocker { + private final XtaProperties properties; + + private MockWebServer nachrichtenBrokerMock; + private List<String> filteredAttachmentFileNames; + + @SneakyThrows + public void setupServer(List<String> xtaAttachmentFileNames, boolean expectCloseMessages) { + filteredAttachmentFileNames = xtaAttachmentFileNames.stream() + .filter(name -> Objects.requireNonNull( + MockResponseTestFactory.MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(name), + "Xta-attachment name '%s' has to be configured!".formatted(name) + ) + .equals("Geschaeftsgang.Geschaeftsgang.0201")) + .toList(); + + startServer(); + + nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetStatusListResponse(xtaAttachmentFileNames)); + filteredAttachmentFileNames.forEach(xtaAttachmentFileName -> { + nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetMessageResponse(xtaAttachmentFileName)); + if (expectCloseMessages) { + nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createCloseResponse()); + } + } + ); + nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createEmptyGetStatusListResponse()); + } + + @SneakyThrows + private void startServer() { + nachrichtenBrokerMock = new MockWebServer(); + + nachrichtenBrokerMock.start(InetAddress.getByName("127.0.0.1"), 0); + var serverProperties = properties.getServer(); + serverProperties.setAddress(nachrichtenBrokerMock.getHostName() + ":" + nachrichtenBrokerMock.getPort()); + serverProperties.setProtocol("http"); + } + + @SneakyThrows + public void teardownServer() { + if (nachrichtenBrokerMock == null) { + throw new RuntimeException("No server has been set up to tear down!"); + } + try { + var expectedCallCount = filteredAttachmentFileNames.size() + 2; + + for (var i = 0; i < expectedCallCount; i++) { + var request = nachrichtenBrokerMock.takeRequest(1, TimeUnit.SECONDS); + assertNotNull(request, "should have request index %d".formatted(i)); + assertThat(request.getPath()).isEqualTo("/MB_XTA-WS/XTA210msgBoxPort.svc"); + } + } finally { + stopServer(); + } + } + + @SneakyThrows + private void stopServer() { + nachrichtenBrokerMock.shutdown(); + nachrichtenBrokerMock = null; + } + + } +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java index cfc4776f0dd29bdd3a0b85c9236832368a863065..5cbebb33620ba8ec6801326c71526527b2ebdc35 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceITCase.java @@ -1,12 +1,8 @@ package de.ozgcloud.eingang.xta; import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import java.net.InetAddress; import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -19,62 +15,43 @@ import org.springframework.test.context.ActiveProfiles; import de.ozgcloud.eingang.Application; import lombok.SneakyThrows; -import okhttp3.mockwebserver.MockWebServer; @ActiveProfiles({ "itcase", "local" }) -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = { Application.class, XtaMockServerConfiguration.class }) class XtaServiceITCase { - private MockWebServer nachrichtenBrokerMock; - - private static final List<String> FILTERED_MESSAGE_IDS = MockResponseTestFactory.MAILBOX_CONTENT.entrySet().stream() - .filter(kv -> kv.getValue().equals("AFM")) - .map(Map.Entry::getKey) - .toList(); - @Autowired - private XtaService xtaService; + private XtaMockServerConfiguration.XtaMocker xtaMocker; @Autowired - private XtaProperties properties; + private XtaService xtaService; @DisplayName("get messages") @Nested class TestGetMessages { @BeforeEach - void enqueueResponse() { - startServer(); - nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetStatusListResponse()); - FILTERED_MESSAGE_IDS.forEach(messageId -> - nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createGetMessageResponse(messageId)) - ); - nachrichtenBrokerMock.enqueue(MockResponseTestFactory.createEmptyGetStatusListResponse()); + void setup() { + xtaMocker.setupServer(List.of( + "mantelantrag_without_anlage.zip", + "dfoerdermittel_without_anlage.zip", + "versammlungsanzeige.xml", + "waffenschein.zip" + ), false); } @AfterEach @SneakyThrows - void verifyRequestCall() { - try { - var expectedCallCount = FILTERED_MESSAGE_IDS.size() + 2; - - for (var i = 0; i < expectedCallCount; i++) { - var request = nachrichtenBrokerMock.takeRequest(1, TimeUnit.SECONDS); - assertNotNull(request, "should have request index %d".formatted(i)); - assertThat(request.getPath()).isEqualTo("/MB_XTA-WS/XTA210msgBoxPort.svc"); - } - } finally { - stopServer(); - } + void teardown() { + xtaMocker.teardownServer(); } - @DisplayName("should return form data with filtered message ids") + @DisplayName("should return data for waffenschein, mantelantrag and dfoerdermittel") @Test - void shouldReturnFormDataWithFilteredMessageIds() { - var formDataItems = xtaService.getMessages(); + void shouldReturnDataForMantelantragAndDfoerdermittel() { + var formDataItems = xtaService.getMessages().toList(); - var messageIds = formDataItems.map(item -> item.getHeader().getRequestId()).toList(); - assertThat(messageIds).isEqualTo(FILTERED_MESSAGE_IDS); + assertThat(formDataItems).hasSize(3); } @DisplayName("should unzip correct number of representations") @@ -85,6 +62,7 @@ class XtaServiceITCase { assertThat(firstFormData.getRepresentations()).hasSize(3); assertThat(firstFormData.getNumberOfRepresentations()).isEqualTo(3); } + @DisplayName("should unzip correct number of attachments") @Test void shouldUnzipCorrectNumberOfAttachments() { @@ -92,22 +70,14 @@ class XtaServiceITCase { assertThat(firstFormData.getAttachments()).isEmpty(); } - } - - @SneakyThrows - private void startServer() { - nachrichtenBrokerMock = new MockWebServer(); - nachrichtenBrokerMock.start(InetAddress.getByName("127.0.0.1"), 0); - var serverProperties = properties.getServer(); - serverProperties.setAddress(nachrichtenBrokerMock.getHostName() + ":" + nachrichtenBrokerMock.getPort()); - serverProperties.setProtocol("http"); - } + @DisplayName("should have vorgang nummer at correct length") + @Test + void shouldHaveVorgangNummerAtCorrectLength() { + var vorgangNumbers = xtaService.getMessages().map(formData -> formData.getHeader().getVorgangNummer()).toList(); - @SneakyThrows - private void stopServer() { - nachrichtenBrokerMock.shutdown(); - nachrichtenBrokerMock = null; + assertThat(vorgangNumbers).isNotEmpty().allMatch(number -> number.length() == 9); + } } } diff --git a/xta-adapter/src/test/resources/application-itcase.yml b/xta-adapter/src/test/resources/application-itcase.yml index 10c37fce51476732675a22abedd6ec6257d726f6..99b88fbe12ffdb4562dc264c08595afde1b9092a 100644 --- a/xta-adapter/src/test/resources/application-itcase.yml +++ b/xta-adapter/src/test/resources/application-itcase.yml @@ -1,6 +1,21 @@ ozgcloud: xta: + identifier: afmsh:010600000000_Online-Dienste + server: + address: localhost:3000 + name: LI33-0005 + protocol: https keystore: file: classpath:xtaTestStore.p12 password: changeit - identifier: gae:jens.reese@mgm-tp.com \ No newline at end of file + adapter: + targetVorgangManagerName: itcase + fallbackStrategy: DENY + routingStrategy: SINGLE + + +grpc: + client: + vorgang-manager-itcase: + address: in-process:vorgang-manager-itcase + negotiationType: PLAINTEXT diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/attachment.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/attachment.zip deleted file mode 100644 index 8f466f5b2eaf7bfb457ffcf27c3b21886d972a29..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/attachment.zip and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/envelope.template.xml deleted file mode 100644 index 4015e654c8a309ee31d039de6a0799fb0f8ed483..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/AFM/envelope.template.xml +++ /dev/null @@ -1,48 +0,0 @@ -<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> - <s:Header> - <a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action> - <h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:20eb297a-e224-45a0-9376-5ebd4d9bcc9a" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <ItemsPending>0</ItemsPending> - </h:MsgBoxResponse> - <h:MessageMetaData xmlns:h="http://www.osci.eu/ws/2014/10/transport" xmlns="http://www.osci.eu/ws/2014/10/transport"> - <DeliveryAttributes> - <Origin>2024-04-04T10:24:07.57</Origin> - <Delivery>2024-04-04T10:24:08.723</Delivery> - </DeliveryAttributes> - <Originators> - <Author> - <Identifier type="xoev">afmsh:WebMethod_Online-Dienste</Identifier> - </Author> - </Originators> - <Destinations> - <Reader> - <Identifier type="xoev">afmsh:ozg-cloud-dev001</Identifier> - </Reader> - </Destinations> - <MsgIdentification> - <MessageID xmlns="http://www.w3.org/2005/08/addressing">%s</MessageID> - </MsgIdentification> - <Qualifier> - <Service>urn:xdomea:AFM</Service> - <BusinessScenario> - <Defined listURI="urn:de:dataport:codeliste:business.scenario" listVersionID="1"> - <code xmlns="">AFM_DATA</code> - </Defined> - </BusinessScenario> - <MessageType listURI="urn:de:payloadSchema:elementName" listVersionID="1.0" payloadSchema="http://www.xdomea.de/V2.0.1"> - <code xmlns="">Geschaeftsgang.Geschaeftsgang.0201</code> - </MessageType> - </Qualifier> - <MsgSize>40142</MsgSize> - </h:MessageMetaData> - </s:Header> - <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <GenericContentContainer xmlns="http://xoev.de/transport/xta/211"> - <ContentContainer> - <Message contentType="application/zip" filename="9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.zip" size="40142"> - <xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> - </Message> - </ContentContainer> - </GenericContentContainer> - </s:Body> -</s:Envelope> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage.zip new file mode 100644 index 0000000000000000000000000000000000000000..9647ba0d49dc5a1983b9c184ddc1d1bd59249004 Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage.zip differ diff --git a/xta-adapter/src/test/resources/xdomea/dfoerdermittel_without_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage.zip similarity index 100% rename from xta-adapter/src/test/resources/xdomea/dfoerdermittel_without_anlage.zip rename to xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage.zip diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/envelope.template.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6f2da91fe005276ba66700d009ffa6de8e9de7b --- /dev/null +++ b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/envelope.template.xml @@ -0,0 +1,18 @@ +<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> + <s:Header> + <a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action> + <h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <ItemsPending>0</ItemsPending> + </h:MsgBoxResponse> + %s + </s:Header> + <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <GenericContentContainer xmlns="http://xoev.de/transport/xta/211"> + <ContentContainer> + <Message contentType="application/zip" filename="%s" size="%s"> + <xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> + </Message> + </ContentContainer> + </GenericContentContainer> + </s:Body> +</s:Envelope> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage.zip new file mode 100644 index 0000000000000000000000000000000000000000..aa058ff00deba2e3cc06ce2a98c763ad9e18aa35 Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage.zip differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3dbb1819807610e02ba123ad9d8bddc138ca9a5 Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage.zip differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein.zip b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein.zip new file mode 100644 index 0000000000000000000000000000000000000000..3e1455530e1d2634ff373573b2b64e7d16ee71b5 Binary files /dev/null and b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein.zip differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/envelope.template.xml deleted file mode 100644 index 58699f57d3a8c1adbb67844f29d1697ffa6be84c..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/envelope.template.xml +++ /dev/null @@ -1,49 +0,0 @@ -<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> - <s:Header> - <a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action> - <h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:3d280bfa-d790-4865-a6cf-f6656d7be13f" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <ItemsPending>0</ItemsPending> - </h:MsgBoxResponse> - <h:MessageMetaData xmlns:h="http://www.osci.eu/ws/2014/10/transport" xmlns="http://www.osci.eu/ws/2014/10/transport"> - <DeliveryAttributes> - <InitialSend>2024-03-21T08:56:35.214+01:00</InitialSend> - <Delivery>2024-03-21T08:56:38.417</Delivery> - </DeliveryAttributes> - <Originators> - <Author> - <Identifier type="xoev" name="Dataport" category="Engagement- und Hobbyportal">ehp:010100100000</Identifier> - </Author> - </Originators> - <Destinations> - <Reader> - <Identifier type="xoev" name="L100012.OE.279550874" category="Versammlungsbehörde">vbe:010550120100</Identifier> - </Reader> - </Destinations> - <MsgIdentification> - <MessageID xmlns="http://www.w3.org/2005/08/addressing">%s</MessageID> - </MsgIdentification> - <Qualifier> - <Service>urn:fim:Versammlungsanzeige:1.4</Service> - <BusinessScenario> - <Defined listURI="urn:de:dataport:codeliste:business.scenario" listVersionID="1"> - <code xmlns="">FIM_DATA</code> - </Defined> - </BusinessScenario> - <MessageType listURI="urn:de:payloadSchema:elementName" listVersionID="1.0" payloadSchema="urn:xoev-de:xfall:standard:fim-s17000652_1.4"> - <code xmlns="">fim.S17000652.17000652001004</code> - <name xmlns="">fim.S17000652.17000652001004</name> - </MessageType> - </Qualifier> - <MsgSize>1738</MsgSize> - </h:MessageMetaData> - </s:Header> - <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <GenericContentContainer xmlns="http://xoev.de/transport/xta/211"> - <ContentContainer> - <Message contentType="application/xml" filename="Antrag.xml" size="1738"> - <xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> - </Message> - </ContentContainer> - </GenericContentContainer> - </s:Body> -</s:Envelope> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/envelope.template.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/envelope.template.xml new file mode 100644 index 0000000000000000000000000000000000000000..8e77bc1ff5e9f8e5f2b94137ee9c6e1501b43b04 --- /dev/null +++ b/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/envelope.template.xml @@ -0,0 +1,18 @@ +<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> + <s:Header> + <a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action> + <h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <ItemsPending>0</ItemsPending> + </h:MsgBoxResponse> + %s + </s:Header> + <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <GenericContentContainer xmlns="http://xoev.de/transport/xta/211"> + <ContentContainer> + <Message contentType="application/xml" filename="%s" size="%s"> + <xop:Include href="cid:%s" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> + </Message> + </ContentContainer> + </GenericContentContainer> + </s:Body> +</s:Envelope> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/attachment.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/versammlungsanzeige.xml similarity index 100% rename from xta-adapter/src/test/resources/mock-responses/getMessage/Versammlungsanzeige/attachment.xml rename to xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/versammlungsanzeige.xml diff --git a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/AFM.template.xml b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/afm.template.xml similarity index 97% rename from xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/AFM.template.xml rename to xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/afm.template.xml index 8fead80cb247fd0f0b73e2722176340354cd08cf..361033e4e2a2a3e91f56f408481230dbe71f2e25 100644 --- a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/AFM.template.xml +++ b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/afm.template.xml @@ -28,5 +28,5 @@ <code xmlns="">Geschaeftsgang.Geschaeftsgang.0201</code> </MessageType> </Qualifier> - <MsgSize>40142</MsgSize> + <MsgSize>%s</MsgSize> </MessageMetaData> diff --git a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel.template.xml b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel.template.xml new file mode 100644 index 0000000000000000000000000000000000000000..b5f50562d4406a57e481baea5a729329787cdd3f --- /dev/null +++ b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel.template.xml @@ -0,0 +1,32 @@ +<MessageMetaData xmlns="http://www.osci.eu/ws/2014/10/transport"> + <DeliveryAttributes> + <Origin>2024-04-26T13:35:41.6323321Z</Origin> + <Delivery>2024-04-26T15:35:45.607</Delivery> + </DeliveryAttributes> + <Originators> + <Author> + <Identifier type="xoev" category="Generischer Antragsdienst">gad:010200200000</Identifier> + </Author> + </Originators> + <Destinations> + <Reader> + <Identifier type="xoev" category="Generischer Antragsempfänger">gae:dev-environment@ozg-cloud.de</Identifier> + </Reader> + </Destinations> + <MsgIdentification> + <a:MessageID>%s</a:MessageID> + </MsgIdentification> + <Qualifier> + <Service>urn:xoev-de:xdomea:schema:2.4.0/xdomea240Antrag.wsdl</Service> + <BusinessScenario> + <Defined listURI="urn:de:dataport:codeliste:business.scenario" listVersionID="1"> + <code xmlns="">XDOMEAGAD_DATA</code> + <name xmlns=""/> + </Defined> + </BusinessScenario> + <MessageType listURI="urn:de:payloadSchema:elementName" listVersionID="1.0" payloadSchema="urn:xoev-de:xdomea:schema:2.4.0"> + <code xmlns="">Geschaeftsgang.Geschaeftsgang.0201</code> + </MessageType> + </Qualifier> + <MsgSize>%s</MsgSize> +</MessageMetaData> diff --git a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Versammlungsanzeige.template.xml b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/fim.S17000652.17000652001004/versammlungsanzeige.template.xml similarity index 97% rename from xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Versammlungsanzeige.template.xml rename to xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/fim.S17000652.17000652001004/versammlungsanzeige.template.xml index 77f8e312dada38bba29bfe1e3cb6d14b168a9224..02b66074ed3eec73ec3018c92000bd6949821f3c 100644 --- a/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/Versammlungsanzeige.template.xml +++ b/xta-adapter/src/test/resources/mock-responses/getStatusList/MessageMetaData/fim.S17000652.17000652001004/versammlungsanzeige.template.xml @@ -33,5 +33,5 @@ <name xmlns="">fim.S17000652.17000652001004</name> </MessageType> </Qualifier> - <MsgSize>1738</MsgSize> + <MsgSize>%s</MsgSize> </MessageMetaData>