diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java index 0bd3bd6174d9ea7f450a4c2b933cfdc16f60af6e..454b0adc0c7f1e84cf9633d8f15e453ea4ab3e44 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoader.java @@ -23,7 +23,11 @@ */ package de.ozgcloud.aggregation; +import de.ozgcloud.aggregation.transformation.AggregationMapping; + public interface AggregationDataLoader { void loadIntoTarget(Aggregation aggregation); + + AggregationMapping.Scope getScope(); } diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java index 4d7e2ff3ad1732f0466745d7d0e0c571335a9159..614e35a422db7f486d6fd53a8aaa5ed4878b063d 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistry.java @@ -23,26 +23,39 @@ */ package de.ozgcloud.aggregation; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import org.springframework.stereotype.Component; import de.ozgcloud.aggregation.transformation.AggregationMapping; import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; @Component -@RequiredArgsConstructor -class AggregationDataLoaderRegistry { +public class AggregationDataLoaderRegistry { - private final Map<String, AggregationDataLoader> loaders; + private final Map<AggregationMapping.Scope, AggregationDataLoader> loadersByScope; + + AggregationDataLoaderRegistry(List<AggregationDataLoader> loaders) { + this.loadersByScope = toLoadersByScope(loaders); + } public boolean hasLoader(AggregationMapping.Scope scope) { - return loaders.containsKey(scope.name()); + return loadersByScope.containsKey(scope); } public AggregationDataLoader getLoader(AggregationMapping.Scope scope) { - return Optional.ofNullable(loaders.get(scope.name())).orElseThrow(() -> new TechnicalException("No data loader for scope " + scope)); + return Optional.ofNullable(loadersByScope.get(scope)).orElseThrow(() -> new TechnicalException("No data loader for scope " + scope)); + } + + static Map<AggregationMapping.Scope, AggregationDataLoader> toLoadersByScope(List<AggregationDataLoader> loaders) { + try { + return loaders.stream().collect(Collectors.toMap(AggregationDataLoader::getScope, Function.identity())); + } catch (IllegalStateException e) { + throw new TechnicalException("Multiple loaders exist for single scope.", e); + } } } diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationManagerGrpcConfiguration.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationManagerGrpcConfiguration.java index eec32d5d22db5bb94650f73344808f20fc3e5931..a9b23c15a1faec0ff3b332c4fcf87ba633f67a6b 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationManagerGrpcConfiguration.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationManagerGrpcConfiguration.java @@ -23,9 +23,13 @@ */ package de.ozgcloud.aggregation; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import de.ozgcloud.aggregation.data.AggregationDataServiceGrpc; +import de.ozgcloud.aggregation.extern.AggregationDataRemoteService; +import de.ozgcloud.aggregation.extern.GrpcAggregationDataMapper; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; import de.ozgcloud.apilib.vorgang.grpc.GrpcOzgCloudVorgangService; import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangMapper; @@ -37,9 +41,12 @@ import net.devh.boot.grpc.client.inject.GrpcClientBean; @Configuration @GrpcClientBean(clazz = VorgangServiceGrpc.VorgangServiceBlockingStub.class, beanName = "vorgangServiceBlockingStub", client = @GrpcClient("vorgang-manager")) +@GrpcClientBean(clazz = AggregationDataServiceGrpc.AggregationDataServiceStub.class, beanName = "aggregationDataServiceStub", client = @GrpcClient("aggregation-manager")) public class AggregationManagerGrpcConfiguration { @GrpcClient("vorgang-manager") VorgangServiceGrpc.VorgangServiceBlockingStub vorgangServiceBlockingStub; + @GrpcClient("aggregation-manager") + AggregationDataServiceGrpc.AggregationDataServiceStub aggregationDataServiceStub; @Bean OzgCloudVorgangService grpcOzgCloudVorgangService(OzgCloudVorgangMapper vorgangMapper, @@ -49,4 +56,10 @@ public class AggregationManagerGrpcConfiguration { aggregationCallContext); } + @Bean + @ConditionalOnProperty("grpc.client.aggregation-manager.address") + AggregationDataRemoteService aggregationDataRemoteService(AggregationManagerProperties properties, + AggregationManagerConfiguration configuration, GrpcAggregationDataMapper grpcAggregationDataMapper) { + return new AggregationDataRemoteService(aggregationDataServiceStub, properties, configuration, grpcAggregationDataMapper); + } } diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationDataRemoteService.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationDataRemoteService.java index 564df2133a2df80d848b4dcab68c17182d9beea5..531a02c99d1d55da63fadade4eaa192a67895cc7 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationDataRemoteService.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationDataRemoteService.java @@ -28,9 +28,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; import java.util.stream.Stream; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - import de.ozgcloud.aggregation.Aggregation; import de.ozgcloud.aggregation.AggregationManagerConfiguration; import de.ozgcloud.aggregation.AggregationManagerProperties; @@ -46,10 +43,8 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; -@Service -@ConditionalOnProperty("grpc.client.aggregation-manager.address") @RequiredArgsConstructor -class AggregationDataRemoteService { +public class AggregationDataRemoteService { @GrpcClient("aggregation-manager") private final AggregationDataServiceGrpc.AggregationDataServiceStub serviceStub; diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java index 12a9e4d3768c6fa65f3b7a85730939754cc195cc..845c20369cdd75b4761ac8e1ea616fb0166fa883 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoader.java @@ -25,24 +25,22 @@ package de.ozgcloud.aggregation.extern; import java.util.concurrent.ExecutionException; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import de.ozgcloud.aggregation.Aggregation; import de.ozgcloud.aggregation.AggregationDataLoader; +import de.ozgcloud.aggregation.transformation.AggregationMapping; import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Component -@Qualifier(AggregationRemoteDataLoader.SCOPE) @ConditionalOnProperty("grpc.client.aggregation-manager.address") @RequiredArgsConstructor @Log4j2 public class AggregationRemoteDataLoader implements AggregationDataLoader { - static final String SCOPE = "EXTERN"; private final AggregationDataRemoteService service; @Override @@ -56,4 +54,10 @@ public class AggregationRemoteDataLoader implements AggregationDataLoader { throw new TechnicalException("Error on sending aggregation data.", e); } } + + @Override + public AggregationMapping.Scope getScope() { + return AggregationMapping.Scope.EXTERN; + } + } diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/GrpcAggregationDataMapper.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/GrpcAggregationDataMapper.java index d111d825eb64c2bdfeade31288e6223fcbc2bfb2..33bdee45a8f99724ce130f8be3a95046fe4f4e3e 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/GrpcAggregationDataMapper.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/extern/GrpcAggregationDataMapper.java @@ -30,7 +30,7 @@ import de.ozgcloud.aggregation.data.GrpcAggregationData; import de.ozgcloud.aggregation.warehouse.DocumentEntry; @Mapper -interface GrpcAggregationDataMapper { +public interface GrpcAggregationDataMapper { @Mapping(target = "eingangDatum", source = "eingangsdatum") @Mapping(target = "vorgangName", source = "vorgangsname") diff --git a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoader.java b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/warehouse/AggregationWarehouseDataLoader.java similarity index 84% rename from aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoader.java rename to aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/warehouse/AggregationWarehouseDataLoader.java index 51ead0e4fb25e567f36884adfe1d26f63af6c344..3e319bfa1e37988de0138c29cf58bfb33f53d92a 100644 --- a/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoader.java +++ b/aggregation-manager-job/src/main/java/de/ozgcloud/aggregation/warehouse/AggregationWarehouseDataLoader.java @@ -21,24 +21,22 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.aggregation; +package de.ozgcloud.aggregation.warehouse; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import de.ozgcloud.aggregation.warehouse.DocumentEntry; -import de.ozgcloud.aggregation.warehouse.WarehouseRepository; +import de.ozgcloud.aggregation.Aggregation; +import de.ozgcloud.aggregation.AggregationDataLoader; +import de.ozgcloud.aggregation.transformation.AggregationMapping; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Component -@Qualifier(AggregationWarehouseDataLoader.SCOPE) @RequiredArgsConstructor @Log4j2 public class AggregationWarehouseDataLoader implements AggregationDataLoader { - static final String SCOPE = "INTERN"; private final WarehouseRepository repository; @Override @@ -51,4 +49,9 @@ public class AggregationWarehouseDataLoader implements AggregationDataLoader { String getCollectionName(Aggregation aggregation) { return StringUtils.isNotBlank(aggregation.aggregationName()) ? aggregation.aggregationName() : DocumentEntry.COLLECTION; } + + @Override + public AggregationMapping.Scope getScope() { + return AggregationMapping.Scope.INTERN; + } } diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java index 02d5b4b8148153d830a25beb552548e9ccfa5082..92cde4b15573002348204af710305aa358bce038 100644 --- a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationDataLoaderRegistryTest.java @@ -26,30 +26,61 @@ package de.ozgcloud.aggregation; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.mockito.Mock; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.mockito.MockedStatic; import de.ozgcloud.aggregation.transformation.AggregationMapping; import de.ozgcloud.common.errorhandling.TechnicalException; +import de.ozgcloud.common.test.ReflectionTestUtils; +import lombok.Getter; +import lombok.RequiredArgsConstructor; class AggregationDataLoaderRegistryTest { - private static final String SCOPE_KEY = AggregationWarehouseDataLoader.SCOPE; private final AggregationMapping.Scope registeredScope = AggregationMapping.Scope.INTERN; private final AggregationMapping.Scope notRegisteredScope = AggregationMapping.Scope.EXTERN; - - @Mock - private AggregationDataLoader loader; + private final AggregationDataLoader loader = new TestLoader(registeredScope); private AggregationDataLoaderRegistry registry; @BeforeEach void init() { - registry = spy(new AggregationDataLoaderRegistry(Map.of(SCOPE_KEY, loader))); + registry = spy(new AggregationDataLoaderRegistry(List.of(loader))); + } + + @Nested + class TestConstructor { + + private final List<AggregationDataLoader> loaders = List.of(new TestLoader(AggregationMapping.Scope.INTERN)); + + @Test + void shouldConvertToLoadersByScope() { + try (MockedStatic<AggregationDataLoaderRegistry> mocked = mockStatic(AggregationDataLoaderRegistry.class)) { + new AggregationDataLoaderRegistry(loaders); + mocked.verify(() -> AggregationDataLoaderRegistry.toLoadersByScope(loaders)); + } + } + + @Test + @SuppressWarnings("unchecked") + void setLoadersByScope() { + var loadersByScope = Map.of(AggregationMapping.Scope.INTERN, new TestLoader(AggregationMapping.Scope.INTERN)); + try (MockedStatic<AggregationDataLoaderRegistry> mocked = mockStatic(AggregationDataLoaderRegistry.class)) { + mocked.when(() -> AggregationDataLoaderRegistry.toLoadersByScope(loaders)).thenReturn(loadersByScope); + + AggregationDataLoaderRegistry registry = new AggregationDataLoaderRegistry(loaders); + + var loadersByScopeFieldValue = ReflectionTestUtils.getField(registry, "loadersByScope", Map.class); + assertThat(loadersByScopeFieldValue).isEqualTo(loadersByScope); + } + } } @Nested @@ -85,4 +116,36 @@ class AggregationDataLoaderRegistryTest { assertThatThrownBy(() -> registry.getLoader(notRegisteredScope)).isInstanceOf(TechnicalException.class); } } + + @Nested + class TestToLoadersByScope { + + @ParameterizedTest + @EnumSource + void shouldAddLoader(AggregationMapping.Scope scope) { + var loader = new TestLoader(scope); + var loadersByScope = AggregationDataLoaderRegistry.toLoadersByScope(List.of(loader)); + + assertThat(loadersByScope).containsEntry(scope, loader); + } + + @Test + void shouldThrowExceptionIfMultipleLoadersHaveSameScope() { + var scope = AggregationMapping.Scope.EXTERN; + assertThatThrownBy(() -> AggregationDataLoaderRegistry.toLoadersByScope(List.of(new TestLoader(scope), new TestLoader(scope)))) + .isInstanceOf(TechnicalException.class); + } + } + + @RequiredArgsConstructor + static class TestLoader implements AggregationDataLoader { + + @Getter + private final AggregationMapping.Scope scope; + + @Override + public void loadIntoTarget(Aggregation aggregation) { + + } + } } diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java index 49e0b0703265f2a01c344c53e0e590ca0a1822ff..045febec72d531d2d0a355e4fa8803ad90d7a68c 100644 --- a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/AggregationRemoteDataLoaderTest.java @@ -37,7 +37,6 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.springframework.beans.factory.annotation.Qualifier; import de.ozgcloud.aggregation.Aggregation; import de.ozgcloud.aggregation.AggregationTestFactory; @@ -128,13 +127,13 @@ class AggregationRemoteDataLoaderTest { } @Nested - class TestQualifier { + class TestGetScope { @Test - void shouldBeExtern() { - var qualifierValue = AggregationRemoteDataLoader.class.getAnnotation(Qualifier.class).value(); + void shouldReturnExternScope() { + var scope = loader.getScope(); - assertThat(qualifierValue).isEqualTo(AggregationMapping.Scope.EXTERN.name()); + assertThat(scope).isEqualTo(AggregationMapping.Scope.EXTERN); } } } diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/SpringContextITCase.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/SpringContextITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..2c7e93e117a1c73174059b800f6779d275eca7de --- /dev/null +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/extern/SpringContextITCase.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.aggregation.extern; + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.TestPropertySource; + +import de.ozgcloud.aggregation.AggregationDataLoader; +import de.ozgcloud.aggregation.AggregationDataLoaderRegistry; +import de.ozgcloud.aggregation.transformation.AggregationMapping; +import de.ozgcloud.common.test.ITCase; + +class SpringContextITCase { + + @Nested + @ITCase + @TestPropertySource(properties = { "grpc.client.aggregation-manager.address=static://127.0.0.1:9090" }) + class OnAggregationManagerAddressSet { + + @Autowired + private List<AggregationDataLoader> loaders; + @Autowired + private AggregationDataLoaderRegistry registry; + + @Test + void shouldHaveOneLoader() { + assertThat(getLoadersWithScopeExtern(loaders)).singleElement().isInstanceOf(AggregationRemoteDataLoader.class); + } + + @Test + void shouldRegister() { + assertThat(registry.hasLoader(AggregationMapping.Scope.EXTERN)).isTrue(); + } + } + + @Nested + @ITCase + class OnAggregationManagerAddressNotSet { + + @Autowired + private List<AggregationDataLoader> loaders; + @Autowired + private AggregationDataLoaderRegistry registry; + + @Test + void shouldNotHaveLoader() { + assertThat(getLoadersWithScopeExtern(loaders)).isEmpty(); + } + + @Test + void shouldNotRegister() { + assertThat(registry.hasLoader(AggregationMapping.Scope.EXTERN)).isFalse(); + } + } + + private List<AggregationDataLoader> getLoadersWithScopeExtern(List<AggregationDataLoader> loaders) { + return loaders.stream() + .filter(loader -> loader.getScope() == AggregationMapping.Scope.EXTERN) + .toList(); + } +} diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoaderTest.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/warehouse/AggregationWarehouseDataLoaderTest.java similarity index 88% rename from aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoaderTest.java rename to aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/warehouse/AggregationWarehouseDataLoaderTest.java index 9cd225c7ed6cc017c204016dca415b6c52295093..ed86396f694745874bf95f0c6a6e5eee914bd1a9 100644 --- a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/AggregationWarehouseDataLoaderTest.java +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/warehouse/AggregationWarehouseDataLoaderTest.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.aggregation; +package de.ozgcloud.aggregation.warehouse; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -38,13 +38,12 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.springframework.beans.factory.annotation.Qualifier; import com.thedeanda.lorem.LoremIpsum; +import de.ozgcloud.aggregation.Aggregation; +import de.ozgcloud.aggregation.AggregationTestFactory; import de.ozgcloud.aggregation.transformation.AggregationMapping; -import de.ozgcloud.aggregation.warehouse.DocumentEntry; -import de.ozgcloud.aggregation.warehouse.WarehouseRepository; class AggregationWarehouseDataLoaderTest { @@ -111,13 +110,13 @@ class AggregationWarehouseDataLoaderTest { } @Nested - class TestQualifier { + class TestGetScope { @Test - void shouldBeIntern() { - var qualifierValue = AggregationWarehouseDataLoader.class.getAnnotation(Qualifier.class).value(); + void shouldReturnInternScope() { + var scope = loader.getScope(); - assertThat(qualifierValue).isEqualTo(AggregationMapping.Scope.INTERN.name()); + assertThat(scope).isEqualTo(AggregationMapping.Scope.INTERN); } } } diff --git a/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/warehouse/SpringContextITCase.java b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/warehouse/SpringContextITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..ed88f4f4ecc40e07028102fc11dc0815e5279c69 --- /dev/null +++ b/aggregation-manager-job/src/test/java/de/ozgcloud/aggregation/warehouse/SpringContextITCase.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.aggregation.warehouse; + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import de.ozgcloud.aggregation.AggregationDataLoader; +import de.ozgcloud.aggregation.AggregationDataLoaderRegistry; +import de.ozgcloud.aggregation.transformation.AggregationMapping; +import de.ozgcloud.common.test.ITCase; + +@ITCase +class SpringContextITCase { + + @Autowired + private List<AggregationDataLoader> loaders; + @Autowired + private AggregationDataLoaderRegistry registry; + + @Test + void shouldHaveLoader() { + assertThat(getLoadersWithScopeIntern(loaders)).singleElement().isInstanceOf(AggregationWarehouseDataLoader.class); + } + + @Test + void shouldRegister() { + assertThat(registry.hasLoader(AggregationMapping.Scope.INTERN)).isTrue(); + } + + private List<AggregationDataLoader> getLoadersWithScopeIntern(List<AggregationDataLoader> loaders) { + return loaders.stream() + .filter(loader -> loader.getScope() == AggregationMapping.Scope.INTERN) + .toList(); + } +}