diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapper.java index 9ddc1287c6c7433070c59de09264b0f8156bcc75..3e0ed8c3336fe365c2f8779cf1d6ecf98d37719f 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapper.java @@ -1,11 +1,20 @@ package de.ozgcloud.eingang.semantik.formbased.mantelantrag; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.UnaryOperator; import java.util.stream.IntStream; +import jakarta.annotation.PostConstruct; + import org.apache.commons.collections.MapUtils; +import org.apache.logging.log4j.util.Strings; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @@ -32,6 +41,18 @@ public class MantelantragZustaendigeStelleMapper implements FormBasedMapper { static final String TELEFON_FIELD = "telefon"; private final Environment environment; + private Set<String> xtaIdentifiers; + + @PostConstruct + void init() { + xtaIdentifiers = new HashSet<>(getIdentifierList()); + } + + List<String> getIdentifierList() { + return Binder.get(environment) + .bind("ozgcloud.xta.identifiers", Bindable.listOf(String.class)) + .orElseGet(Collections::emptyList); + } @Override public boolean isResponsible(FormData formData) { @@ -46,11 +67,15 @@ public class MantelantragZustaendigeStelleMapper implements FormBasedMapper { try { return adaptFormDataWithPossibleException(formData); } catch (TechnicalException exception) { - LOG.warn("Mantelantrag is invalid: %s".formatted(exception.getMessage())); + logWarningForFailure(exception); return formData; } } + void logWarningForFailure(Exception exception) { + LOG.warn("Failed mapping Zustaendigestelle of Mantelantrag: %s".formatted(exception.getMessage())); + } + FormData adaptFormDataWithPossibleException(FormData formData) { var fieldMap = formData.getFormData(); var slotIndex = findSlotIndex(fieldMap); @@ -85,15 +110,40 @@ public class MantelantragZustaendigeStelleMapper implements FormBasedMapper { } int findSlotIndex(Map<String, Object> fieldMap) { - var identifier = environment.getProperty("ozgcloud.xta.identifier"); + var matchingSlots = getMatchingSlots(fieldMap); + verifyOneMatchingIdentifier(matchingSlots); + return matchingSlots.getFirst(); + } + + private void verifyOneMatchingIdentifier(List<Integer> matchingSlots) { + if (matchingSlots.size() != 1) { + var message = getMultipleSlotsMessage(matchingSlots); + if (matchingSlots.isEmpty()) { + throw new TechnicalException(message); + } else { + logWarningForUnexpected(message); + } + } + } + + void logWarningForUnexpected(String message) { + LOG.warn("Unexpected Zustaendigestelle in Mantelantrag: %s".formatted(message)); + } + + String getMultipleSlotsMessage(List<Integer> matchingSlots) { + return "Found %d matching nachrichtenbroker addresses! Expected one of '%s'.".formatted(matchingSlots.size(), + Strings.join(xtaIdentifiers, ',')); + } + + private List<Integer> getMatchingSlots(Map<String, Object> fieldMap) { 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))); + .filter(slotIndex -> xtaIdentifiers.contains(getXtaIdentifierOfSlot(fieldMap, slotIndex))) + .boxed() + .toList(); + } + + private String getXtaIdentifierOfSlot(Map<String, Object> fieldMap, int slotIndex) { + return getFieldByKeyOrEmpty(fieldMap, getNameForSlotIndex(ZUSTELLUNG_NACHRICHTENBROKER_FIELD, slotIndex)); } String getNameForSlotIndex(String name, int slotIndex) { diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragITCase.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragITCase.java index 9d2094d600c3eed7495003e5dfa9ba969a9b4599..a4951086c82837ebc3c01ef5f19b8833882b0e3c 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragITCase.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragITCase.java @@ -29,7 +29,7 @@ import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngin import lombok.SneakyThrows; @ActiveProfiles({ "local", "itcase" }) -@SpringBootTest(classes = Application.class, properties = { "ozgcloud.xta.identifier=afmsh:ozg-cloud-utopia-test" }) +@SpringBootTest(classes = Application.class, properties = { "ozgcloud.xta.identifiers=afmsh:ozg-cloud-utopia-test" }) public class MantelantragITCase { private static final String FILE_NAME_XDOMEA = "mantelantrag/4620-EH6C_b3c9168a-6ae9-4361-8b2f-6837bb341021_Geschaeftsgang.Geschaeftsgang.0201.xml"; diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapperTest.java index f03169a6704aae741e3234b82aff876448b027d6..2cad108d2ae30f76782b0c9ddfdd934becb9be37 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapperTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapperTest.java @@ -5,6 +5,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; @@ -17,10 +18,11 @@ 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.ArgumentCaptor; +import org.mockito.Captor; 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; @@ -31,13 +33,18 @@ import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; class MantelantragZustaendigeStelleMapperTest { private final static String TARGET_OEID = "123456"; private static final String IDENTIFIER = "gea:test"; + private static final String IDENTIFIER2 = "dfad:test"; + private static final List<String> IDENTIFIERS = List.of(IDENTIFIER, IDENTIFIER2, "aa:other"); @Spy @InjectMocks private MantelantragZustaendigeStelleMapper mapper; - @Mock - private Environment environment; + @BeforeEach + void mock() { + doReturn(IDENTIFIERS).when(mapper).getIdentifierList(); + mapper.init(); + } @DisplayName("is responsible") @Nested @@ -128,6 +135,17 @@ class MantelantragZustaendigeStelleMapperTest { assertThat(resultFormData).isEqualTo(formData); } + + @DisplayName("should log warning with exception") + @Test + void shouldLogWarningWithException() { + var exception = new TechnicalException("some error"); + doThrow(exception).when(mapper).adaptFormDataWithPossibleException(formData); + + mapper.parseFormData(formData); + + verify(mapper).logWarningForFailure(exception); + } } @DisplayName("adapt form data with possible exception") @@ -275,10 +293,11 @@ class MantelantragZustaendigeStelleMapperTest { private Map<String, Object> fieldMap; + @Captor + private ArgumentCaptor<String> warningCaptor; + @BeforeEach void mock() { - when(environment.getProperty("ozgcloud.xta.identifier")).thenReturn(IDENTIFIER); - fieldMap = new HashMap<>(Map.of( getZustaendigeStelleName(1), "unknown", getZustaendigeStelleName(2), "" @@ -306,6 +325,18 @@ class MantelantragZustaendigeStelleMapperTest { assertThatThrownBy(() -> mapper.findSlotIndex(fieldMap)) .isInstanceOf(TechnicalException.class); } + + @DisplayName("should log warning if multiple slots match") + @Test + void shouldLogWarningIfMultipleSlotsMatch() { + fieldMap.put(getZustaendigeStelleName(0), IDENTIFIER2); + fieldMap.put(getZustaendigeStelleName(2), IDENTIFIER); + + mapper.findSlotIndex(fieldMap); + + verify(mapper).logWarningForUnexpected(warningCaptor.capture()); + assertThat(warningCaptor.getValue()).isEqualTo(mapper.getMultipleSlotsMessage(List.of(0, 2))); + } } @DisplayName("get name for slot index") diff --git a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml b/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml index b8d0d2b9870587f17f992129bf23928c2bcb48a0..25da0415e81e4921e726683f62a7f9e1526a3d5a 100644 --- a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml +++ b/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml @@ -63,8 +63,8 @@ spec: value: {{ (.Values.xta).server.address }} - name: ozgcloud_xta_server_protocol value: {{ (.Values.xta).server.protocol }} - - name: ozgcloud_xta_identifier - value: {{ quote (.Values.xta).identifier }} + - name: ozgcloud_xta_identifiers + value: {{ (.Values.xta).identifiers | join "," | quote }} - name: ozgcloud_xta_keystore_file value: "keystore/xta-keystore.p12" - name: ozgcloud_xta_keystore_password @@ -170,4 +170,4 @@ spec: {{- with .Values.podSecurityContext }} securityContext: {{ toYaml . | indent 12 }} - {{- end }} \ No newline at end of file + {{- end }} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java index a685b0a20bfc5a93b90dcd606cebb2dea31e8187..f0ae4deba9f754a290717d608921cc3acf353301 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java @@ -1,5 +1,11 @@ package de.ozgcloud.eingang.xta; +import java.util.Objects; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBException; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.ws.client.WebServiceClientException; @@ -11,17 +17,12 @@ import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import eu.osci.ws._2014._10.transport.OriginatorsType; import eu.osci.ws._2014._10.transport.PartyIdentifierType; import eu.osci.ws._2014._10.transport.PartyType; -import jakarta.validation.Valid; -import jakarta.xml.bind.JAXBContext; -import jakarta.xml.bind.JAXBElement; -import jakarta.xml.bind.JAXBException; @Component class WsHeaderAddingInterceptor implements ClientInterceptor { @Autowired - @Valid - private XtaProperties properties; + private XtaCurrentIdentifierService xtaCurrentIdentifierService; @Override public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { @@ -44,7 +45,10 @@ class WsHeaderAddingInterceptor implements ClientInterceptor { PartyType partyType = new PartyType(); PartyIdentifierType identifier = new PartyIdentifierType(); - identifier.setValue(properties.getIdentifier()); + identifier.setValue(Objects.requireNonNull( + xtaCurrentIdentifierService.getCurrentIdentifier(), + "Expect current identifier to be set!") + ); partyType.setIdentifier(identifier); var origin = new OriginatorsType(); diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierService.java new file mode 100644 index 0000000000000000000000000000000000000000..f5f6b25a9b49c40f8a088305b237570a11761b14 --- /dev/null +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierService.java @@ -0,0 +1,28 @@ +package de.ozgcloud.eingang.xta; + +import java.util.List; + +import jakarta.validation.Valid; + +import org.springframework.stereotype.Service; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +@Service +@RequiredArgsConstructor +public class XtaCurrentIdentifierService { + + @Setter + @Getter + private String currentIdentifier; + + @Valid + private final XtaProperties properties; + + public List<String> getIdentifiers() { + return properties.getIdentifiers(); + } + +} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java index 2f31999ff99e8d9e997a8e57b6ee2b6260855beb..23a4e4bcc030f56f017200536653a3fca84c44d4 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java @@ -2,6 +2,7 @@ package de.ozgcloud.eingang.xta; import java.math.BigInteger; import java.net.URI; +import java.util.List; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -31,7 +32,7 @@ class XtaProperties { private KeyStore keyStore; private Actions actions; @NotEmpty - private String identifier; + private List<String> identifiers; } @Validated diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java index 2341fbf6dc93899cb0c195ee6f09be52266c5c81..ae71ea062381ed78d7c32bb211100af55b55ed86 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java @@ -4,14 +4,13 @@ import java.util.Spliterators; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper; -import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; +import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper; import lombok.NonNull; import lombok.extern.log4j.Log4j2; @@ -31,12 +30,20 @@ class XtaService { private XdomeaMessageDataMapper xdomeaMessageDataMapper; @Autowired private XtaIncomingFilesMapper xtaIncomingFilesMapper; + @Autowired + private XtaCurrentIdentifierService service; public Stream<FormData> getMessages() { return createXtaMessageStream().filter(this::isSupportedMessageType).map(this::getFormData); } Stream<XtaMessageMetaData> createXtaMessageStream() { + return service.getIdentifiers().stream() + .flatMap(this::createXtaMessageStreamForIdentifier); + } + + private Stream<XtaMessageMetaData> createXtaMessageStreamForIdentifier(String identifier) { + service.setCurrentIdentifier(identifier); var iterator = new XtaMessageMetadataRemoteIterator(remoteService); return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false); } diff --git a/xta-adapter/src/main/resources/application-local.yml b/xta-adapter/src/main/resources/application-local.yml index 83e7b8ca8d1088a6fcbae18446b9ac917d21f942..b35125c65bce0ce95de34f97fb97c398bbcefc15 100644 --- a/xta-adapter/src/main/resources/application-local.yml +++ b/xta-adapter/src/main/resources/application-local.yml @@ -1,6 +1,7 @@ ozgcloud: xta: - identifier: gae:jens.reese@mgm-tp.com + identifiers: + - gae:jens.reese@mgm-tp.com server: address: localhost:3000 name: LI33-0005 diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml index 3e4e37b8fe3f8ad0fce65be7a136aa3b8219431c..7eac13e81398613f23cc5e4dedc3309b69030c5a 100644 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml +++ b/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml @@ -60,7 +60,8 @@ tests: image.name: xta-adapter xta: schedule: "1 1 * * * *" - identifier: gae:test@ozg-sh.de + identifiers: + - gae:test@ozg-sh.de server: address: 1.2.3.4 name: test @@ -144,4 +145,4 @@ tests: path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.capabilities value: drop: - - ALL \ No newline at end of file + - ALL diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_env_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_env_test.yaml index 30ad85fc12a3b14b56cecbbc4bc08b18f4d0d20a..77547800e84d3f8f60fe508c57df9e5f7d0a0de6 100644 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_env_test.yaml +++ b/xta-adapter/src/test/helm/xta_adapter_cronjob_env_test.yaml @@ -36,7 +36,9 @@ tests: set: image.name: xta-adapter xta: - identifier: gae:test@ozg-sh.de + identifiers: + - gae:test@ozg-sh.de + - afmsh:test@ozg-sh.de server: name: test address: 1.2.3.4 @@ -70,8 +72,8 @@ tests: - contains: path: spec.jobTemplate.spec.template.spec.containers[0].env content: - name: ozgcloud_xta_identifier - value: "gae:test@ozg-sh.de" + name: ozgcloud_xta_identifiers + value: "gae:test@ozg-sh.de,afmsh:test@ozg-sh.de" - contains: path: spec.jobTemplate.spec.template.spec.containers[0].env content: @@ -116,7 +118,8 @@ tests: image.name: xta-adapter env.overrideSpringProfiles: local xta: - identifier: gae:test@ozg-sh.de + identifiers: + - gae:test@ozg-sh.de server: name: test address: 1.2.3.4 @@ -196,4 +199,4 @@ tests: path: spec.jobTemplate.spec.template.spec.containers[0].env content: name: my_test_environment_name - value: "A test value" \ No newline at end of file + value: "A test value" diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_volumes_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_volumes_test.yaml index 7af81adc1e39cc206f113ab1e00415b147a65f99..352f196bf1b8a8cafccb6fa868e8da0efe595636 100644 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_volumes_test.yaml +++ b/xta-adapter/src/test/helm/xta_adapter_cronjob_volumes_test.yaml @@ -36,7 +36,8 @@ tests: set: image.name: xta-adapter xta: - identifier: gae:test@ozg-sh.de + identifiers: + - gae:test@ozg-sh.de server: name: test address: 1.2.3.4 @@ -66,7 +67,8 @@ tests: set: image.name: xta-adapter xta: - identifier: gae:test@ozg-sh.de + identifiers: + - gae:test@ozg-sh.de server: name: test address: 1.2.3.4 diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..884faf6b4dad5eda37f6be16c92b4e88cc3d095a --- /dev/null +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierServiceTest.java @@ -0,0 +1,44 @@ +package de.ozgcloud.eingang.xta; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +class XtaCurrentIdentifierServiceTest { + + private static final String IDENTIFIER1 = "identifier1"; + private static final String IDENTIFIER2 = "identifier2"; + private static final List<String> IDENTIFIERS = List.of(IDENTIFIER1, IDENTIFIER2); + + @Spy + @InjectMocks + private XtaCurrentIdentifierService service; + + @Mock + private XtaProperties properties; + + @DisplayName("get identifiers") + @Nested + class TestGetIdentifiers { + @BeforeEach + void mock() { + when(properties.getIdentifiers()).thenReturn(IDENTIFIERS); + } + + @DisplayName("should return") + @Test + void shouldReturn() { + assertThat(service.getIdentifiers()).isEqualTo(IDENTIFIERS); + } + } + +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java index 75a00a6610db89ffeaed0ba620d4676038fda296..997ce3bf36df47953077bbda509fc1f68705f83f 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java @@ -8,6 +8,7 @@ import java.util.List; 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.mockito.ArgumentCaptor; @@ -19,8 +20,8 @@ import org.mockito.Spy; import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; import de.ozgcloud.eingang.xdomea.XdomeaMessageData; -import de.ozgcloud.eingang.xdomea.XdomeaMessageDataTestFactory; import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper; +import de.ozgcloud.eingang.xdomea.XdomeaMessageDataTestFactory; class XtaServiceTest { @@ -43,6 +44,9 @@ class XtaServiceTest { @Mock private XdomeaMessageDataMapper xdomeaMessageDataMapper; + @Mock + private XtaCurrentIdentifierService currentIdentifierService; + @Nested class TestGetMessagesAsFormData { @@ -124,7 +128,7 @@ class XtaServiceTest { private ArgumentCaptor<XtaMessageMetaData> messageMetaDataCaptor; @Captor - private ArgumentCaptor<XdomeaMessageData> classificationCaptor; + private ArgumentCaptor<XdomeaMessageData> classificationCaptor; @BeforeEach void init() { @@ -185,4 +189,46 @@ class XtaServiceTest { } } + @DisplayName("create XTA message stream") + @Nested + class TestCreateXtaMessageStream { + private static final List<String> XTA_IDENTIFIERS = List.of("XTA_IDENTIFIER", "XTA_IDENTIFIER2"); + + @Captor + private ArgumentCaptor<String> identifierCaptor; + + @BeforeEach + void mock() { + when(remoteService.getMessagesMetadata()) + .thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create()) + .thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create()); + when(currentIdentifierService.getIdentifiers()).thenReturn(XTA_IDENTIFIERS); + } + + @DisplayName("should return") + @Test + void shouldReturn() { + var result = service.createXtaMessageStream().toList(); + + assertThat(result).isEqualTo(getExpectedMessages()); + } + + private List<XtaMessageMetaData> getExpectedMessages() { + return Stream.concat( + XtaMessageMetaDatasAndHeaderTestFactory.create().getMessages(), + XtaMessageMetaDatasAndHeaderTestFactory.create().getMessages() + ).toList(); + } + + @DisplayName("should call set current identifier") + @Test + void shouldCallSetCurrentIdentifier() { + service.createXtaMessageStream().toList(); + + verify(currentIdentifierService, times(2)) + .setCurrentIdentifier(identifierCaptor.capture()); + assertThat(identifierCaptor.getAllValues()).isEqualTo(XTA_IDENTIFIERS); + } + } + } diff --git a/xta-adapter/src/test/resources/application-itcase.yml b/xta-adapter/src/test/resources/application-itcase.yml index 99b88fbe12ffdb4562dc264c08595afde1b9092a..e4f04915dcad084966187e831830afba2e8da1c1 100644 --- a/xta-adapter/src/test/resources/application-itcase.yml +++ b/xta-adapter/src/test/resources/application-itcase.yml @@ -1,6 +1,7 @@ ozgcloud: xta: - identifier: afmsh:010600000000_Online-Dienste + identifiers: + - afmsh:010600000000_Online-Dienste server: address: localhost:3000 name: LI33-0005