diff --git a/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java b/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java index a48971999cef954f616bfef82adadbe4cbd60889..c421d139c747d99c1163c47e4d0d59c0332f8c3a 100644 --- a/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java +++ b/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java @@ -45,6 +45,14 @@ public class ProcessorService { return forms.stream().filter(form -> StringUtils.equals(form.getFormEngineName(), vorgang.getFormEngineName())) .anyMatch(form -> StringUtils.equals(form.getFormId(), vorgang.getFormId())); } + + public Stream<Mono<ProcessorResult>> processVorgang(Vorgang vorgang, Collection<String> processorNames) { + return getProcessors(processorNames).map(processor -> callProcessor(processor, vorgang)); + } + + Stream<Processor> getProcessors(Collection<String> processorNames) { + return properties.getProcessors().stream().filter(processor -> processorNames.contains(processor.getName())); + } Mono<ProcessorResult> callProcessor(Processor processor, Vorgang vorgang) { LOG.info("Sending Vorgang {} to processors.", vorgang.getId()); @@ -68,9 +76,4 @@ public class ProcessorService { Mono<Throwable> buildRedirectError(ClientResponse clientResponse) { return Mono.error(new TechnicalException("Resource was moved (%s) ".formatted(clientResponse.statusCode()))); } - - public Stream<Mono<ProcessorResult>> processVorgang(Vorgang vorgang, Collection<String> processorName) { - //TODO Implement OZG-4513 - return null; - } -} +} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java index 7d102a97d3a21e54cc360f119f27c6e7be73ff86..eeb80baf544448f9d79a461a168db6a578516083 100644 --- a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java +++ b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; import java.time.Duration; +import java.util.Collections; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; @@ -54,10 +55,13 @@ class ProcessorServiceITCase { @BeforeEach void setup() { processor = ProcessorTestFactory.createBuilder().address(mockWebServer.url("/").toString()).build(); - MockResponse response = new MockResponse() + mockWebServer.enqueue(createMockResponse()); + } + + private MockResponse createMockResponse() { + return new MockResponse() .addHeader("Content-Type", "application/json") .setBody("{\"%s\": \"%s\"}".formatted(ProcessorResultTestFactory.KEY_RESULT_ACTION, ProcessorResultTestFactory.RESULT_ACTION)); - mockWebServer.enqueue(response); } @AfterEach @@ -203,6 +207,40 @@ class ProcessorServiceITCase { assertThrows(ProcessorTechnicalException.class, () -> results.forEach(Mono::block)); } + } + + @DisplayName("Process vorgang") + @Nested + class TestProcessVorgang { + + private MockWebServer mockWebServer = new MockWebServer(); + private Vorgang vorgang = VorgangTestFactory.create(); + private Processor processor = ProcessorTestFactory.createBuilder().address(mockWebServer.url("/").toString()).build(); + private ProcessorProperties properties = ProcessorProperties.builder().processor(processor).build(); + + @BeforeEach + void setup() { + ReflectionTestUtils.setField(service, "properties", properties); + } + @SneakyThrows + @AfterEach + void cleanup() { + mockWebServer.shutdown(); + } + + @Test + void shouldReturnProcessor() { + var result = service.processVorgang(vorgang, Collections.singleton(ProcessorTestFactory.PROCESSOR_NAME)); + + assertThat(result).isNotEmpty(); + } + + @Test + void shouldReturnEmptyStream() { + var result = service.processVorgang(vorgang, Collections.singleton("notMatchingProcessorName")); + + assertThat(result).isEmpty(); + } } } \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java index 11d4532c37cf9f0f9d69ca2ea4c577f8c2ee255e..8321bcf543dd84f10c1f117f597f130f398e60fb 100644 --- a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java +++ b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java @@ -1,8 +1,13 @@ package de.ozgcloud.processor.processor; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -14,11 +19,12 @@ import org.mockito.Mockito; import org.mockito.Spy; import de.ozgcloud.processor.processor.ProcessorProperties.Processor; +import de.ozgcloud.processor.vorgang.Vorgang; import de.ozgcloud.processor.vorgang.VorgangTestFactory; +import reactor.core.publisher.Mono; class ProcessorServiceTest { - @Spy @InjectMocks private ProcessorService service; @@ -28,7 +34,6 @@ class ProcessorServiceTest { @Mock private ProcessorConfiguration processorConfiguration; - @Nested class TestProcessVorgang { @@ -70,5 +75,79 @@ class ProcessorServiceTest { } } } - + + @DisplayName("Process vorgang by given processorNames") + @Nested + class TestProcessVorgangByGivenProcessorNames { + + private final Vorgang vorgang = VorgangTestFactory.create(); + private final Collection<String> processorNames = Collections.singleton(ProcessorTestFactory.PROCESSOR_NAME); + private final Processor processor = ProcessorTestFactory.create(); + private final Mono<ProcessorResult> processorMonoResponse = Mono.just(ProcessorResultTestFactory.create()); + + @Test + void shouldGetProcessorByNames() { + doReturn(Stream.of(processor)).when(service).getProcessors(anyCollection()); + + service.processVorgang(vorgang, processorNames); + + verify(service).getProcessors(processorNames); + } + + @Test + void shouldCallProcessor() { + doReturn(processorMonoResponse).when(service).callProcessor(any(), any()); + doReturn(Stream.of(processor)).when(service).getProcessors(anyCollection()); + + service.processVorgang(vorgang, processorNames).toList(); + + verify(service).callProcessor(any(), any()); + } + + @Test + void shouldReturnProcessorResult() { + doReturn(processorMonoResponse).when(service).callProcessor(any(), any()); + doReturn(Stream.of(processor)).when(service).getProcessors(anyCollection()); + + var result = service.processVorgang(vorgang, processorNames).toList(); + + assertThat(result).containsExactly(processorMonoResponse); + } + + @DisplayName("get processors") + @Nested + class TestGetProcessors { + + private final Processor processor = ProcessorTestFactory.create(); + + @Test + void shouldGetConfiguredProcessor() { + when(properties.getProcessors()).thenReturn(List.of(processor)); + + service.getProcessors(processorNames); + + verify(properties).getProcessors(); + } + + @DisplayName("should return processors matching processor name") + @Test + void shouldReturnProcessor() { + when(properties.getProcessors()).thenReturn(List.of(processor)); + + var processorResult = service.getProcessors(processorNames).toList(); + + assertThat(processorResult).containsExactly(processor); + } + + @DisplayName("should return empty stream on non matching processor name") + @Test + void shouldReturnEmpty() { + when(properties.getProcessors()).thenReturn(List.of(ProcessorTestFactory.createBuilder().name("notMatchin").build())); + + var processorResult = service.getProcessors(processorNames).toList(); + + assertThat(processorResult).isEmpty(); + } + } + } }