diff --git a/README.md b/README.md index 175344f3b642d4c3d57b3aa0a8a0a2bfed473654..b17d52f11e874186d5afe3aa4d6474e5105b22b4 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ For further reference, please consider the following sections: * [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/) * [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.3/maven-plugin/reference/html/#build-image) -* [gRPC](https://grpc.io/) +* [Spring RestClient](https://docs.spring.io/spring-framework/reference/integration/rest-clients.html) * [Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/3.1.3/reference/htmlsingle/index.html#actuator) * [Spring Data MongoDB](https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/) * [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/3.1.3/reference/htmlsingle/index.html#using.devtools) @@ -38,4 +38,8 @@ Run it from commandline use: ./mvnw spring-boot:run -Dspring-boot.run.profiles=local -pl info-manager-server ``` -at the info-manager root directory \ No newline at end of file +at the info-manager root directory + +### Releasing + +See [Release Antragsraum](https://git.ozg-sh.de/ozgcloud-doc/dokumentation/src/branch/master/Operations/Release-Antragsraum.md) \ No newline at end of file diff --git a/info-manager-server/pom.xml b/info-manager-server/pom.xml index ed981c7ab339a7340d4fad3ac85d65316ae6e06f..dfc68cacb68dfdc891889211403b0dea7529762f 100644 --- a/info-manager-server/pom.xml +++ b/info-manager-server/pom.xml @@ -64,11 +64,6 @@ <version>${info-manager-interface.version}</version> </dependency> - <dependency> - <groupId>net.devh</groupId> - <artifactId>grpc-client-spring-boot-starter</artifactId> - </dependency> - <dependency> <groupId>net.devh</groupId> <artifactId>grpc-server-spring-boot-starter</artifactId> @@ -153,6 +148,12 @@ <version>${ozgcloud-starter.version}</version> </dependency> + <dependency> + <groupId>net.devh</groupId> + <artifactId>grpc-client-spring-boot-starter</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java b/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java index 5639bb476e207eb1073a946373e2b1a653ee330e..a32f144ac4f86d83911492ea7ade258959e83f42 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java @@ -23,27 +23,12 @@ package de.ozgcloud.info; -import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -import de.ozgcloud.info.common.CallBeanFactoryPostProcessor; -import de.ozgcloud.info.common.CallScope; @SpringBootApplication public class InfoManagerApplication { public static void main(String[] args) { SpringApplication.run(InfoManagerApplication.class, args); } - - @Bean - public CallScope callScope() { - return new CallScope(); - } - - @Bean - public static BeanFactoryPostProcessor beanFactoryPostProcessor(CallScope callScope) { - return new CallBeanFactoryPostProcessor(callScope); - } } diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/SecurityConfiguration.java b/info-manager-server/src/main/java/de/ozgcloud/info/SecurityConfiguration.java deleted file mode 100644 index 51640355fae79d4f6f6540558b2b7b6daff623df..0000000000000000000000000000000000000000 --- a/info-manager-server/src/main/java/de/ozgcloud/info/SecurityConfiguration.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info; - -import org.springframework.context.annotation.Configuration; - -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Configuration -@Log4j2 -@RequiredArgsConstructor -public class SecurityConfiguration { -} diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessor.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessor.java deleted file mode 100644 index c302d99204ce360787e65ca30ef813ceea12eac7..0000000000000000000000000000000000000000 --- a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessor.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanFactoryPostProcessor; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class CallBeanFactoryPostProcessor implements BeanFactoryPostProcessor { - private final CallScope callScope; - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - beanFactory.registerScope(CallScope.SCOPE_NAME, callScope); - } -} diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallContextAttachingInterceptor.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/CallContextAttachingInterceptor.java deleted file mode 100644 index 88c6ca7676fffc172ab4ccc11328634beb408fc5..0000000000000000000000000000000000000000 --- a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallContextAttachingInterceptor.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import io.grpc.Metadata; -import io.grpc.ServerCall; -import io.grpc.ServerCallHandler; -import io.grpc.ServerInterceptor; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import net.devh.boot.grpc.server.interceptor.GrpcGlobalServerInterceptor; - -@Log4j2 -@GrpcGlobalServerInterceptor -@RequiredArgsConstructor -public class CallContextAttachingInterceptor implements ServerInterceptor { - private final @NonNull ContextService contextService; - - @Override - public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, - ServerCallHandler<ReqT, RespT> next) { - contextService.readMetadata(headers); - - LOG.debug("Got metadata: {}", headers); - - return next.startCall(call, headers); - } -} diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallScope.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/CallScope.java deleted file mode 100644 index 7f6c474fc8f49a747382ba1891c4b854704fefb5..0000000000000000000000000000000000000000 --- a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallScope.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.springframework.beans.factory.ObjectFactory; -import org.springframework.beans.factory.config.Scope; -import org.springframework.core.NamedInheritableThreadLocal; - -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class CallScope implements Scope { - public static final String SCOPE_NAME = "call"; - - static final ThreadLocal<Map<String, Object>> scopedObjectsHolder = new NamedInheritableThreadLocal<>("Call Context"); - static final ThreadLocal<Map<String, Runnable>> destructionCallbacksHolder = new NamedInheritableThreadLocal<>( - "Call Context Destruction Callbacks"); - - public void startScope() { - LOG.debug("START Call-Scope"); - scopedObjectsHolder.set(new ConcurrentHashMap<>()); - destructionCallbacksHolder.set(new ConcurrentHashMap<>()); - } - - public void endScope() { - scopedObjectsHolder.remove(); - callAllDestructionCallbacks(); - destructionCallbacksHolder.remove(); - LOG.debug("END Call-Scope"); - } - - void callAllDestructionCallbacks() { - destructionCallbacksHolder.get().values().forEach(Runnable::run); - } - - @Override - public @NonNull Object get(@NonNull String name, @NonNull ObjectFactory<?> objectFactory) { - if (!scopedObjectsHolder.get().containsKey(name)) { - scopedObjectsHolder.get().put(name, objectFactory.getObject()); - } - - return scopedObjectsHolder.get().get(name); - } - - @Override - public Object remove(@NonNull String name) { - destructionCallbacksHolder.get().remove(name); - return scopedObjectsHolder.get().remove(name); - } - - @Override - public void registerDestructionCallback(@NonNull String name, @NonNull Runnable callback) { - destructionCallbacksHolder.get().put(name, callback); - - } - - @Override - public Object resolveContextualObject(@NonNull String key) { - return scopedObjectsHolder.get().get(key); - } - - @Override - public String getConversationId() { - return Thread.currentThread().getName(); - } -} diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/ContextService.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/ContextService.java deleted file mode 100644 index a82d1e4681a2f2fd6a3e8fe4923471341052c822..0000000000000000000000000000000000000000 --- a/info-manager-server/src/main/java/de/ozgcloud/info/common/ContextService.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import java.util.Optional; - -import org.springframework.stereotype.Service; - -import io.grpc.Metadata; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Getter -@Log4j2 -@Service -@RequiredArgsConstructor -public class ContextService { - public static final String KEY_CLIENT_NAME = "CLIENT_NAME-bin"; - public static final String KEY_REQUEST_ID = "REQUEST_ID-bin"; - public static final String KEY_AUTHENTICATION_ID = "AUTHENTICATION-bin"; - public static final String KEY_JWT_TOKEN = "JWT_TOKEN-bin"; - private RequestAttributes requestAttributes; - - void readMetadata(Metadata headers) { - var requestAttributesBuilder = RequestAttributes.builder(); - - getRequestId(headers).ifPresent(id -> requestAttributesBuilder.requestId(new String(id))); - getClientName(headers).ifPresent(name -> requestAttributesBuilder.clientName(new String(name))); - getJwtToken(headers).ifPresent(token -> requestAttributesBuilder.jwtToken(new String(token))); - getAuthentication(headers).ifPresent(saml -> requestAttributesBuilder.samlToken(new String(saml))); - - requestAttributes = requestAttributesBuilder.build(); - } - - Optional<byte[]> getRequestId(Metadata headers) { - return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_REQUEST_ID))); - } - - Optional<byte[]> getClientName(Metadata headers) { - return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_CLIENT_NAME))); - } - - Optional<byte[]> getAuthentication(Metadata headers) { - return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_AUTHENTICATION_ID))); - } - - Optional<byte[]> getJwtToken(Metadata headers) { - return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_JWT_TOKEN))); - } - - static Metadata.Key<byte[]> createKeyOf(String key) { - return Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER); - } -} diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtEvent.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/NachrichtEvent.java similarity index 94% rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtEvent.java rename to info-manager-server/src/main/java/de/ozgcloud/info/common/NachrichtEvent.java index 1db047dec0fa327768ac909b62ab550382a6528d..8bcd639d03aad5e897f790058da94bab562570a4 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtEvent.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/common/NachrichtEvent.java @@ -18,12 +18,11 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.nachricht; +package de.ozgcloud.info.common; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; -import org.bson.types.ObjectId; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.CompoundIndex; import org.springframework.data.mongodb.core.mapping.Document; @@ -39,7 +38,7 @@ import lombok.Setter; @Setter public class NachrichtEvent { @Id - private ObjectId id; + private String id; @NotBlank(message = "Postfach id is missing") @Size(max = 128, message = "Invalid PostfachId") diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InfoManagerProperties.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java similarity index 91% rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InfoManagerProperties.java rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java index 2f4e908d66ddfa32eda28a246a82c3d116d4529a..1cd0f36ff7c553b0a52ea3f3020cedb2b5617a9a 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InfoManagerProperties.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java @@ -18,7 +18,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -30,5 +30,5 @@ import lombok.Getter; @ConfigurationProperties(prefix = InfoManagerProperties.PREFIX) public class InfoManagerProperties { static final String PREFIX = "ozgcloud.infomanager"; - private String postfachIdKeyName = "postkorbhandle"; + private final String postfachIdKeyName = "postkorbhandle"; } diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationGrpcService.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationGrpcService.java similarity index 98% rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationGrpcService.java rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationGrpcService.java index 8062453cac36a9380c789602de632d129d3901e8..4b4e664a9b907bfca8a77d7a98e7653097ae03ab 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationGrpcService.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationGrpcService.java @@ -18,7 +18,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import java.util.NoSuchElementException; diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationMapper.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationMapper.java similarity index 89% rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationMapper.java rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationMapper.java index 3c3bbac80a1f7ca197b8c5b34173a95d78aa0342..dd7f3b7121cc641505e6928c0662de8991a227dc 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationMapper.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationMapper.java @@ -18,10 +18,10 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import de.ozgcloud.info.GrpcInformationNachricht; -import de.ozgcloud.info.nachricht.NachrichtEvent; +import de.ozgcloud.info.common.NachrichtEvent; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -29,7 +29,7 @@ import lombok.NoArgsConstructor; class InformationMapper { static GrpcInformationNachricht fromNachrichtEvent(NachrichtEvent nachrichtEvent) { return GrpcInformationNachricht.newBuilder() - .setId(nachrichtEvent.getId().toHexString()) + .setId(nachrichtEvent.getId()) .setPostfachId(nachrichtEvent.getPostfachId()) .setOzgCloudAddress(nachrichtEvent.getNachrichtenListUrl()) .build(); diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationRepository.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationRepository.java similarity index 85% rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationRepository.java rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationRepository.java index cc94d21fd08ff6b1d4cb5f2fdaa0c9fc6307422c..a5eb66186174be22058c6dee93e5fea12dfdbf9b 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationRepository.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationRepository.java @@ -18,11 +18,9 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +package de.ozgcloud.info.information; -package de.ozgcloud.info.infomanager; +import de.ozgcloud.info.common.NachrichtEvent; -import de.ozgcloud.info.nachricht.NachrichtEvent; -import org.bson.types.ObjectId; - -interface InformationRepository extends ReadOnlyRepository<NachrichtEvent, ObjectId> { +interface InformationRepository extends ReadOnlyRepository<NachrichtEvent, String> { } diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationService.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationService.java similarity index 86% rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationService.java rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationService.java index 02596fa99133a5e355ff7f6a80a963726e1278f3..d70e7056522110429f837d54a08e8938dd13851a 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationService.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationService.java @@ -18,14 +18,13 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import java.util.List; -import org.bson.types.ObjectId; import org.springframework.stereotype.Service; -import de.ozgcloud.info.nachricht.NachrichtEvent; +import de.ozgcloud.info.common.NachrichtEvent; import lombok.RequiredArgsConstructor; @Service @@ -34,7 +33,7 @@ class InformationService { private final InformationRepository repository; NachrichtEvent getInformationById(String id) { - return repository.findById(new ObjectId(id)).orElseThrow(); + return repository.findById(id).orElseThrow(); } List<NachrichtEvent> getInformationOfPostfach(String postfachId) { diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/ReadOnlyRepository.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/ReadOnlyRepository.java similarity index 92% rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/ReadOnlyRepository.java rename to info-manager-server/src/main/java/de/ozgcloud/info/information/ReadOnlyRepository.java index bae0f76bba23709920350be1ec0ca4ab7c32f25e..bccf8e0ba99a9284230f3832b24b0f25e737f955 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/ReadOnlyRepository.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/ReadOnlyRepository.java @@ -18,14 +18,14 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ - -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import java.util.List; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.NoRepositoryBean; @NoRepositoryBean interface ReadOnlyRepository<T, ID> extends CrudRepository<T, ID> { - List<T> findByPostfachId(String postfachId); + List<T> findByPostfachId(String postfachId); } diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenGrpcService.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java similarity index 72% rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenGrpcService.java rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java index 7c2a4108df2b9b80858a8e66e55aa4bb68e1fe26..4bae8077690e8f41248ec23576e321846cdeb574 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenGrpcService.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java @@ -20,9 +20,14 @@ package de.ozgcloud.info.nachricht; +import java.util.Set; + +import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validator; import de.ozgcloud.info.common.InvalidNachrichtenListUrlException; +import de.ozgcloud.info.common.NachrichtEvent; import io.grpc.Status; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; @@ -30,11 +35,12 @@ import net.devh.boot.grpc.server.service.GrpcService; @GrpcService @RequiredArgsConstructor -public class NachrichtenGrpcService extends NachrichtServiceGrpc.NachrichtServiceImplBase { +public class NachrichtGrpcService extends NachrichtServiceGrpc.NachrichtServiceImplBase { static final String STATUS_OK = "ok"; - private final NachrichtenService nachrichtService; - private final NachrichtenMapper nachrichtenMapper; + private final NachrichtService nachrichtService; + private final NachrichtMapper nachrichtenMapper; + private final Validator validator; @Override public void saveNewNachricht(GrpcNewNachrichtRequest request, StreamObserver<GrpcNewNachrichtReply> responseObserver) { @@ -49,7 +55,20 @@ public class NachrichtenGrpcService extends NachrichtServiceGrpc.NachrichtServic } private void saveNachricht(GrpcNewNachrichtRequest request) { - nachrichtService.save(nachrichtenMapper.fromGrpcNachricht(request.getNachricht())); + var nachricht = nachrichtenMapper.fromGrpcNachricht(request.getNachricht()); + + if (isValid(nachricht)) { + nachrichtService.save(nachricht); + } + } + + private boolean isValid(NachrichtEvent nachrichtEvent) { + Set<ConstraintViolation<NachrichtEvent>> violations = validator.validate(nachrichtEvent); + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } + + return true; } @Override diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenMapper.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java similarity index 96% rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenMapper.java rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java index c70da9a76dc62be2ecddb6e513fbd4493fc7dcca..9c818ed736440b54d1abf8ea015c18b761c87497 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenMapper.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java @@ -25,11 +25,12 @@ import org.springframework.core.env.Profiles; import org.springframework.stereotype.Component; import de.ozgcloud.info.common.InvalidNachrichtenListUrlException; +import de.ozgcloud.info.common.NachrichtEvent; import lombok.RequiredArgsConstructor; @Component @RequiredArgsConstructor -class NachrichtenMapper { +class NachrichtMapper { static final String LOCAL_PROFILE = "local"; private static final String NACHRICHTEN_LIST_URL_REGEX = "^[A-Za-z\\d-]+(\\.[A-Za-z\\d-]+){0,512}:\\d{1,5}$"; static final String NACHRICHTEN_LIST_URL_FORMAT = "dns:///%s"; diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenRepository.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtRepository.java similarity index 89% rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenRepository.java rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtRepository.java index 5a12932d3ea18f5d99f3b9aeba6c3c9733a982d1..2129f230425da31e3c34b8848de80aaffb7da647 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenRepository.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtRepository.java @@ -25,7 +25,9 @@ import java.util.Optional; import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository.MongoRepository; -interface NachrichtenRepository extends MongoRepository<NachrichtEvent, ObjectId> { +import de.ozgcloud.info.common.NachrichtEvent; + +interface NachrichtRepository extends MongoRepository<NachrichtEvent, ObjectId> { Optional<NachrichtEvent> findByPostfachIdAndNachrichtenListUrl(String postfachId, String nachrichtenListUrl); void deleteByPostfachIdAndNachrichtenListUrl(String postfachId, String nachrichtenListUrl); diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenService.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtService.java similarity index 92% rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenService.java rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtService.java index 65c47ae1b9c271c91e72bd6eb433eef6986e2203..6fbf72e3a6031e3d9cad68224a39b4adbd028a64 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenService.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtService.java @@ -22,12 +22,13 @@ package de.ozgcloud.info.nachricht; import org.springframework.stereotype.Service; +import de.ozgcloud.info.common.NachrichtEvent; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor -class NachrichtenService { - private final NachrichtenRepository repository; +class NachrichtService { + private final NachrichtRepository repository; void save(NachrichtEvent nachrichtEvent) { if (!nachrichtEventPresent(nachrichtEvent)) { diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java index 89e87d9fe8bf6b472da6c4db389be8c4d5182396..bece6d4ca6823e7e9fc882c82e6451ee81e13f00 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java @@ -22,33 +22,11 @@ */ package de.ozgcloud.info; -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; - -import de.ozgcloud.info.common.CallScope; -@ExtendWith(MockitoExtension.class) class InfoManagerApplicationTest { @Spy @InjectMocks private InfoManagerApplication application; - - @Test - void shouldCreateCallScope() { - var callScope = application.callScope(); - - assertThat(callScope).isNotNull(); - } - - @Test - void shouldCreateBeanFactoryPostProcessor() { - var beanProcessor = InfoManagerApplication.beanFactoryPostProcessor(new CallScope()); - - assertThat(beanProcessor).isNotNull(); - } } \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java b/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java index a8d644cb02b3a682f51eeb4bf03aa6b6ec159063..e263d684a09aa7448b811b99e27b239214052c86 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java @@ -22,13 +22,14 @@ package de.ozgcloud.info; import org.bson.types.ObjectId; +import de.ozgcloud.info.common.NachrichtEvent; import de.ozgcloud.info.nachricht.GrpcFinishedNachrichtRequest; import de.ozgcloud.info.nachricht.GrpcNachricht; import de.ozgcloud.info.nachricht.GrpcNewNachrichtRequest; -import de.ozgcloud.info.nachricht.NachrichtEvent; public class NachrichtEventTestFactory { public static final ObjectId ID = new ObjectId(); + public static final String ID_STRING = new ObjectId().toHexString(); public static final ObjectId EMPTY_ID = new ObjectId(); public static final String POSTKORB_HANDLE = UserTestFactory.POSTKORB_HANDLE; public static final String EMPTY_POSTFACH_HANDLE = "73228744-a28a-4485-845b-d8cc02422760"; @@ -40,7 +41,7 @@ public class NachrichtEventTestFactory { public static NachrichtEvent.NachrichtEventBuilder createNachrichtEventBuilder() { return NachrichtEvent.builder() - .id(ID) + .id(ID_STRING) .postfachId(POSTKORB_HANDLE) .nachrichtenListUrl(URL); } diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessorTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessorTest.java deleted file mode 100644 index 48b4390eb3ca4842857514494b11d62e671a6ae5..0000000000000000000000000000000000000000 --- a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessorTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; - -@ExtendWith(MockitoExtension.class) -class CallBeanFactoryPostProcessorTest { - @Spy - private ConfigurableListableBeanFactory configurableListableBeanFactory; - - @Test - void shouldRegisterPostProcessBeanFactory() { - var processor = new CallBeanFactoryPostProcessor(new CallScope()); - - processor.postProcessBeanFactory(configurableListableBeanFactory); - - verify(configurableListableBeanFactory).registerScope(eq(CallScope.SCOPE_NAME), any(CallScope.class)); - } -} \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallContextAttachingInterceptorTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/CallContextAttachingInterceptorTest.java deleted file mode 100644 index 68aac26e25f858d8017dd703a6df4c28ba55d4b6..0000000000000000000000000000000000000000 --- a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallContextAttachingInterceptorTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import io.grpc.Metadata; -import io.grpc.ServerCallHandler; - -@ExtendWith(MockitoExtension.class) -class CallContextAttachingInterceptorTest { - @InjectMocks - private CallContextAttachingInterceptor interceptor; - @Mock - private ContextService contextService; - - @Mock - ServerCallHandler<?, ?> handler; - - @Test - void shouldInterceptCall() { - interceptor.interceptCall(null, MetadataTestFactory.create(), handler); - - verify(handler).startCall(any(), any()); - } - - @Test - void shouldFillContextService() { - interceptor.interceptCall(null, MetadataTestFactory.create(), handler); - - verify(contextService).readMetadata(any(Metadata.class)); - } -} \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallScopeTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/CallScopeTest.java deleted file mode 100644 index 3748b3b187f7cb57f7499cec3423ef0ee00e3e3f..0000000000000000000000000000000000000000 --- a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallScopeTest.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.ObjectFactory; - -@ExtendWith(MockitoExtension.class) -class CallScopeTest { - private static final String TEST = "Test"; - private static final String TEST_NEW = "TestNew"; - - @Spy - @InjectMocks - private CallScope callScope; - - @Nested - class TestFreshCallScope { - @Test - void shouldStartScope() { - callScope.startScope(); - - assertThat(CallScope.scopedObjectsHolder).isNotNull(); - assertThat(CallScope.destructionCallbacksHolder).isNotNull(); - } - - @Test - void shouldEndScope() { - callScope.endScope(); - - verify(callScope).callAllDestructionCallbacks(); - } - - @Test - void getConversationId() { - var id = callScope.getConversationId(); - - assertThat(id).isEqualTo(Thread.currentThread().getName()); - } - } - - @Nested - class TestCallScope { - @Mock - private ObjectFactory<Object> objectFactory; - - @BeforeEach - void setupEmptyCallScope() { - callScope.startScope(); - CallScope.scopedObjectsHolder.get().put(TEST, objectFactory); - } - - @Test - void shouldGetAdded() { - var newObjectFactory = mock(ObjectFactory.class); - var object = new Object(); - when(newObjectFactory.getObject()).thenReturn(object); - - var recievedObject = callScope.get(TEST_NEW, newObjectFactory); - - assertThat(recievedObject).isNotNull().isEqualTo(object); - } - - @Test - void shouldGetNullName() { - var newObjectFactory = mock(ObjectFactory.class); - - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.get(null, newObjectFactory)); - } - - @Test - void shouldGetNullFactory() { - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.get(TEST, null)); - } - - @Test - void shouldGetExisting() { - var recievedObject = callScope.get(TEST, mock(ObjectFactory.class)); - - assertThat(recievedObject).isNotNull().isEqualTo(objectFactory); - } - - @Test - void remove() { - var res = callScope.remove(TEST); - - assertThat(res).isNotNull().isEqualTo(objectFactory); - } - - @Test - void removeNull() { - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.remove(null)); - } - - @Test - void registerDestructionCallback() { - var callBack = mock(Runnable.class); - - callScope.registerDestructionCallback(TEST, callBack); - - assertThat(CallScope.destructionCallbacksHolder.get()).containsEntry(TEST, callBack); - } - - @Test - void registerDestructionCallbackNullName() { - var callBack = mock(Runnable.class); - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.registerDestructionCallback(null, callBack)); - } - - @Test - void registerDestructionCallbackNullCallback() { - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.registerDestructionCallback(TEST, null)); - } - - @Test - void resolveContextualObject() { - var contextualObject = callScope.resolveContextualObject(TEST); - - assertThat(contextualObject).isEqualTo(objectFactory); - } - - @Test - void resolveContextualObjectNullName() { - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.resolveContextualObject(null)); - } - } -} \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/ContextServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/ContextServiceTest.java deleted file mode 100644 index f66260e93a10e17acba5acf459ffe2611bfe3f68..0000000000000000000000000000000000000000 --- a/info-manager-server/src/test/java/de/ozgcloud/info/common/ContextServiceTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import static de.ozgcloud.info.common.MetadataTestFactory.*; -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; - -@ExtendWith(MockitoExtension.class) -class ContextServiceTest { - @Spy - @InjectMocks - private ContextService contextService; - - @Nested - class TestCallContext { - @BeforeEach - void init() { - contextService.readMetadata(MetadataTestFactory.create()); - } - - @Test - void shouldGetRequestId() { - var requestId = contextService.getRequestId(MetadataTestFactory.create()); - - assertThat(requestId).isPresent().hasValue(REQUEST_ID_BYTES); - } - - @Test - void shouldGetClientName() { - var clientName = contextService.getClientName(MetadataTestFactory.create()); - - assertThat(clientName).isPresent().hasValue(CLIENT_NAME_BYTES); - } - - @Test - void shouldGetAuthentication() { - var clientName = contextService.getAuthentication(MetadataTestFactory.create()); - - assertThat(clientName).isPresent().hasValue(SAML_TOKEN_BYTES); - } - - @Test - void shouldReadRequestAttributesRequestId() { - assertThat(contextService.getRequestAttributes().getRequestId()).isEqualTo(new String(REQUEST_ID_BYTES)); - } - - @Test - void shouldReadRequestAttributesClientName() { - assertThat(contextService.getRequestAttributes().getClientName()).isEqualTo(new String(CLIENT_NAME_BYTES)); - } - - @Test - void shouldReadRequestAttributesAuth() { - assertThat(contextService.getRequestAttributes().getSamlToken()).isEqualTo(new String(SAML_TOKEN_BYTES)); - } - } - - @Nested - class TestEmptyCallContext { - @BeforeEach - void init() { - contextService.readMetadata(MetadataTestFactory.createEmpty()); - } - - @Test - void shouldReadRequestAttributesRequestId() { - assertThat(contextService.getRequestAttributes().getRequestId()).isNotEmpty(); - } - - @Test - void shouldReadRequestAttributesClientName() { - assertThat(contextService.getRequestAttributes().getClientName()).isNull(); - } - - @Test - void shouldReadRequestAttributesSamlToken() { - assertThat(contextService.getRequestAttributes().getSamlToken()).isNull(); - } - } -} \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/MetadataTestFactory.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/MetadataTestFactory.java deleted file mode 100644 index a4dd8873f43c9649f623e8435aa6801e59634213..0000000000000000000000000000000000000000 --- a/info-manager-server/src/test/java/de/ozgcloud/info/common/MetadataTestFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.common; - -import static de.ozgcloud.info.common.ContextService.*; - -import java.util.UUID; - -import io.grpc.Metadata; - -public class MetadataTestFactory { - public static byte[] CLIENT_NAME_BYTES = "ANTRAGSRAUM".getBytes(); - public static byte[] REQUEST_ID_BYTES = UUID.randomUUID().toString().getBytes(); - public static byte[] SAML_TOKEN_BYTES = UUID.randomUUID().toString().getBytes(); - - public static Metadata create() { - var metadata = new Metadata(); - metadata.put(createKeyOf(KEY_CLIENT_NAME), CLIENT_NAME_BYTES); - metadata.put(createKeyOf(KEY_REQUEST_ID), REQUEST_ID_BYTES); - metadata.put(createKeyOf(KEY_AUTHENTICATION_ID), SAML_TOKEN_BYTES); - - return metadata; - } - - public static Metadata createEmpty() { - return new Metadata(); - } - - public static Metadata.Key<byte[]> createKeyOf(String key) { - return Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER); - } -} diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithEventsConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithEventsConfiguration.java deleted file mode 100644 index 033e3f7bc831a81bf1db46bf61b7ca60a3f5a159..0000000000000000000000000000000000000000 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithEventsConfiguration.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.infomanager; - -import java.util.UUID; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.util.ReflectionTestUtils; - -import de.ozgcloud.info.common.ContextService; -import de.ozgcloud.info.common.RequestAttributes; - -@Configuration -public class UserWithEventsConfiguration { - RequestAttributes requestAttributes() { - return RequestAttributes.builder() - .clientName("Antragsraum") - .requestId(UUID.randomUUID().toString()).build(); - } - - @Bean - ContextService contextService() { - var contextService = new ContextService(); - ReflectionTestUtils.setField(contextService, "requestAttributes", requestAttributes()); - return contextService; - } -} diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithOutEventsConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithOutEventsConfiguration.java deleted file mode 100644 index 421e007c2120d312dc584a8964fbcce306fecc63..0000000000000000000000000000000000000000 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithOutEventsConfiguration.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2023-2024. - * 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.info.infomanager; - -import java.util.UUID; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.util.ReflectionTestUtils; - -import de.ozgcloud.info.common.ContextService; -import de.ozgcloud.info.common.RequestAttributes; - -@Configuration -public class UserWithOutEventsConfiguration { - RequestAttributes requestAttributes() { - return RequestAttributes.builder() - .clientName("Antragsraum") - .requestId(UUID.randomUUID().toString()).build(); - } - - @Bean - ContextService contextService() { - var contextService = new ContextService(); - ReflectionTestUtils.setField(contextService, "requestAttributes", requestAttributes()); - return contextService; - } -} diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceNoEventsITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceNoEventsITCase.java similarity index 91% rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceNoEventsITCase.java rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceNoEventsITCase.java index 1324f1adce7b6c1d862303ade68466b060db40f2..2074a34b5db687cec93618b33d62a00d2ed2e434 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceNoEventsITCase.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceNoEventsITCase.java @@ -18,7 +18,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import static org.assertj.core.api.Assertions.*; @@ -32,7 +32,6 @@ import de.ozgcloud.info.GrpcInformationByIdRequest; import de.ozgcloud.info.GrpcInformationRequest; import de.ozgcloud.info.InformationServiceGrpc; import de.ozgcloud.info.NachrichtEventTestFactory; -import de.ozgcloud.info.SecurityConfiguration; import io.grpc.StatusRuntimeException; import net.devh.boot.grpc.client.inject.GrpcClient; @@ -41,8 +40,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient; "grpc.server.port=-1", "grpc.client.inProcess.address=in-process:test" }) -@SpringJUnitConfig(classes = { UserWithOutEventsConfiguration.class, InformationGrpcTestConfiguration.class, - SecurityConfiguration.class }) +@SpringJUnitConfig(classes = { InformationGrpcTestConfiguration.class }) @DirtiesContext class InformationGrpcServiceNoEventsITCase { @GrpcClient("inProcess") diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceTest.java similarity index 97% rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceTest.java rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceTest.java index 3f5ac156d2ad546aded509c018590460c3933c30..5d1414434fabb57803148149a44baabf31c74c41 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceTest.java @@ -18,7 +18,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -43,7 +43,7 @@ import de.ozgcloud.info.GrpcInformationNachricht; import de.ozgcloud.info.GrpcInformationRequest; import de.ozgcloud.info.GrpcInformationResponse; import de.ozgcloud.info.NachrichtEventTestFactory; -import de.ozgcloud.info.nachricht.NachrichtEvent; +import de.ozgcloud.info.common.NachrichtEvent; import io.grpc.stub.StreamObserver; @ExtendWith(MockitoExtension.class) @@ -98,7 +98,7 @@ class InformationGrpcServiceTest { assertThat(response.getNachrichtenList()).hasSize(2); - var information = response.getNachrichtenList().get(0); + var information = response.getNachrichtenList().getFirst(); assertThat(information.getPostfachId()).isEqualTo(firstNachrichtEvent.getPostfachId()); assertThat(information.getOzgCloudAddress()).isEqualTo(firstNachrichtEvent.getNachrichtenListUrl()); @@ -171,7 +171,7 @@ class InformationGrpcServiceTest { var nachricht = response.getNachricht(); assertThat(nachricht).isInstanceOf(GrpcInformationNachricht.class); - assertThat(nachricht.getId()).isEqualTo(nachrichtEvent.getId().toHexString()); + assertThat(nachricht.getId()).isEqualTo(nachrichtEvent.getId()); assertThat(nachricht.getPostfachId()).isEqualTo(nachrichtEvent.getPostfachId()); assertThat(nachricht.getOzgCloudAddress()).isEqualTo(nachrichtEvent.getNachrichtenListUrl()); } diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceWithEventsITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceWithEventsITCase.java similarity index 88% rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceWithEventsITCase.java rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceWithEventsITCase.java index 5ff98ee4a256e663f2dd3e4195bf1c3ae55eaa41..5aae56c0dceea803939210148344e1fa49de2a80 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceWithEventsITCase.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceWithEventsITCase.java @@ -18,7 +18,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import static org.assertj.core.api.Assertions.*; @@ -33,7 +33,6 @@ import de.ozgcloud.info.GrpcInformationNachricht; import de.ozgcloud.info.GrpcInformationRequest; import de.ozgcloud.info.InformationServiceGrpc; import de.ozgcloud.info.NachrichtEventTestFactory; -import de.ozgcloud.info.SecurityConfiguration; import net.devh.boot.grpc.client.inject.GrpcClient; @SpringBootTest(properties = { @@ -41,8 +40,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient; "grpc.server.port=-1", "grpc.client.inProcess.address=in-process:test" }) -@SpringJUnitConfig(classes = { UserWithEventsConfiguration.class, InformationGrpcTestConfiguration.class, - SecurityConfiguration.class }) +@SpringJUnitConfig(classes = { InformationGrpcTestConfiguration.class }) @DirtiesContext class InformationGrpcServiceWithEventsITCase { @GrpcClient("inProcess") @@ -57,7 +55,7 @@ class InformationGrpcServiceWithEventsITCase { var values = response.getNachrichtenList(); assertThat(values).hasSize(1); - assertThat(values.get(0).getPostfachId()).isEqualTo(NachrichtEventTestFactory.POSTKORB_HANDLE); + assertThat(values.getFirst().getPostfachId()).isEqualTo(NachrichtEventTestFactory.POSTKORB_HANDLE); } } diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcTestConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcTestConfiguration.java similarity index 93% rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcTestConfiguration.java rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcTestConfiguration.java index 78ce24d319c6d70accdddf176daeab53d4d10904..55f1ce95b945a68b13098d59c6f11f51b3faf596 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcTestConfiguration.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcTestConfiguration.java @@ -18,20 +18,18 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import static org.mockito.Mockito.*; import java.util.List; import java.util.NoSuchElementException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import de.ozgcloud.info.NachrichtEventTestFactory; -import de.ozgcloud.info.common.ContextService; import lombok.extern.log4j.Log4j2; import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration; import net.devh.boot.grpc.client.autoconfigure.GrpcClientTraceAutoConfiguration; @@ -50,8 +48,6 @@ import net.devh.boot.grpc.server.autoconfigure.GrpcServerSecurityAutoConfigurati GrpcClientAutoConfiguration.class, GrpcClientTraceAutoConfiguration.class }) public class InformationGrpcTestConfiguration { - @Autowired - ContextService contextService; @Bean InformationService informationService() { diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationMapperTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationMapperTest.java similarity index 93% rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationMapperTest.java rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationMapperTest.java index a7ca16d8f16427111c2b4de48fde7d40e7101619..a723973e555c8963f8e627da504f3dad2fa48714 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationMapperTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationMapperTest.java @@ -18,7 +18,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import static org.assertj.core.api.Assertions.*; @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import de.ozgcloud.info.NachrichtEventTestFactory; -import de.ozgcloud.info.nachricht.NachrichtEvent; +import de.ozgcloud.info.common.NachrichtEvent; class InformationMapperTest { @Nested @@ -37,7 +37,7 @@ class InformationMapperTest { void shouldHaveId() { var grpcInformationNachricht = InformationMapper.fromNachrichtEvent(nachrichtEvent); - assertThat(grpcInformationNachricht.getId()).isEqualTo(NachrichtEventTestFactory.ID.toHexString()); + assertThat(grpcInformationNachricht.getId()).isEqualTo(NachrichtEventTestFactory.ID_STRING); } @Test diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationRepositoryITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationRepositoryITCase.java similarity index 98% rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationRepositoryITCase.java rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationRepositoryITCase.java index 5aa77484a7c5838d5f0e90201ad9337e1c81b0aa..dbd3b39e5ffcefd51663358b5ec6ed4ffe9bd1f8 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationRepositoryITCase.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationRepositoryITCase.java @@ -18,7 +18,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import static org.assertj.core.api.Assertions.*; diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationServiceTest.java similarity index 89% rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationServiceTest.java rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationServiceTest.java index 7c645107fbf7c6149ab3337830c7b81c4e5480b9..b3f720510eae7f334aa8b9bd460856c984c085dd 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationServiceTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationServiceTest.java @@ -21,7 +21,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.info.infomanager; +package de.ozgcloud.info.information; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -39,7 +39,7 @@ import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import de.ozgcloud.info.NachrichtEventTestFactory; -import de.ozgcloud.info.nachricht.NachrichtEvent; +import de.ozgcloud.info.common.NachrichtEvent; @ExtendWith(MockitoExtension.class) class InformationServiceTest { @@ -56,12 +56,12 @@ class InformationServiceTest { @BeforeEach void init() { - when(repository.findById(NachrichtEventTestFactory.ID)).thenReturn(Optional.of(nachrichtEvent)); + when(repository.findById(NachrichtEventTestFactory.ID_STRING)).thenReturn(Optional.of(nachrichtEvent)); } @Test void shouldReturnInformation() { - var information = service.getInformationById(NachrichtEventTestFactory.ID.toHexString()); + var information = service.getInformationById(NachrichtEventTestFactory.ID_STRING); assertThat(information).isEqualTo(nachrichtEvent); } @@ -81,7 +81,7 @@ class InformationServiceTest { var information = service.getInformationOfPostfach(NachrichtEventTestFactory.POSTKORB_HANDLE); assertThat(information).hasSize(1); - assertThat(information.get(0)).isEqualTo(nachrichtEvent); + assertThat(information.getFirst()).isEqualTo(nachrichtEvent); } } } diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java index f255947684af1e34fcaf89ab4451e96332d68bf2..03a58213faef6c7bdee5d8cfc73a046ffedeaafa 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java @@ -20,7 +20,7 @@ package de.ozgcloud.info.nachricht; -import static de.ozgcloud.info.nachricht.NachrichtenGrpcService.*; +import static de.ozgcloud.info.nachricht.NachrichtGrpcService.*; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Nested; @@ -30,7 +30,7 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import de.ozgcloud.info.NachrichtEventTestFactory; -import de.ozgcloud.info.SecurityConfiguration; +import io.grpc.StatusRuntimeException; import net.devh.boot.grpc.client.inject.GrpcClient; @SpringBootTest(properties = { @@ -38,7 +38,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient; "grpc.server.port=-1", "grpc.client.inProcess.address=in-process:test" }) -@SpringJUnitConfig(classes = { NachrichtenGrpcTestConfiguration.class, SecurityConfiguration.class }) +@SpringJUnitConfig(classes = { NachrichtenGrpcTestConfiguration.class }) @DirtiesContext class NachrichtenGrpcServiceITCase { @@ -55,6 +55,15 @@ class NachrichtenGrpcServiceITCase { assertThat(response.getStatus()).isEqualTo(STATUS_OK); } + + @Test + @DirtiesContext + void shouldNotSaveInvalidNewNachricht() { + var nachricht = GrpcNachricht.newBuilder().setNachrichtenListUrl("lala").build(); + var request = NachrichtEventTestFactory.createNewNachrichtRequest().toBuilder().setNachricht(nachricht).build(); + + assertThatExceptionOfType(StatusRuntimeException.class).isThrownBy(() -> service.saveNewNachricht(request)); + } } @Nested diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java index 03ab5bfcfda7cbaa66f3fc875c0fdf3bcec4660b..223e74bba19796799218cdf4ea40c69a1c5a3a17 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java @@ -23,7 +23,10 @@ package de.ozgcloud.info.nachricht; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import java.util.Set; + import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -38,19 +41,23 @@ import org.mockito.junit.jupiter.MockitoExtension; import de.ozgcloud.info.NachrichtEventTestFactory; import de.ozgcloud.info.common.InvalidNachrichtenListUrlException; +import de.ozgcloud.info.common.NachrichtEvent; import io.grpc.stub.StreamObserver; @ExtendWith(MockitoExtension.class) class NachrichtenGrpcServiceTest { @Spy @InjectMocks - private NachrichtenGrpcService nachrichtenGrpcService; + private NachrichtGrpcService nachrichtenGrpcService; + + @Mock + private NachrichtService nachrichtenService; @Mock - private NachrichtenService nachrichtenService; + private NachrichtMapper nachrichtenMapper; @Mock - private NachrichtenMapper nachrichtenMapper; + private Validator validator; @Captor private ArgumentCaptor<NachrichtEvent> nachrichtArgumentCaptor; @@ -66,6 +73,8 @@ class NachrichtenGrpcServiceTest { void init() { when(nachrichtenMapper.fromGrpcNachricht(newNachrichtRequest.getNachricht())).thenReturn( NachrichtEventTestFactory.createNachrichtEventBuilder().id(null).build()); + + when(validator.validate(any(NachrichtEvent.class))).thenReturn(Set.of()); } @Test diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java index 34ec18cca069e83168bf1995a369ddd9c51fbc17..1585b165118a2753a910b4e30404a8bf61b0f6d9 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java @@ -24,9 +24,13 @@ package de.ozgcloud.info.nachricht; import static org.mockito.Mockito.*; +import jakarta.validation.Validator; + import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration; import net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration; @@ -39,22 +43,27 @@ import net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguratio GrpcClientAutoConfiguration.class }) class NachrichtenGrpcTestConfiguration { @Bean - NachrichtenService nachrichtenService() { - return mock(NachrichtenService.class); + NachrichtService nachrichtenService() { + return new NachrichtService(nachrichtenRepository()); + } + + @Bean + Validator validator() { + return new LocalValidatorFactoryBean(); } @Bean - NachrichtenRepository nachrichtenRepository() { - return mock(NachrichtenRepository.class); + NachrichtRepository nachrichtenRepository() { + return mock(NachrichtRepository.class); } @Bean - NachrichtenMapper nachrichtenMapper() { - return mock(NachrichtenMapper.class); + NachrichtMapper nachrichtenMapper() { + return new NachrichtMapper(mock(Environment.class)); } @Bean - NachrichtenGrpcService nachrichtenGrpcService() { - return new NachrichtenGrpcService(nachrichtenService(), nachrichtenMapper()); + NachrichtGrpcService nachrichtenGrpcService() { + return new NachrichtGrpcService(nachrichtenService(), nachrichtenMapper(), validator()); } } diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java index 2ec9d34070626abb6b98cf166cedada52b9c658c..958b0233da5868c6224ee81741fa915e463fa388 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java @@ -20,7 +20,7 @@ package de.ozgcloud.info.nachricht; -import static de.ozgcloud.info.nachricht.NachrichtenMapper.*; +import static de.ozgcloud.info.nachricht.NachrichtMapper.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -44,7 +44,7 @@ import de.ozgcloud.info.common.InvalidNachrichtenListUrlException; class NachrichtenMapperTest { @Spy @InjectMocks - private NachrichtenMapper nachrichtenMapper; + private NachrichtMapper nachrichtenMapper; @Mock private Environment environment; diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java index 9b0ac2b75a08b924155ef61436e21f12f65348df..62746e8d467749bf395f0eb7c37e3b0c6e0be817 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java @@ -26,6 +26,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.dao.DuplicateKeyException; import org.springframework.test.context.ContextConfiguration; @@ -33,13 +34,15 @@ import org.testcontainers.junit.jupiter.Testcontainers; import de.ozgcloud.info.MongoDBTestContainerConfig; import de.ozgcloud.info.NachrichtEventTestFactory; +import de.ozgcloud.info.common.NachrichtEvent; @DataMongoTest @Testcontainers @ContextConfiguration(classes = MongoDBTestContainerConfig.class) public class NachrichtenRepositoryITCase { + @Qualifier("nachrichtRepository") @Autowired - private NachrichtenRepository repository; + private NachrichtRepository repository; @Nested class TestNewNachrichtEvent { diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java index ea8c1fd9944c6f4efec4f7da6ea4d9b51c484766..38d8a14bf966ac47d9b055a74008a84c99d54eec 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java @@ -38,15 +38,16 @@ import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import de.ozgcloud.info.NachrichtEventTestFactory; +import de.ozgcloud.info.common.NachrichtEvent; @ExtendWith(MockitoExtension.class) class NachrichtenServiceTest { @Spy @InjectMocks - private NachrichtenService service; + private NachrichtService service; @Mock - private NachrichtenRepository repository; + private NachrichtRepository repository; @Nested class TestAddingNewNachrichtEvent { diff --git a/info-manager-server/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/info-manager-server/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension new file mode 100644 index 0000000000000000000000000000000000000000..79b126e6cdb86bec1f4f08c205de8961bde1934a --- /dev/null +++ b/info-manager-server/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -0,0 +1 @@ +org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/info-manager-server/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/info-manager-server/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 0000000000000000000000000000000000000000..ca6ee9cea8ec189a088d50559325d4e84ff8ad09 --- /dev/null +++ b/info-manager-server/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline \ No newline at end of file diff --git a/release-erstellen.sh b/release-erstellen.sh index 8fac40d077b65c2121f36466823ff4c6da0ea934..6275997f509a88a813fdd95d1c1c5309b856f302 100644 --- a/release-erstellen.sh +++ b/release-erstellen.sh @@ -1,4 +1,22 @@ -VERSION=1.2.0 +#!/bin/sh + +if [ "$#" -ne 1 ]; then + echo "Aufruf: release-erstellen.sh JA" + echo "Als Parameter bitte 'JA' eintragen zur Sicherheit" + exit 1 +fi + + +## alle -SNAPSHOT in pom.xmls entfernen +SED_PARAMS="-i" +if [[ "$OSTYPE" =~ ^darwin ]]; then + SED_PARAMS="$SED_PARAMS '' -e" +fi +find . -name pom.xml -exec sed $SED_PARAMS 's/-SNAPSHOT//g' {} + + +## release version auslesen +NEWVERSION=$(xmlstarlet sel -N w="http://maven.apache.org/POM/4.0.0" -t -v '//w:project/w:version' -n pom.xml) + git checkout dev git pull git checkout release @@ -6,12 +24,24 @@ git pull git merge dev # Die Version von `"X.X.X-SNAPSHOT"` auf `"X.X.X"` ändern -find . -name pom.xml | xargs perl -i -p -e"s/${VERSION}-SNAPSHOT/$VERSION/g" +find . -name pom.xml | xargs perl -i -p -e"s/${NEWVERSION}-SNAPSHOT/$NEWVERSION/g" -git commit -am "release version $VERSION" -git push -git tag $VERSION -git push origin $VERSION +echo +echo "NEXT STEPS:" +echo "***********" +echo "Änderungen prüfen" +echo "git commit -a -m 'release version "$NEWVERSION"'" +echo "git push" +echo "git tag "$NEWVERSION +echo "git push --tags" +echo "git checkout dev" +echo "git merge release" -git checkout dev -git merge release +# to do by script +#git commit -am "release version $NEWVERSION" +#git push +#git tag $VERSION +#git push origin $VERSION + +#git checkout dev +#git merge release diff --git a/release-startdev.sh b/release-startdev.sh index be21f7450f4afb0fac3f714bce266a6615c6bb1e..0a0973080e5b088b1706a15f38ca2e9d1b6b2a1d 100644 --- a/release-startdev.sh +++ b/release-startdev.sh @@ -1,6 +1,52 @@ -NEXTVERSION=X.X+1.X -# Die Version im dev branch von `"X.X.X"` auf `"X.X+1.X-SNAPSHOT"` ändern -find . -name pom.xml | xargs perl -i -p -e"s/$VERSION/${NEXTVERSION}-SNAPSHOT/g" +#!/bin/bash -git commit -am "start development $NEXTVERSION" -git push +#set -x + +if [ "$#" -ne 1 ]; then + echo "Aufruf: release-startdev.sh NEWVERSION" + exit 1 +fi + +NEWVERSION=$1 + +echo + +# pom.xml:main -> project.version setzen +# projectname/pom.xml:parent -> project.parent.version setzen +# projectname/pom.xml:parent,main -> project.parent.version und project.version setzen +# +PROJECTS="pom.xml:main + server/pom.xml:main + " + +for PROJECT in $PROJECTS; +do + POMFILE=$(echo $PROJECT | cut -d':' -f1) + ACTIONS=$(echo $PROJECT | cut -d':' -f2) + + ## Auf SNAPSHOT Versionen testen + if fgrep -q "SNAPSHOT" $POMFILE; then + RED='\033[0;31m' + NC='\033[0m' + echo "${RED}ERROR: Datei "$POMFILE" enthält noch SNAPSHOT Versionen, das sollte hier nicht passieren.${NC}" + exit 1 + fi +echo $ACTIONS + ## Versionen setzen + if [[ $ACTIONS == "main" ]] ; then + xmlstarlet ed --pf -L -N w="http://maven.apache.org/POM/4.0.0" -u '//w:project/w:version' -v $NEWVERSION $POMFILE + fi + + if [[ $ACTIONS == "parent" ]]; then + xmlstarlet ed --pf -L -N w="http://maven.apache.org/POM/4.0.0" -u '//w:project/w:parent/w:version' -v $NEWVERSION $POMFILE + fi +done + + + +echo +echo "NEXT STEPS:" +echo "***********" +echo "Änderungen prüfen" +echo "git commit -a -m 'start development "$NEWVERSION"'" +echo "git push"