diff --git a/src/main/java/de/ozgcloud/aggregation/AggregationManagerRunner.java b/src/main/java/de/ozgcloud/aggregation/AggregationManagerRunner.java index 3629c317ecacf3a46c778bab7472af4c11fea46b..1d9fec5f0f6106859ce05eb3f48b2a692e5e4371 100644 --- a/src/main/java/de/ozgcloud/aggregation/AggregationManagerRunner.java +++ b/src/main/java/de/ozgcloud/aggregation/AggregationManagerRunner.java @@ -25,6 +25,7 @@ package de.ozgcloud.aggregation; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.UUID; import java.util.function.Function; import java.util.function.IntFunction; @@ -40,6 +41,7 @@ import org.springframework.boot.CommandLineRunner; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; +import de.ozgcloud.aggregation.transformation.AggregationMapping.FormIdentifier; import de.ozgcloud.aggregation.transformation.Transformation; import de.ozgcloud.aggregation.transformation.TransformationException; import de.ozgcloud.aggregation.transformation.TransformationService; @@ -48,6 +50,7 @@ import de.ozgcloud.aggregation.warehouse.DocumentEntry; import de.ozgcloud.aggregation.warehouse.WarehouseRepository; import de.ozgcloud.apilib.vorgang.OzgCloudVorgang; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQuery; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangQuery.FormIdentification; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub; import de.ozgcloud.apilib.vorgang.Page; @@ -80,19 +83,19 @@ public class AggregationManagerRunner implements CommandLineRunner { var identifier = transformationProperties.getIdentifier(); var aggregationMappings = transformationProperties.getAggregationMappings(); if (Objects.isNull(aggregationMappings) || aggregationMappings.isEmpty()) { - runWithTransformation(transformationService.load(identifier, null)); + runWithTransformation(transformationService.load(identifier, null), null); } else { aggregationMappings.stream() - .map(aggregationMapping -> transformationService.load(identifier, aggregationMapping)) - .forEach(this::runWithTransformation); + .forEach(aggregationMapping -> runWithTransformation(transformationService.load(identifier, aggregationMapping), + aggregationMapping.getFormIdentifier())); } } - void runWithTransformation(Transformation transformation) { + void runWithTransformation(Transformation transformation, FormIdentifier formIdentifier) { try (Execution execution = new Execution(transformation)) { ThreadContext.put(MDC_EXECUTION, execution.id.toString()); loadVorgaengeIntoRepository(Stream.concat( - extractBatchesOfVorgaengeFromDataSource(execution), + extractBatchesOfVorgaengeFromDataSource(execution, formIdentifier), extractBatchesOfDeletedVorgaengeFromDataSource(execution))); } finally { ThreadContext.remove(MDC_EXECUTION); @@ -103,18 +106,28 @@ public class AggregationManagerRunner implements CommandLineRunner { batches.map(this::transformBatchToDocumentEntries).forEach(this::loadDocumentEntriesIntoRepository); } - Stream<Batch> extractBatchesOfVorgaengeFromDataSource(Execution execution) { - return extractBatchesFromDataSource(execution, this::getVorgaengeFromDataSource); + Stream<Batch> extractBatchesOfVorgaengeFromDataSource(Execution execution, FormIdentifier formIdentifier) { + return extractBatchesFromDataSource(execution, page -> getVorgaengeFromDataSource(page, formIdentifier)); } - List<OzgCloudVorgang> getVorgaengeFromDataSource(Page page) { - return vorgangService.find(buildFindAllQuery(), page).stream() + List<OzgCloudVorgang> getVorgaengeFromDataSource(Page page, FormIdentifier formIdentifier) { + return vorgangService.find(buildFindByFormEngineQuery(formIdentifier), page).stream() .map(vorgangStub -> vorgangService.getById(vorgangStub.getId())) .toList(); } - OzgCloudVorgangQuery buildFindAllQuery() { - return OzgCloudVorgangQuery.builder().build(); + OzgCloudVorgangQuery buildFindByFormEngineQuery(FormIdentifier formIdentifier) { + return OzgCloudVorgangQuery.builder() + .form(mapToFormIdentification(formIdentifier)) + .build(); + } + + private Optional<FormIdentification> mapToFormIdentification(FormIdentifier formIdentifier) { + return Optional.ofNullable(formIdentifier) + .map(identifier -> FormIdentification.builder() + .formId(identifier.getFormId()) + .formEngineName(identifier.getFormEngineName()) + .build()); } Stream<Batch> extractBatchesOfDeletedVorgaengeFromDataSource(Execution execution) { diff --git a/src/test/java/de/ozgcloud/aggregation/AggregationManagerRunnerTest.java b/src/test/java/de/ozgcloud/aggregation/AggregationManagerRunnerTest.java index b9e7f4c3aa06073458d6485d9281d0af9d427ca2..92d4198ba9e3c40faedf75c6dc5b51956f633a66 100644 --- a/src/test/java/de/ozgcloud/aggregation/AggregationManagerRunnerTest.java +++ b/src/test/java/de/ozgcloud/aggregation/AggregationManagerRunnerTest.java @@ -48,7 +48,9 @@ import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.aggregation.AggregationManagerRunner.Batch; import de.ozgcloud.aggregation.AggregationManagerRunner.Execution; import de.ozgcloud.aggregation.transformation.AggregationMapping; +import de.ozgcloud.aggregation.transformation.AggregationMapping.FormIdentifier; import de.ozgcloud.aggregation.transformation.AggregationMappingTestFactory; +import de.ozgcloud.aggregation.transformation.FormIdentifierTestFactory; import de.ozgcloud.aggregation.transformation.Transformation; import de.ozgcloud.aggregation.transformation.TransformationService; import de.ozgcloud.aggregation.transformation.VorgangMapper; @@ -88,7 +90,7 @@ class AggregationManagerRunnerTest { @BeforeEach void mock() { when(transformationProperties.getIdentifier()).thenReturn(identifier); - doNothing().when(runner).runWithTransformation(any()); + doNothing().when(runner).runWithTransformation(any(), any()); } @Test @@ -132,8 +134,8 @@ class AggregationManagerRunnerTest { void shouldRunWithTransformationForEachTransformation() { runner.run(); - verify(runner).runWithTransformation(firstTransformation); - verify(runner).runWithTransformation(secondTransformation); + verify(runner).runWithTransformation(firstTransformation, AggregationMappingTestFactory.FORM_IDENTIFIER); + verify(runner).runWithTransformation(secondTransformation, AggregationMappingTestFactory.FORM_IDENTIFIER); } } @@ -159,7 +161,7 @@ class AggregationManagerRunnerTest { void shouldCallRunWithTransformation() { runner.run(); - verify(runner).runWithTransformation(transformation); + verify(runner).runWithTransformation(transformation, null); } } @@ -185,7 +187,7 @@ class AggregationManagerRunnerTest { void shouldCallRunWithTransformation() { runner.run(); - verify(runner).runWithTransformation(transformation); + verify(runner).runWithTransformation(transformation, null); } } } @@ -196,6 +198,7 @@ class AggregationManagerRunnerTest { @Mock private Transformation transformation; private final ArgumentMatcher<Execution> hasTransformation = execution -> execution.getTransformation().equals(transformation); + private final FormIdentifier formIdentifier = FormIdentifierTestFactory.create(); @Mock private Batch batchOfVorgaenge; @Mock @@ -205,28 +208,28 @@ class AggregationManagerRunnerTest { @BeforeEach void init() { - doReturn(Stream.of(batchOfVorgaenge)).when(runner).extractBatchesOfVorgaengeFromDataSource(any()); + doReturn(Stream.of(batchOfVorgaenge)).when(runner).extractBatchesOfVorgaengeFromDataSource(any(), any()); doReturn(Stream.of(batchOfDeletedVorgaenge)).when(runner).extractBatchesOfDeletedVorgaengeFromDataSource(any()); doNothing().when(runner).loadVorgaengeIntoRepository(any()); } @Test void shouldExtractBatchesOfVorgaengeFromDataSource() { - runner.runWithTransformation(transformation); + runner.runWithTransformation(transformation, formIdentifier); - verify(runner).extractBatchesOfVorgaengeFromDataSource(argThat(hasTransformation)); + verify(runner).extractBatchesOfVorgaengeFromDataSource(argThat(hasTransformation), eq(formIdentifier)); } @Test void shouldExtractBatchesOfDeletedVorgaengeFromDataSource() { - runner.runWithTransformation(transformation); + runner.runWithTransformation(transformation, formIdentifier); verify(runner).extractBatchesOfDeletedVorgaengeFromDataSource(argThat(hasTransformation)); } @Test void shouldLoadVorgaengeIntoRepository() { - runner.runWithTransformation(transformation); + runner.runWithTransformation(transformation, formIdentifier); verify(runner).loadVorgaengeIntoRepository(batchStreamCaptor.capture()); assertThat(batchStreamCaptor.getValue()).containsExactly(batchOfVorgaenge, batchOfDeletedVorgaenge); @@ -273,6 +276,7 @@ class AggregationManagerRunnerTest { @Nested class TestExtractBatchesOfVorgaengeFromDataSource { + private final FormIdentifier formIdentifier = FormIdentifierTestFactory.create(); @Mock private Execution execution; @Captor @@ -289,23 +293,23 @@ class AggregationManagerRunnerTest { @Test void shouldExtract() { - runner.extractBatchesOfVorgaengeFromDataSource(execution); + runner.extractBatchesOfVorgaengeFromDataSource(execution, formIdentifier); verify(runner).extractBatchesFromDataSource(eq(execution), any()); } @Test void shouldExtractWithDataRetrievalFunction() { - runner.extractBatchesOfVorgaengeFromDataSource(execution); + runner.extractBatchesOfVorgaengeFromDataSource(execution, formIdentifier); verify(runner).extractBatchesFromDataSource(eq(execution), functionToRetrieveDataCaptor.capture()); functionToRetrieveDataCaptor.getValue().apply(page); - verify(runner).getVorgaengeFromDataSource(page); + verify(runner).getVorgaengeFromDataSource(page, formIdentifier); } @Test void shouldReturnExtractedBatches() { - var extracted = runner.extractBatchesOfVorgaengeFromDataSource(execution); + var extracted = runner.extractBatchesOfVorgaengeFromDataSource(execution, formIdentifier); assertThat(extracted).containsExactly(batch); } @@ -315,15 +319,23 @@ class AggregationManagerRunnerTest { class TestGetVorgaengeFromDataSource { private final Page page = Page.builder().offset(10).limit(2).build(); + private final FormIdentifier formIdentifier = FormIdentifierTestFactory.create(); private final OzgCloudVorgangQuery query = OzgCloudVorgangQuery.builder().build(); @BeforeEach void init() { - doReturn(query).when(runner).buildFindAllQuery(); + doReturn(query).when(runner).buildFindByFormEngineQuery(any()); when(vorgangService.find(any(), any())).thenReturn(List.of(OzgCloudVorgangStubTestFactory.create())); when(vorgangService.getById(any())).thenReturn(OzgCloudVorgangTestFactory.create()); } + @Test + void shouldCallBuildFindByFormEngineQuery() { + getVorgaengeFromDataSource(); + + verify(runner).buildFindByFormEngineQuery(formIdentifier); + } + @Test void shouldCallVorgangService() { getVorgaengeFromDataSource(); @@ -346,7 +358,40 @@ class AggregationManagerRunnerTest { } private List<OzgCloudVorgang> getVorgaengeFromDataSource() { - return runner.getVorgaengeFromDataSource(page); + return runner.getVorgaengeFromDataSource(page, formIdentifier); + } + } + + @Nested + class TestBuildFindByFormEngineQuery { + + @Nested + class TestOnFormIdentifierNull { + @Test + void shouldReturnFindAllQueryOnNullFormIdentifier() { + var query = runner.buildFindByFormEngineQuery(null); + + assertThat(query).usingRecursiveComparison().isEqualTo(OzgCloudVorgangQuery.builder().build()); + } + } + + @Nested + class TestOnFormIdentifierNotNull { + private final FormIdentifier formIdentifier = FormIdentifierTestFactory.create(); + + @Test + void shouldSetFormIdInQuery() { + var query = runner.buildFindByFormEngineQuery(formIdentifier); + + assertThat(query.getForm()).get().extracting("formId").isEqualTo(FormIdentifierTestFactory.FORM_ID); + } + + @Test + void shouldSetFormEngineNameInQuery() { + var query = runner.buildFindByFormEngineQuery(formIdentifier); + + assertThat(query.getForm()).get().extracting("formEngineName").isEqualTo(FormIdentifierTestFactory.FORM_ENGINE_NAME); + } } } @@ -483,8 +528,7 @@ class AggregationManagerRunnerTest { assertThat(batches).hasSize(2).usingRecursiveFieldByFieldElementComparator().containsExactly( new Batch(execution, BATCH_1_UUID, Page.builder().offset(0).limit(BATCH_SIZE).build(), VORGAENGE_1), - new Batch(execution, BATCH_2_UUID, Page.builder().offset(BATCH_SIZE).limit(BATCH_SIZE).build(), VORGAENGE_2) - ); + new Batch(execution, BATCH_2_UUID, Page.builder().offset(BATCH_SIZE).limit(BATCH_SIZE).build(), VORGAENGE_2)); } private ArgumentMatcher<Page> hasExpectedOffsetAndConfiguredLimit(int expectedOffset) {