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 d5a8d537c84074c7a8bd5849fd744b320eeb3820..f8643d2fb5221c5e3585e4436c757a015cb7d3ee 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,6 +4,7 @@ import static java.util.Collections.*; import java.util.Collection; import java.util.List; +import java.util.Optional; import java.util.Spliterators; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -44,7 +45,10 @@ class XtaService { private XtaCurrentIdentifierService service; public Stream<FormData> getMessages() { - return createXtaMessageStream().filter(this::isSupportedMessageType).map(this::getFormData); + return createXtaMessageStream() + .filter(this::isSupportedMessageType) + .map(this::getFormDataIfNoRuntimeException) + .flatMap(Optional::stream); } Stream<XtaMessageMetaData> createXtaMessageStream() { @@ -66,7 +70,16 @@ class XtaService { return false; } - public FormData getFormData(@NonNull XtaMessageMetaData metaData) { + Optional<FormData> getFormDataIfNoRuntimeException(@NonNull XtaMessageMetaData metaData) { + try { + return Optional.of(getFormData(metaData)); + } catch (RuntimeException exception) { + LOG.error("Failed to process xta message (id: %s)".formatted(metaData.getMessageId()), exception); + return Optional.empty(); + } + } + + FormData getFormData(@NonNull XtaMessageMetaData metaData) { var msg = remoteService.getMessage(metaData.getMessageId()); var incomingFiles = xtaIncomingFilesMapper.toIncomingFiles(msg.getMessageFiles()); var representationsAttachmentsPair = getRepresentationsAttachmentsPair(metaData, incomingFiles); 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 374d71632023fb10b42f1698b4b7c44d1e462445..2d73c58212d230db5235b25e502bbb7f5ab08949 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 @@ -6,6 +6,7 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.List; +import java.util.Optional; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; @@ -49,52 +50,93 @@ class XtaServiceTest { @Mock private XtaCurrentIdentifierService currentIdentifierService; + @Mock + private FormData formData; + + @Mock + private FormData formData2; + @Nested class TestGetMessagesAsFormData { private final XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create(); private final XtaMessage message = XtaMessageTestFactory.create(); - @BeforeEach - void setup() { - doReturn(Stream.of(messageMetaData)).when(service).createXtaMessageStream(); - } + @DisplayName("with one message") + @Nested + class TestWithOneMessage { + @BeforeEach + void setup() { + doReturn(Stream.of(messageMetaData)).when(service).createXtaMessageStream(); + } - @Test - void shouldCallCreateStream() { - service.getMessages(); + @Test + void shouldCallCreateStream() { + service.getMessages(); - verify(service).createXtaMessageStream(); - } + verify(service).createXtaMessageStream(); + } - @Test - void shouldCallFilterByMessageType() { - setupMocks(); + @Test + void shouldCallFilterByMessageType() { + setupMocks(); - service.getMessages().toList(); + service.getMessages().toList(); - verify(service).isSupportedMessageType(messageMetaData); - } + verify(service).isSupportedMessageType(messageMetaData); + } - @Test - void shouldCallGetFormData() { - setupMocks(); - doReturn(true).when(service).isSupportedMessageType(messageMetaData); + @Test + void shouldCallGetFormDataIfNoRuntimeException() { + setupMocks(); + doReturn(true).when(service).isSupportedMessageType(messageMetaData); - service.getMessages().toList(); + service.getMessages().toList(); - verify(service).getFormData(messageMetaData); + verify(service).getFormData(messageMetaData); + } + + @Test + void shouldNotCallGetFormDataIfNoRuntimeException() { + doReturn(false).when(service).isSupportedMessageType(messageMetaData); + + service.getMessages().toList(); + + verify(service, never()).getFormDataIfNoRuntimeException(any()); + } } - @Test - void shouldNotCallGetFormData() { - doReturn(false).when(service).isSupportedMessageType(messageMetaData); + @DisplayName("with multiple messages") + @Nested + class TestWithMultipleMessages { + private final XtaMessageMetaData messageMetaData2 = XtaMessageMetaDataTestFactory.createBuilder() + .messageId(XtaMessageId.from("messageId2")) + .build(); + private final XtaMessageMetaData messageMetaData3 = XtaMessageMetaDataTestFactory.createBuilder() + .messageId(XtaMessageId.from("messageId3")) + .build(); + + @BeforeEach + void setup() { + doReturn(Stream.of(messageMetaData, messageMetaData2, messageMetaData3)).when(service).createXtaMessageStream(); + } - service.getMessages().toList(); + @DisplayName("should return stream of messages") + @Test + void shouldReturnStreamOfMessages() { + doReturn(true).when(service).isSupportedMessageType(messageMetaData); + doReturn(false).when(service).isSupportedMessageType(messageMetaData3); + doReturn(true).when(service).isSupportedMessageType(messageMetaData2); + doReturn(Optional.of(formData)).when(service).getFormDataIfNoRuntimeException(messageMetaData); + doReturn(Optional.of(formData2)).when(service).getFormDataIfNoRuntimeException(messageMetaData2); - verify(service, never()).getFormData(any()); + var result = service.getMessages().toList(); + + assertThat(result).containsExactly(formData, formData2); + } } + private void setupMocks() { var testFormData = FormDataTestFactory.create(); when(mapper.toFormData(any(), any(), eq(vorgangNummerSupplier))).thenReturn(testFormData); @@ -129,6 +171,53 @@ class XtaServiceTest { } } + @DisplayName("get form data if no runtime exception") + @Nested + class TestGetFormDataIfNoRuntimeException { + + @Mock + XtaMessageMetaData messageMetaData; + + @Mock + FormData formData; + + @DisplayName("should call get formdata") + @Test + void shouldCallGetFormdata() { + service.getFormDataIfNoRuntimeException(messageMetaData); + + verify(service).getFormData(messageMetaData); + } + + @DisplayName("with exception") + @Nested + class TestWithException { + @DisplayName("should return empty") + @Test + void shouldReturnEmpty() { + doThrow(new RuntimeException("test-error")).when(service).getFormData(any()); + + var result = service.getFormDataIfNoRuntimeException(messageMetaData); + + assertThat(result).isEmpty(); + } + } + + @DisplayName("without exception") + @Nested + class TestWithoutException { + @DisplayName("should return") + @Test + void shouldReturn() { + doReturn(formData).when(service).getFormData(any()); + + var result = service.getFormDataIfNoRuntimeException(messageMetaData); + + assertThat(result).contains(formData); + } + } + } + @Nested class TestGetFormData {