diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 5f5e43c0d1204185e1f1473897ea2e7d76babb0e..07ca67426a2042ed3f702a4c3ef65e621c984e13 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -15,7 +15,7 @@ <version>1.10.0-SNAPSHOT</version> <properties> - <vorgang-manager.version>2.5.0</vorgang-manager.version> + <vorgang-manager.version>2.6.0-SNAPSHOT</vorgang-manager.version> <api-lib.version>0.7.0-SNAPSHOT</api-lib.version> </properties> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java index fb1cce79ca8b440566661cede1b0ff50cc4036d8..84d0d11a5d44d852abf7d4e2ea7c027a8cc946be 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java @@ -17,7 +17,7 @@ class BescheidGrpcService extends BescheidServiceImplBase { @Override public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) { - var response = attachedItemService.getBescheidItem(request.getVorgangId()) + var response = attachedItemService.findBescheidItem(request.getVorgangId()) .map(this::buildResponse) .orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance); diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java new file mode 100644 index 0000000000000000000000000000000000000000..f2ba902117c7b2b566957955d9c0a1591cbc5e0f --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 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.bescheid.attacheditem; + +import java.util.Map; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class AttachedItem { + + public static final String PROPERTY_ID = "id"; + public static final String PROPERTY_CLIENT = "client"; + public static final String PROPERTY_VORGANG_ID = "vorgangId"; + public static final String PROPERTY_ITEM_NAME = "itemName"; + public static final String PROPERTY_VERSION = "version"; + public static final String PROPERTY_ITEM = "item"; + + private String id; + @Builder.Default + private long version = 0L; + + private String client; + private String vorgangId; + private String itemName; + + private Map<String, Object> item; + +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..c2b373a33138cc4df45ea98c5f516921713f4863 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 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.bescheid.attacheditem; + +import org.mapstruct.Mapper; + +import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; +import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; + +@Mapper(uses = { GrpcObjectMapper.class}) +interface AttachedItemMapper { + + AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item); + +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java index 5362b2a489b9616f9ecb606446ea1f713e9ecb7e..53e246ff9d1e9d293badd27fdca83e97771977ae 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java @@ -48,7 +48,6 @@ import lombok.extern.log4j.Log4j2; public class AttachedItemService { static final String BESCHEID_ITEM_NAME = "Bescheid"; - static final String BESCHEID_DRAFT_STATUS = "DRAFT"; static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM"; static final String DELETE_ATTACHED_ITEM = "DELETE_ATTACHED_ITEM"; @@ -59,10 +58,14 @@ public class AttachedItemService { private final VorgangAttachedItemRemoteService remoteService; private final CommandMapper commandMapper; - public Optional<BescheidItem> getBescheidItem(String vorgangId) { + public Optional<BescheidItem> findBescheidItem(String vorgangId) { return remoteService.findBescheidDraft(vorgangId); } + public BescheidItem getBescheidItem(String id) { + return remoteService.getBescheid(id); + } + public String createBescheidDraft(Command command) { validateBescheidData(command.getBodyObject()); return remoteService.findBescheidDraft(command.getVorgangId()) @@ -129,7 +132,7 @@ public class AttachedItemService { Map<String, Object> buildItemMapWithExistingBescheidFields(Command command) { var result = new HashMap<String, Object>(); - result.put(BescheidItem.FIELD_STATUS, BESCHEID_DRAFT_STATUS); + result.put(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name()); addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHIEDEN_AM, result); addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BEWILLIGT, result); addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHEID_DOCUMENT, result); @@ -168,7 +171,7 @@ public class AttachedItemService { void validateBescheidStatus(BescheidItem bescheid) { var bescheidStatus = MapUtils.getString(bescheid.getBescheidData(), BescheidItem.FIELD_STATUS); - if (!BESCHEID_DRAFT_STATUS.equals(bescheidStatus)) { + if (BescheidItem.Status.DRAFT.not(bescheidStatus)) { throw new TechnicalException("Bescheid draft with ID '%s' has an unexpected status: '%s'".formatted(bescheid.getId(), bescheidStatus)); } } @@ -182,4 +185,7 @@ public class AttachedItemService { .build(); } + public AttachedItem getItem(String id) { + return remoteService.getItem(id); + } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java index 57d6eac58ed8fe7681dbf4e28500d8ca53871205..4bc85092889c6449e0ed12193079734cc6e78459 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItem.java @@ -31,6 +31,7 @@ import lombok.Getter; @Builder(toBuilder = true) @Getter +@Deprecated(since = "2.6.0") public class BescheidItem { static final Set<String> ACCEPTED_SEND_BY_VALUES = Set.of("POSTFACH", "MANUAL"); @@ -60,4 +61,16 @@ public class BescheidItem { private String itemName; private Map<String, Object> bescheidData; + + public enum Status { + DRAFT, BESCHEID; + + public boolean not(String value) { + return !hasValue(value); + } + + public boolean hasValue(String value) { + return this.name().equalsIgnoreCase(value); + } + } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java index 5d3adecfd3983d957cc806ad7851139fbf76a52b..2c915d65d934abab2636433b02e30a1eaf8e764d 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapper.java @@ -23,7 +23,10 @@ */ package de.ozgcloud.bescheid.attacheditem; +import static java.util.Objects.*; + import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.stream.Stream; @@ -39,6 +42,7 @@ import lombok.RequiredArgsConstructor; @Component @RequiredArgsConstructor +@Deprecated(since = "2.6.0") public class BescheidItemMapper { private final GrpcObjectMapper grpcObjectMapper; @@ -74,9 +78,23 @@ public class BescheidItemMapper { .ifPresent(bescheidBuilder::setNachrichtText); Optional.ofNullable(MapUtils.getString(bescheidData, BescheidItem.FIELD_NACHRICHT_SUBJECT)).map(StringUtils::trimToNull) .ifPresent(bescheidBuilder::setNachrichtSubject); - Optional.ofNullable(bescheidData.get(BescheidItem.FIELD_ATTACHMENTS)).filter(Collection.class::isInstance).map(Collection.class::cast) - .ifPresent(bescheidBuilder::addAllAttachments); + Optional.ofNullable(bescheidData.get(BescheidItem.FIELD_ATTACHMENTS)).map(this::toAttachments).ifPresent(bescheidBuilder::addAllAttachments); return bescheidBuilder.build(); } + @SuppressWarnings("unchecked") + Collection<String> toAttachments(Object attachmentsObject) { + if (attachmentsObject instanceof Collection<?> attachments) { + return (Collection<String>) attachments; + } + if (attachmentsObject instanceof String attachment) { + attachment = StringUtils.trimToNull(attachment); + if (nonNull(attachment)) { + return List.of(attachment); + } + } else if (nonNull(attachmentsObject)) { + return List.of(String.valueOf(attachmentsObject)); + } + return null; //NOSONAR + } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java index 192f16e46ab7308c6230b208e88bbdb8093674ce..aa6709149d8d968e263c86e0197e281ff99c3a8e 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java @@ -57,6 +57,8 @@ class VorgangAttachedItemRemoteService { private ClientInterceptor bescheidCallContextInterceptor; @Autowired private BescheidItemMapper bescheidItemMapper; + @Autowired + private AttachedItemMapper attachedItemMapper; public Optional<BescheidItem> findBescheidDraft(String vorgangId) { return findBescheidDraft(buildFindRequest(vorgangId)); @@ -72,14 +74,17 @@ class VorgangAttachedItemRemoteService { Optional<BescheidItem> findBescheidDraft(GrpcFindVorgangAttachedItemRequest request) { var grpcResponse = getServiceStub().find(request); - var bescheidItems = bescheidItemMapper.fromFindVorgangAttachedItemResponse(grpcResponse) - .filter(item -> BESCHEID_DRAFT_STATUS.equals(MapUtils.getString(item.getBescheidData(), BescheidItem.FIELD_STATUS))) + var bescheidItems = bescheidItemMapper.fromFindVorgangAttachedItemResponse(grpcResponse).filter(this::hasStatusDraft) .sorted(BY_BESCHIEDEN_AM_DESC).toList(); if (bescheidItems.size() > 1) { LOG.error("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(), - bescheidItems.get(0).getVorgangId()); + bescheidItems.getFirst().getVorgangId()); } - return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.get(0)); + return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.getFirst()); + } + + boolean hasStatusDraft(BescheidItem bescheidItem) { + return BescheidItem.Status.DRAFT.hasValue(MapUtils.getString(bescheidItem.getBescheidData(), BescheidItem.FIELD_STATUS)); } public BescheidItem getBescheid(String bescheidId) { @@ -87,6 +92,11 @@ class VorgangAttachedItemRemoteService { return bescheidItemMapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()); } + public AttachedItem getItem(String id) { + var grpcVorgangAttachedItemResponse = getServiceStub().getById(buildGetByIdRequest(id)); + return attachedItemMapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()); + } + GrpcVorgangAttachedItemRequest buildGetByIdRequest(String bescheidId) { return GrpcVorgangAttachedItemRequest.newBuilder().setId(bescheidId).build(); } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java new file mode 100644 index 0000000000000000000000000000000000000000..fc0d09b53f1d9cbc4d3792dca94c429f46d3e5e1 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 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.document; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class Document { + + public static final String FIELD_DOCUMENT_TYPE = "type"; + public static final String FIELD_DOCUMENT_FILE = "documentFile"; + public static final String FIELD_NACHRICHT_TEXT = "nachrichtText"; + public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject"; + + private String id; + private String type; + private String fileId; + private String nachrichtSubject; + private String nachrichtText; + +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java new file mode 100644 index 0000000000000000000000000000000000000000..673935d696777f3708fafbe134a8a496541b0d02 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 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.document; + +import de.ozgcloud.document.DocumentServiceGrpc.DocumentServiceImplBase; +import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; +import net.devh.boot.grpc.server.service.GrpcService; + +@GrpcService +@RequiredArgsConstructor +public class DocumentGrpcService extends DocumentServiceImplBase { + + private final DocumentService documentService; + private final DocumentMapper documentMapper; + + @Override + public void getDocument(GrpcGetDocumentRequest request, StreamObserver<GrpcGetDocumentResponse> responseObserver) { + var document = documentService.getDocument(request.getId()); + responseObserver.onNext(buildGetDocumentResponse(document)); + responseObserver.onCompleted(); + } + + GrpcGetDocumentResponse buildGetDocumentResponse(Document document) { + return GrpcGetDocumentResponse.newBuilder().setDocument(documentMapper.toGrpcDocument(document)).build(); + } +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..41180bab88ef3c302300bd1e51ca34e3ed89619b --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 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.document; + +import org.apache.commons.collections.MapUtils; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; + +import de.ozgcloud.bescheid.attacheditem.AttachedItem; + +@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +interface DocumentMapper { + + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "typeBytes", ignore = true) + @Mapping(target = "nachrichtTextBytes", ignore = true) + @Mapping(target = "nachrichtSubjectBytes", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "idBytes", ignore = true) + @Mapping(target = "fileIdBytes", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "clearField", ignore = true) + GrpcDocument toGrpcDocument(Document document); + + default Document fromAttachedItem(AttachedItem attachedItem) { + return Document.builder() + .id(attachedItem.getId()) + .type(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_TYPE)) + .fileId(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_FILE)) + .nachrichtText(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_TEXT)) + .nachrichtSubject(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_SUBJECT)) + .build(); + } +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java index 1846fb93799c2b8dedffc2f3baa2c57f1e2d587a..f290e57572d8bf1a95a9dec9a8b54671a6b179c8 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java @@ -27,12 +27,14 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.apache.commons.collections.MapUtils; import org.springframework.stereotype.Service; import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.attacheditem.BescheidItem; import de.ozgcloud.command.Command; import de.ozgcloud.common.errorhandling.TechnicalException; @@ -42,26 +44,38 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class DocumentService { + public static final String DOCUMENT_ITEM_NAME = "Document"; + public static final String DOCUMENT_TYPE = "BESCHEID"; + static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; - static final String DOCUMENT_ITEM_NAME = "Document"; static final String FIELD_DOCUMENT_TYPE = "type"; - static final String DOCUMENT_TYPE = "BESCHEID"; static final String FIELD_DOCUMENT_FILE = "documentFile"; + private final AttachedItemService attachedItemService; private final OzgCloudCommandService commandService; private final CommandMapper commandMapper; + private final DocumentMapper documentMapper; public String createBescheidDocument(Command command) { + validateBescheidItem(command.getRelationId()); var ozgCloudCommand = buildCreateDocumentOzgCommand(command); var executedCommand = commandService.createAndWaitUntilDone(ozgCloudCommand); return executedCommand.getCreatedResource(); } + void validateBescheidItem(String bescheidId) { + var bescheidData = attachedItemService.getBescheidItem(bescheidId).getBescheidData(); + var status = MapUtils.getString(bescheidData, BescheidItem.FIELD_STATUS); + if (BescheidItem.Status.DRAFT.not(status)) { + throw new TechnicalException("Bescheid is not in draft status"); + } + } + OzgCloudCommand buildCreateDocumentOzgCommand(Command command) { return OzgCloudCommand.builder() .order(CREATE_ATTACHED_ITEM_ORDER) .vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId())) - .relationId(commandMapper.mapRelationId(command.getRelationId())) + .relationId(commandMapper.mapRelationId(command.getVorgangId())) .bodyObject(buildAttachedItem(command)) .build(); } @@ -81,4 +95,7 @@ public class DocumentService { return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId); } + public Document getDocument(String id) { + return documentMapper.fromAttachedItem(attachedItemService.getItem(id)); + } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java index 9cb416ff02f582ac1b8d6e535ab583fb704a661f..4d965a689be4c55ce1a9909c85fa8e013eb2da7e 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java @@ -45,7 +45,7 @@ class BescheidGrpcServiceTest { @Test void shouldBuildResponse() { when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); - when(attachedItemService.getBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create())); + when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create())); service.getBescheidDraft(request, responseObserver); @@ -56,7 +56,7 @@ class BescheidGrpcServiceTest { void shouldCallNext() { when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); when(service.buildResponse(any())).thenReturn(response); - when(attachedItemService.getBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create())); + when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create())); service.getBescheidDraft(request, responseObserver); diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..782c98d8cc4bc4066b43d34e9a45334d724ca7d5 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 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.bescheid.attacheditem; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import de.ozgcloud.document.DocumentService; +import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; + +class AttachedItemMapperTest { + + @InjectMocks + private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class); + + @Mock + private GrpcObjectMapper grpcObjectMapper; + + @BeforeEach + void init() { + when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem()); + } + + @Test + void shouldMapFromVorgangAttachedItem() { + var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME) + .setVersion(AttachedItemTestFactory.VERSION).build(); + + var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem); + + assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument()); + } + +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java index d81c4212494dea994091fafc85cc78f8d1b56ee7..107f4e3caa00e1fde61ad8d7b14bad6e0e62eb79 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java @@ -72,7 +72,7 @@ class AttachedItemServiceTest { @Test void shouldCallGetBescheidDraft() { - service.getBescheidItem(CommandTestFactory.VORGANG_ID); + service.findBescheidItem(CommandTestFactory.VORGANG_ID); verify(remoteService).findBescheidDraft(CommandTestFactory.VORGANG_ID); } @@ -82,12 +82,33 @@ class AttachedItemServiceTest { var expected = BescheidItemTestFactory.create(); when(remoteService.findBescheidDraft(anyString())).thenReturn(Optional.of(expected)); - var actual = service.getBescheidItem(CommandTestFactory.VORGANG_ID); + var actual = service.findBescheidItem(CommandTestFactory.VORGANG_ID); assertThat(actual).contains(expected); } } + @Nested + class TestGetBescheidItem { + + @Test + void shouldCallGetBescheid() { + service.getBescheidItem(BescheidItemTestFactory.ID); + + verify(remoteService).getBescheid(BescheidItemTestFactory.ID); + } + + @Test + void shouldReturnBescheidItem() { + var expected = BescheidItemTestFactory.create(); + when(remoteService.getBescheid(anyString())).thenReturn(expected); + + var actual = service.getBescheidItem(BescheidItemTestFactory.ID); + + assertThat(actual).isEqualTo(expected); + } + } + @Nested class TestCreateBescheidDraft { @@ -484,7 +505,7 @@ class AttachedItemServiceTest { void shouldSetStatus() { var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - assertThat(bescheidMap).containsEntry(BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS); + assertThat(bescheidMap).containsEntry(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name()); } @Test @@ -706,4 +727,25 @@ class AttachedItemServiceTest { } } + + @Nested + class TestGetItem { + + @Test + void shouldCallRemoteService() { + service.getItem(BescheidItemTestFactory.ID); + + verify(service).getItem(BescheidItemTestFactory.ID); + } + + @Test + void shouldReturnValue() { + var expectedItem = AttachedItemTestFactory.createDocument(); + doReturn(expectedItem).when(remoteService).getItem(any()); + + var result = service.getItem(BescheidItemTestFactory.ID); + + assertThat(result).isEqualTo(expectedItem); + } + } } \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..56fb0e8ad3050b0dc143f888671c4ef9c59bb8f2 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 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.bescheid.attacheditem; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import de.ozgcloud.bescheid.attacheditem.AttachedItem.AttachedItemBuilder; +import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.document.Document; +import de.ozgcloud.document.DocumentService; +import de.ozgcloud.document.DocumentTestFactory; + +public class AttachedItemTestFactory { + + public static final String ID = "bescheid-item-id"; + public static final long VERSION = 10L; + public static final String CLIENT = "client"; + + public static final String BESCHEIDEN_AM = "2024-01-01"; + public static final String BESCHEID_DOCUMENT = "bescheid-document"; + public static final String ATTACHMENT = "attachment-id"; + public static final String SEND_BY = "POSTFACH"; + public static final String NACHRICHT_TEXT = "nachricht-text"; + public static final String NACHRICHT_SUBJECT = "nachricht-subject"; + + public static AttachedItem createBescheid() { + return createBuilder() + .itemName(AttachedItemService.BESCHEID_ITEM_NAME) + .item(createBescheidItem()) + .build(); + } + + public static Map<String, Object> createBescheidItem() { + return Map.of( + BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT, + BescheidItem.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM, + BescheidItem.FIELD_BEWILLIGT, true, + BescheidItem.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT, + BescheidItem.FIELD_ATTACHMENTS, List.of(ATTACHMENT), + BescheidItem.FIELD_SEND_BY, SEND_BY, + BescheidItem.FIELD_NACHRICHT_TEXT, NACHRICHT_TEXT, + BescheidItem.FIELD_NACHRICHT_SUBJECT, NACHRICHT_SUBJECT); + } + + public static AttachedItem createDocument() { + return createDocumentBuilder().build(); + } + + public static AttachedItem.AttachedItemBuilder createDocumentBuilder() { + return createBuilder() + .itemName(DocumentService.DOCUMENT_ITEM_NAME) + .item(createDocumentItem()); + } + + public static HashMap<String, Object> createDocumentItem() { + var map = new HashMap<String, Object>(); + map.put(Document.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE); + map.put(Document.FIELD_DOCUMENT_FILE, DocumentTestFactory.DOCUMENT_FILE); + map.put(Document.FIELD_NACHRICHT_TEXT, DocumentTestFactory.NACHRICHT_TEXT); + map.put(Document.FIELD_NACHRICHT_SUBJECT, DocumentTestFactory.NACHRICHT_SUBJECT); + return map; + } + + public static AttachedItemBuilder createBuilder() { + return AttachedItem.builder() + .id(ID) + .version(VERSION) + .client(CLIENT) + .vorgangId(CommandTestFactory.VORGANG_ID); + } + +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java index a223382773eb98f62703cb57c003b109a4552d14..027085c7c1c70681debd0503f3e1920c5620a039 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemMapperTest.java @@ -26,7 +26,8 @@ package de.ozgcloud.bescheid.attacheditem; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -179,8 +180,30 @@ class BescheidItemMapperTest { assertThat(bescheid.getNachrichtSubject()).isEqualTo(BescheidItemTestFactory.NACHRICHT_SUBJECT); } + @Test + void shouldCallToAttachments() { + var expectedAttachments = List.of(BescheidItemTestFactory.ATTACHMENT); + var bescheidItem = BescheidItemTestFactory.createBuilder() + .bescheidData(Map.of(BescheidItem.FIELD_ATTACHMENTS, expectedAttachments)).build(); + + mapper.toBescheid(bescheidItem); + + verify(mapper).toAttachments(expectedAttachments); + } + + @Test + void shouldNotCallToAttachments() { + var bescheidItem = BescheidItemTestFactory.createBuilder().bescheidData(Map.of()).build(); + + mapper.toBescheid(bescheidItem); + + verify(mapper, never()).toAttachments(any()); + } + @Test void shouldSetAttachments() { + doReturn(List.of(BescheidItemTestFactory.ATTACHMENT)).when(mapper).toAttachments(any()); + var bescheid = mapBescheid(); assertThat(bescheid.getAttachmentsList()).containsExactly(BescheidItemTestFactory.ATTACHMENT); @@ -200,21 +223,35 @@ class BescheidItemMapperTest { assertThat(bescheid.getVersion()).isEqualTo(BescheidItemTestFactory.VERSION); } - @DisplayName("should skip add attachments when") - @ParameterizedTest(name = "attachments is {0}") - @NullAndEmptySource - void shouldSkipEmptyAttachments(String attachments) { - var bescheidData = new HashMap<String, Object>(); - bescheidData.put(BescheidItem.FIELD_ATTACHMENTS, attachments); - var bescheidItem = BescheidItemTestFactory.createBuilder().bescheidData(bescheidData).build(); + private GrpcBescheid mapBescheid() { + return mapper.toBescheid(BescheidItemTestFactory.create()); + } + } - var result = mapper.toBescheid(bescheidItem); + @Nested + class TestToAttachments { - assertThat(result.getAttachmentsList()).isEmpty(); + @Test + void shouldMapCollection() { + var result = mapper.toAttachments(List.of(BescheidItemTestFactory.ATTACHMENT)); + + assertThat(result).containsExactly(BescheidItemTestFactory.ATTACHMENT); } - private GrpcBescheid mapBescheid() { - return mapper.toBescheid(BescheidItemTestFactory.create()); + @Test + void shouldMapSingleValue() { + var result = mapper.toAttachments(BescheidItemTestFactory.ATTACHMENT); + + assertThat(result).containsExactly(BescheidItemTestFactory.ATTACHMENT); + } + + @DisplayName("should return null") + @ParameterizedTest(name = "when attachmentsObject is \"{0}\"") + @NullAndEmptySource + void shouldReturnNull(String attachmentsObject) { + var result = mapper.toAttachments(attachmentsObject); + + assertThat(result).isNull(); } } } \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java index b053862753311d75651238ead6f5ae4492b6a124..1299edf5394b1d9a8ec0d804663dbd450b3d741c 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/BescheidItemTestFactory.java @@ -58,7 +58,7 @@ public class BescheidItemTestFactory { public static Map<String, Object> createBescheidBody() { return Map.of( - BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS, + BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT, BescheidItem.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM, BescheidItem.FIELD_BEWILLIGT, true, BescheidItem.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT, diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java index 257cbc65ee52e8660fa93be4912f321e01d8089e..444249e06cc391cd8b6d05304ab33f93134cb899 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java @@ -26,7 +26,6 @@ package de.ozgcloud.bescheid.attacheditem; import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Map; @@ -51,7 +50,6 @@ import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest; import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemResponse; import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub; import io.grpc.ClientInterceptor; -import io.grpc.StatusRuntimeException; class VorgangAttachedItemRemoteServiceTest { @@ -67,6 +65,8 @@ class VorgangAttachedItemRemoteServiceTest { private ClientInterceptor bescheidCallContextInterceptor; @Mock private BescheidItemMapper bescheidItemMapper; + @Mock + private AttachedItemMapper attachedItemMapper; @Nested class TestFindBescheidDraft { @@ -130,11 +130,40 @@ class VorgangAttachedItemRemoteServiceTest { verify(bescheidItemMapper).fromFindVorgangAttachedItemResponse(response); } + @Test + void shouldCallHasStatusDraft() { + var item = BescheidItemTestFactory.create(); + when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item)); + + service.findBescheidDraft(request); + + verify(service).hasStatusDraft(item); + } + @Test void shouldFilterDraftItems() { - var item1 = BescheidItemTestFactory.createBuilder().bescheidData(Map.of( - BescheidItem.FIELD_STATUS, "other")).build(); - when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item1)); + var item = BescheidItemTestFactory.create(); + when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item)); + doReturn(true).when(service).hasStatusDraft(any()); + + var result = service.findBescheidDraft(request); + + assertThat(result).contains(item); + } + + @Test + void shouldReturnEmptyWhenNotFound() { + when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.empty()); + + var result = service.findBescheidDraft(request); + + assertThat(result).isEmpty(); + } + + @Test + void shouldReturnEmptyWhenNotDraft() { + when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(BescheidItemTestFactory.create())); + doReturn(false).when(service).hasStatusDraft(any()); var result = service.findBescheidDraft(request); @@ -144,10 +173,10 @@ class VorgangAttachedItemRemoteServiceTest { @Test void shouldReturnLastBescheid() { var item1 = BescheidItemTestFactory.createBuilder().bescheidData(Map.of( - BescheidItem.FIELD_BESCHIEDEN_AM, "2021-01-01", - BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS)).build(); + BescheidItem.FIELD_BESCHIEDEN_AM, "2021-01-01")).build(); var item2 = BescheidItemTestFactory.create(); when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item1, item2)); + doReturn(true).when(service).hasStatusDraft(any()); var result = service.findBescheidDraft(request); @@ -191,6 +220,30 @@ class VorgangAttachedItemRemoteServiceTest { } } + @Nested + class TestHasStatusDraft { + + @Test + void shouldReturnTrueIfDraft() { + var item = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name())) + .build(); + + var result = service.hasStatusDraft(item); + + assertThat(result).isTrue(); + } + + @Test + void shouldReturnFalseIfNotDraft() { + var item = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, BescheidItem.Status.BESCHEID.name())) + .build(); + + var result = service.hasStatusDraft(item); + + assertThat(result).isFalse(); + } + } + @Nested class TestGetBescheid { @@ -255,15 +308,77 @@ class VorgangAttachedItemRemoteServiceTest { assertThat(result).isEqualTo(expectedBescheid); } + private BescheidItem getBescheid() { + return service.getBescheid(BescheidItemTestFactory.ID); + } + } + + @Nested + class TestGetItem { + + @Mock + private GrpcVorgangAttachedItemRequest grpcVorgangAttachedItemRequest; + @Mock + private GrpcVorgangAttachedItemResponse grpcVorgangAttachedItemResponse; + @Mock + private GrpcVorgangAttachedItem grpcVorgangAttachedItem; + + @BeforeEach + void init() { + when(serviceStub.getById(any())).thenReturn(grpcVorgangAttachedItemResponse); + doReturn(serviceStub).when(service).getServiceStub(); + } + @Test - void shouldThrowExceptionIfNotFound() { - when(serviceStub.getById(any())).thenThrow(StatusRuntimeException.class); + void shouldCallGetServiceStab() { + when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); + + getItem(); - assertThrows(StatusRuntimeException.class, this::getBescheid); + verify(service).getServiceStub(); } - private BescheidItem getBescheid() { - return service.getBescheid(BescheidItemTestFactory.ID); + @Test + void shouldCallBuildRequest() { + when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); + + getItem(); + + verify(service).buildGetByIdRequest(AttachedItemTestFactory.ID); + } + + @Test + void shouldCallGetById() { + when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); + doReturn(grpcVorgangAttachedItemRequest).when(service).buildGetByIdRequest(any()); + + getItem(); + + verify(serviceStub).getById(grpcVorgangAttachedItemRequest); + } + + @Test + void shouldCallMapper() { + when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); + + getItem(); + + verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem); + } + + @Test + void shouldReturnFoundBescheid() { + var expectedItem = AttachedItemTestFactory.createDocument(); + when(attachedItemMapper.mapFromVorgangAttachedItem(any())).thenReturn(expectedItem); + when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); + + var result = getItem(); + + assertThat(result).isEqualTo(expectedItem); + } + + private AttachedItem getItem() { + return service.getItem(BescheidItemTestFactory.ID); } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java deleted file mode 100644 index a7f40a347744785b1be6cee7580c7efe9cfceddd..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 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.document; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -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.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.context.ApplicationEventPublisher; - -import de.ozgcloud.apilib.common.command.OzgCloudCommand; -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.callcontext.UserProfile; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEventTestFactory; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.test.ITCase; - -@SpringBootTest(classes = DocumentTestApplication.class) -@ITCase -class DocumentEventListenerITCase { - - @Spy - @Autowired - private ApplicationEventPublisher eventPublisher; - - @SpyBean - private DocumentEventListener documentEventListener; - - @MockBean - private OzgCloudCommandService ozgCloudCommandService; - @MockBean - private CommandMapper commandMapper; - @MockBean - private CurrentUserService userService; - - @Mock - private UserProfile userProfile; - - @BeforeEach - void init() { - when(userService.getUserProfile()).thenReturn(userProfile); - } - - @Nested - class TestCreateBescheidDocument { - - private static final String CREATED_RESOURCE_ID = "created-resource-id"; - - @Mock - private OzgCloudCommand executedCommand; - - @Captor - private ArgumentCaptor<BescheidDocumentCreatedEvent> documentCreatedEventCaptor; - - private Command command = CommandTestFactory.createBuilder() - .order(DocumentEventListener.CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER) - .bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, "file-id")) - .build(); - - @Test - void shouldPublishBescheidDocumentCreatedEvent() { - when(executedCommand.getCreatedResource()).thenReturn(CREATED_RESOURCE_ID); - when(ozgCloudCommandService.createAndWaitUntilDone(any())).thenReturn(executedCommand); - - eventPublisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); - - verify(documentEventListener, timeout(60000)).publishEvent(documentCreatedEventCaptor.capture()); - assertThat(documentCreatedEventCaptor.getValue()).satisfies(event -> { - assertThat(event.getCommand()).isEqualTo(command); - assertThat(event.getCreatedResource()).isEqualTo(CREATED_RESOURCE_ID); - }); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e2157ed90a4161e3e67bfd1dcc30f0010c5ca390 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 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.document; + +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.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import io.grpc.stub.StreamObserver; + +class DocumentGrpcServiceTest { + + @Spy + @InjectMocks + private DocumentGrpcService service; + + @Mock + private DocumentService documentService; + @Mock + private DocumentMapper documentMapper; + + @Nested + class TestGetDocument { + + private final static GrpcGetDocumentRequest REQUEST = GrpcGetDocumentRequest.newBuilder().setId(DocumentTestFactory.ID).build(); + + @Mock + private GrpcGetDocumentResponse response; + @Mock + private StreamObserver<GrpcGetDocumentResponse> responseObserver; + + @BeforeEach + void init() { + doReturn(response).when(service).buildGetDocumentResponse(any()); + } + + @Test + void shouldCallDocumentService() { + service.getDocument(REQUEST, responseObserver); + + verify(documentService).getDocument(DocumentTestFactory.ID); + } + + @Test + void shouldCallBuildResponse() { + service.getDocument(REQUEST, responseObserver); + + verify(service).buildGetDocumentResponse(any()); + } + + @Test + void shouldCallOnNext() { + service.getDocument(REQUEST, responseObserver); + + verify(responseObserver).onNext(response); + } + + @Test + void shouldCallOnCompleted() { + service.getDocument(REQUEST, responseObserver); + + verify(responseObserver).onCompleted(); + } + } + + @Nested + class TestBuildGetDocumentResponse { + + @Mock + private GrpcDocument grpcDocument; + + @BeforeEach + void init() { + when(documentMapper.toGrpcDocument(any())).thenReturn(grpcDocument); + } + + @Test + void shouldCallDocumentMapper() { + var document = DocumentTestFactory.create(); + + service.buildGetDocumentResponse(document); + + verify(documentMapper).toGrpcDocument(document); + } + + @Test + void shouldSetDocument() { + var result = service.buildGetDocumentResponse(DocumentTestFactory.create()); + + assertThat(result.getDocument()).isEqualTo(grpcDocument); + } + } +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9ba02e1e11c796f19fc771e9ed29000f911690cd --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 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.document; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; + +class DocumentMapperTest { + + private DocumentMapper mapper = Mappers.getMapper(DocumentMapper.class); + + @DisplayName("To grpc document") + @Nested + class TestToGrpcDocument { + + @Test + void shouldMapDocument() { + var result = mapper.toGrpcDocument(DocumentTestFactory.create()); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcDocumentTestFactory.create()); + } + + @Test + void shouldMapEmptyDocument() { + var result = mapper.toGrpcDocument(Document.builder().build()); + + assertThat(result).isEqualTo(GrpcDocument.newBuilder().build()); + } + } + + @DisplayName("From attached item") + @Nested + class TestFromAttachedItem { + + @Test + void shouldMapId() { + var document = AttachedItemTestFactory.createDocument(); + + var result = mapper.fromAttachedItem(document); + + assertThat(result.getId()).isEqualTo(AttachedItemTestFactory.ID); + } + + @Test + void shouldMapType() { + var document = AttachedItemTestFactory.createDocument(); + + var result = mapper.fromAttachedItem(document); + + assertThat(result.getType()).isEqualTo(DocumentService.DOCUMENT_TYPE); + } + + @Test + void shouldMapFileId() { + var document = AttachedItemTestFactory.createDocument(); + + var result = mapper.fromAttachedItem(document); + + assertThat(result.getFileId()).isEqualTo(DocumentTestFactory.DOCUMENT_FILE); + } + + @Test + void shouldMapNachrichtText() { + var document = AttachedItemTestFactory.createDocument(); + + var result = mapper.fromAttachedItem(document); + + assertThat(result.getNachrichtText()).isEqualTo(DocumentTestFactory.NACHRICHT_TEXT); + } + + @Test + void shouldMapNachrichtSubject() { + var document = AttachedItemTestFactory.createDocument(); + + var result = mapper.fromAttachedItem(document); + + assertThat(result.getNachrichtSubject()).isEqualTo(DocumentTestFactory.NACHRICHT_SUBJECT); + } + } +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java index 559c3bc73436f3d87fd4df9e07b12f29d3eb74ef..736947b3a9ede6e9fbd04893ae3f6079887b4fcd 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java @@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import org.springframework.web.server.ResponseStatusException; import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; @@ -42,7 +43,10 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.apilib.common.datatypes.GenericId; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.bescheid.attacheditem.AttachedItemService; +import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; import de.ozgcloud.bescheid.attacheditem.BescheidItem; +import de.ozgcloud.bescheid.attacheditem.BescheidItemTestFactory; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandTestFactory; import de.ozgcloud.common.errorhandling.TechnicalException; @@ -60,6 +64,10 @@ class DocumentServiceTest { private OzgCloudCommandService commandService; @Mock private CommandMapper commandMapper; + @Mock + private AttachedItemService attachedItemService; + @Mock + private DocumentMapper documentMapper; private Command command = CommandTestFactory.createBuilder() .relationId(RELATION_ID) @@ -76,6 +84,14 @@ class DocumentServiceTest { @BeforeEach void init() { when(commandService.createAndWaitUntilDone(any())).thenReturn(ozgCommand); + doNothing().when(service).validateBescheidItem(any()); + } + + @Test + void shouldCallValidateBescheidItem() { + service.createBescheidDocument(command); + + verify(service).validateBescheidItem(RELATION_ID); } @Test @@ -104,6 +120,44 @@ class DocumentServiceTest { } } + @Nested + class TestValidateBescheidItem { + + @Test + void shouldCallGetBescheidItem() { + when(attachedItemService.getBescheidItem(any())).thenReturn(BescheidItemTestFactory.create()); + + validateBescheidItem(); + + verify(attachedItemService).getBescheidItem(BescheidItemTestFactory.ID); + } + + @Test + void shouldThrowExceptionWhenNoBescheidDraft() { + when(attachedItemService.getBescheidItem(any())).thenThrow(ResponseStatusException.class); + + assertThrows(ResponseStatusException.class, this::validateBescheidItem); + } + + @Test + void shouldNotThrowExceptionIfNotDraft() { + when(attachedItemService.getBescheidItem(any())).thenReturn( + BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, "not-draft")).build()); + + assertThrows(TechnicalException.class, this::validateBescheidItem); + } + + @Test + void shouldValidateBescheidItem() { + when(attachedItemService.getBescheidItem(any())).thenReturn(BescheidItemTestFactory.create()); + + assertDoesNotThrow(this::validateBescheidItem); + } + void validateBescheidItem() { + service.validateBescheidItem(BescheidItemTestFactory.ID); + } + } + @Nested class TestBuildCreateDocumentOzgCommand { @@ -135,7 +189,7 @@ class DocumentServiceTest { void shouldCallRelationIdMapper() { service.buildCreateDocumentOzgCommand(command); - verify(commandMapper).mapRelationId(RELATION_ID); + verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID); } @Test @@ -242,4 +296,34 @@ class DocumentServiceTest { } } + @Nested + class TestGetDocument { + + @Test + void shouldCallAttachedItemService() { + service.getDocument(AttachedItemTestFactory.ID); + + verify(attachedItemService).getItem(AttachedItemTestFactory.ID); + } + + @Test + void shouldCallDocumentMapper() { + var expectedItem = AttachedItemTestFactory.createDocument(); + when(attachedItemService.getItem(any())).thenReturn(expectedItem); + + service.getDocument(AttachedItemTestFactory.ID); + + verify(documentMapper).fromAttachedItem(expectedItem); + } + + @Test + void shouldReturnDocument() { + var expectedDocument = DocumentTestFactory.create(); + when(documentMapper.fromAttachedItem(any())).thenReturn(expectedDocument); + + Document document = service.getDocument(AttachedItemTestFactory.ID); + + assertThat(document).isEqualTo(expectedDocument); + } + } } \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..0484d6f5492a0b4fe72bbd87b6980797c9bb6110 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestFactory.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 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.document; + +import de.ozgcloud.document.Document.DocumentBuilder; + +public class DocumentTestFactory { + + public static final String ID = "documentId"; + public static final String TYPE = "type"; + public static final String DOCUMENT_FILE = "file-id"; + public static final String NACHRICHT_SUBJECT = "subject"; + public static final String NACHRICHT_TEXT = "text"; + + public static Document create() { + return createBuilder().build(); + } + + public static DocumentBuilder createBuilder() { + return Document.builder() + .id(ID) + .type(TYPE) + .fileId(DOCUMENT_FILE) + .nachrichtSubject(NACHRICHT_SUBJECT) + .nachrichtText(NACHRICHT_TEXT); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..5c56530f7b13a986c3cd6fd0914bfc9201d152b7 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 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.document; + +public class GrpcDocumentTestFactory { + + public static GrpcDocument create() { + return createBuilder().build(); + } + + public static GrpcDocument.Builder createBuilder() { + return GrpcDocument.newBuilder() + .setId(DocumentTestFactory.ID) + .setType(DocumentTestFactory.TYPE) + .setFileId(DocumentTestFactory.DOCUMENT_FILE) + .setNachrichtSubject(DocumentTestFactory.NACHRICHT_SUBJECT) + .setNachrichtText(DocumentTestFactory.NACHRICHT_TEXT); + } +} diff --git a/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml b/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml index e0effc809597979a1cdb01c636f868c63574f617..95cd70f64a419cc1e585a2f977f48d45aae0eaee 100644 --- a/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml +++ b/nachrichten-bayernid-proxy/src/main/helm/templates/network_policy.yaml @@ -44,6 +44,9 @@ spec: component: vorgang-manager {{- with (.Values.networkPolicy).additionalIngressConfig }} {{ toYaml . | indent 2 }} +{{- end }} +{{- with (.Values.networkPolicy).additionalIngressConfigNamespace }} +{{ toYaml . | indent 2 }} {{- end }} egress: - to: @@ -62,5 +65,8 @@ spec: {{- with (.Values.networkPolicy).additionalEgressConfig }} {{ toYaml . | indent 2 }} {{- end }} +{{- with (.Values.networkPolicy).additionalEgressConfigNamespace }} +{{ toYaml . | indent 2 }} +{{- end }} {{- end }} \ No newline at end of file diff --git a/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml b/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml index 78236b32067b019da7497306962f0fd74d7d9307..e097f3b15d2c12e7043830c5ba2d794302f07da4 100644 --- a/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml +++ b/nachrichten-bayernid-proxy/src/test/helm/configmap_bindings_type_test.yaml @@ -33,6 +33,8 @@ tests: asserts: - isKind: of: ConfigMap + - isAPIVersion: + of: v1 - equal: path: metadata.name value: bindings-type diff --git a/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml b/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml index 7382ad0947be9db238ff1b5d7f9de08439716165..6942329e62a7ca2a0544cc56d6f3d6d76e9b2120 100644 --- a/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml +++ b/nachrichten-bayernid-proxy/src/test/helm/network_policy_test.yaml @@ -91,16 +91,15 @@ tests: - port: 5353 protocol: TCP - - it: add ingress rule by values + - it: should add additionalIngressConfig set: networkPolicy: - ssoPublicIp: 51.89.117.53/32 - dnsServerNamespace: test-namespace-dns + dnsServerNamespace: test-dns-namespace additionalIngressConfig: - from: - podSelector: matchLabels: - component: client2 + additionalIngressConfig: yes asserts: - contains: path: spec.ingress @@ -108,41 +107,62 @@ tests: from: - podSelector: matchLabels: - component: client2 + additionalIngressConfig: yes - - it: add egress rules by values + - it: should add additionalEgressConfig set: - networkPolicy: + networkPolicy: + dnsServerNamespace: test-dns-namespace additionalEgressConfig: - - to: - - ipBlock: - cidr: 1.2.3.4/32 - to: - podSelector: matchLabels: - component: ozg-testservice - ports: - - port: 12345 - protocol: TCP - - dnsServerNamespace: test-dns-namespace + additionalEgressConfig: yes asserts: - contains: path: spec.egress content: to: - - ipBlock: - cidr: 1.2.3.4/32 + - podSelector: + matchLabels: + additionalEgressConfig: yes + + + - it: should add additionalIngressConfigNamespace + set: + networkPolicy: + dnsServerNamespace: test-dns-namespace + additionalIngressConfigNamespace: + - from: + - podSelector: + matchLabels: + additionalIngressConfigNamespace: yes + asserts: + - contains: + path: spec.ingress + content: + from: + - podSelector: + matchLabels: + additionalIngressConfigNamespace: yes + + - it: should add additionalEgressConfigNamespace + set: + networkPolicy: + dnsServerNamespace: test-dns-namespace + additionalEgressConfigNamespace: + - to: + - podSelector: + matchLabels: + additionalEgressConfigNamespace: yes + asserts: - contains: path: spec.egress content: to: - podSelector: matchLabels: - component: ozg-testservice - ports: - - port: 12345 - protocol: TCP + additionalEgressConfigNamespace: yes - it: test network policy disabled set: diff --git a/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java b/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java index 111b14522559611bb2dc1ecbc863daae75084786..aa80911f97481bd1fafbe0b11d30e53fc6713d61 100644 --- a/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java +++ b/notification-manager/src/test/java/de/ozgcloud/notification/vorgang/GrpcServiceKontoTestFactory.java @@ -6,6 +6,7 @@ import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; public class GrpcServiceKontoTestFactory { public final static String TYPE = "OSI"; + public final static String TRUST_LEVEL = "STORK-QAA-LEVEL-1"; public static GrpcServiceKonto create() { return createBuilder().build(); @@ -14,6 +15,7 @@ public class GrpcServiceKontoTestFactory { public static GrpcServiceKonto.Builder createBuilder() { return GrpcServiceKonto.newBuilder() .setType(TYPE) + .setTrustLevel(TRUST_LEVEL) .addPostfachAddresses(GrpcPostfachAddressTestFactory.create()); } } diff --git a/run_helm_test.sh b/run_helm_test.sh index 08bccc2c0621f2a7c960924c8bddf3187d0f2647..2bae426e6327e0d169891a6cd4eec42cd5377d87 100755 --- a/run_helm_test.sh +++ b/run_helm_test.sh @@ -5,5 +5,4 @@ set -x helm template ./src/main/helm/ -f src/test/helm-linter-values.yaml helm lint -f src/test/helm-linter-values.yaml ./src/main/helm/ -cd src/main/helm && helm unittest -f '../../test/helm/**/*test.yaml' . - +cd src/main/helm && helm unittest -f '../../test/helm/**/*test.yaml' . \ No newline at end of file diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl index 71d217abeb2c2927cf55d228823a9f4b11a1065c..b6728207b5b86dec00472dc1b8fdc2ef70741462 100644 --- a/src/main/helm/templates/_helpers.tpl +++ b/src/main/helm/templates/_helpers.tpl @@ -41,12 +41,6 @@ app.kubernetes.io/name: {{ .Release.Name }} app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{- end -}} -{{- define "app.imagePullSecret" }} -{{- with .Values.imageCredentials }} -{{- printf "{\"auths\":{\"%s\":{\"username\":\"%s\",\"password\":\"%s\",\"email\":\"%s\",\"auth\":\"%s\"}}}" .registry .username .password .email (printf "%s:%s" .username .password | b64enc) | b64enc }} -{{- end }} -{{- end }} - {{- define "app.envSpringProfiles" }} {{- if (.Values.env).overrideSpringProfiles -}} {{ printf "%s" (.Values.env).overrideSpringProfiles }} diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index 711c0d02bed2c1fb0c81025ae0d25b467df2962c..7a17fea9c78bd89a2367bcc0dc002618d30ddc81 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -328,11 +328,7 @@ spec: dnsConfig: {} dnsPolicy: ClusterFirst imagePullSecrets: - {{- if .Values.imagePullSecret }} - - name: {{ .Values.imagePullSecret }} - {{ else }} - - name: vorgang-manager-image-pull-secret - {{- end }} + - name: {{ required "imagePullSecret must be set" .Values.imagePullSecret }} restartPolicy: Always {{- with .Values.hostAliases }} hostAliases: diff --git a/src/main/helm/templates/image-pull-secret.yaml b/src/main/helm/templates/image-pull-secret.yaml deleted file mode 100644 index 3fe7a2fb6f60d52c8cee42df906d7e20f025f226..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/image-pull-secret.yaml +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (C) 2022 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. -# - -{{- if not (.Values.imagePullSecret) }} -apiVersion: v1 -kind: Secret -metadata: - name: vorgang-manager-image-pull-secret - namespace: {{ include "app.namespace" . }} -type: kubernetes.io/dockerconfigjson -data: - .dockerconfigjson: {{ include "app.imagePullSecret" . }} -{{- end }} \ No newline at end of file diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml index fb20373df7e5cf5c1045657b25fb3df4057f48cc..88ad059ed4898240276aa3f9a0dc05775705a87e 100644 --- a/src/main/helm/templates/network_policy.yaml +++ b/src/main/helm/templates/network_policy.yaml @@ -47,6 +47,9 @@ spec: ozg-component: eingangsadapter {{- with (.Values.networkPolicy).additionalIngressConfig }} {{ toYaml . | indent 2 }} +{{- end }} +{{- with (.Values.networkPolicy).additionalIngressConfigNamespace }} +{{ toYaml . | indent 2 }} {{- end }} egress: - to: @@ -101,5 +104,8 @@ spec: {{- with (.Values.networkPolicy).additionalEgressConfig }} {{ toYaml . | indent 2 }} {{- end }} +{{- with (.Values.networkPolicy).additionalEgressConfigNamespace }} +{{ toYaml . | indent 2 }} +{{- end }} {{- end }} \ No newline at end of file diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml index ad11ce9887d4137c9b708fa65d8f8662c5454476..047b472e2225090f010e1f297a03a7a660062eb1 100644 --- a/src/test/helm-linter-values.yaml +++ b/src/test/helm-linter-values.yaml @@ -28,4 +28,6 @@ ozgcloud: address: https://info-manager.my-wonderful-domain.local:9000 networkPolicy: - dnsServerNamespace: test-dns-namespace \ No newline at end of file + dnsServerNamespace: test-dns-namespace + +imagePullSecret: test-image-pull-secret \ No newline at end of file diff --git a/src/test/helm/configmap_bindings_type_test.yaml b/src/test/helm/configmap_bindings_type_test.yaml index 78236b32067b019da7497306962f0fd74d7d9307..e097f3b15d2c12e7043830c5ba2d794302f07da4 100644 --- a/src/test/helm/configmap_bindings_type_test.yaml +++ b/src/test/helm/configmap_bindings_type_test.yaml @@ -33,6 +33,8 @@ tests: asserts: - isKind: of: ConfigMap + - isAPIVersion: + of: v1 - equal: path: metadata.name value: bindings-type diff --git a/src/test/helm/deployment_63_chars_test.yaml b/src/test/helm/deployment_63_chars_test.yaml index 3495fae61e183cdfd1d2e810ddd2dcc2ace6ad22..a84ec6d6698acc0c874b72e9d5c76f425de07b7e 100644 --- a/src/test/helm/deployment_63_chars_test.yaml +++ b/src/test/helm/deployment_63_chars_test.yaml @@ -35,6 +35,7 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: should fail on .Release.Namespace length longer than 63 characters diff --git a/src/test/helm/deployment_actuator_test.yaml b/src/test/helm/deployment_actuator_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b01fbbe154949e3b3198fc648fab4b1ce605c87a --- /dev/null +++ b/src/test/helm/deployment_actuator_test.yaml @@ -0,0 +1,66 @@ +# +# Copyright (C) 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. +# + +suite: test deployment actuator +release: + name: vorgang-manager + namespace: sh-helm-test +templates: + - templates/deployment.yaml +set: + ozgcloud: + environment: dev + imagePullSecret: test-image-pull-secret +tests: + - it: check readiness and startup probe + asserts: + - equal: + path: spec.template.spec.containers[0].readinessProbe + value: + failureThreshold: 3 + httpGet: + path: /actuator/health/readiness + port: 8081 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 3 + + - equal: + path: spec.template.spec.containers[0].startupProbe + value: + failureThreshold: 10 + httpGet: + path: /actuator/health/readiness + port: 8081 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + + + + + diff --git a/src/test/helm/deployment_bayernid_test.yaml b/src/test/helm/deployment_bayernid_test.yaml index 4f662d913bc841f73abf47289ef5c1b7095858a5..f0dee5aaac2e396ea171e929e934bc1b71ddf51e 100644 --- a/src/test/helm/deployment_bayernid_test.yaml +++ b/src/test/helm/deployment_bayernid_test.yaml @@ -42,10 +42,9 @@ set: dienst: "dienst" mandant: "mandant" gemeindeSchluessel: "gemeindeSchluessel" + imagePullSecret: test-image-pull-secret tests: - it: should enable bayernid - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml index fed0968f63f66c4471c76957858b2a5e27d312c5..d4fa53ca7d43e4998315ec2cfb4f42bc5bd5e3de 100644 --- a/src/test/helm/deployment_bindings_test.yaml +++ b/src/test/helm/deployment_bindings_test.yaml @@ -31,9 +31,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: should have volumes - template: deployment.yaml set: usermanagerName: user-manager asserts: @@ -45,7 +45,6 @@ tests: subPath: ca.crt readOnly: true - it: should have volume for user-manager-tls-certificate - template: deployment.yaml set: usermanagerName: user-manager asserts: diff --git a/src/test/helm/deployment_test.yaml b/src/test/helm/deployment_container_basic_test.yaml similarity index 57% rename from src/test/helm/deployment_test.yaml rename to src/test/helm/deployment_container_basic_test.yaml index 930892966926123411689524b81e518be23ff059..876b4714aafe538e7c080057c54abd65bfac478d 100644 --- a/src/test/helm/deployment_test.yaml +++ b/src/test/helm/deployment_container_basic_test.yaml @@ -1,5 +1,5 @@ # -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den # Ministerpräsidenten des Landes Schleswig-Holstein # Staatskanzlei # Abteilung Digitalisierung und zentrales IT-Management der Landesregierung @@ -22,7 +22,7 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test Vorgangfilter general values +suite: test deployment container basics release: name: vorgang-manager namespace: sh-helm-test @@ -31,12 +31,30 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - - it: testIsDeployment - template: deployment.yaml + - it: should have correct values for container image, name, imagePullPolicy asserts: - - isKind: - of: Deployment - equal: path: spec.template.spec.containers[0].image value: docker.ozg-sh.de/vorgang-manager:latest + - equal: + path: spec.template.spec.containers[0].name + value: vorgang-manager + - equal: + path: spec.template.spec.containers[0].imagePullPolicy + value: Always + - it: should have correct values for container ports + asserts: + - contains: + path: spec.template.spec.containers[0].ports + content: + containerPort: 9090 + name: grpc-9090 + protocol: TCP + - contains: + path: spec.template.spec.containers[0].ports + content: + containerPort: 8081 + name: metrics + protocol: TCP \ No newline at end of file diff --git a/src/test/helm/deployment_container_security_context_test.yaml b/src/test/helm/deployment_container_security_context_test.yaml index f3638e95aa39c33c1afd7ebf6860a68367a50ce7..11aef905bd2c4cbfe7fbcdd88ddaab437f0d4d4a 100644 --- a/src/test/helm/deployment_container_security_context_test.yaml +++ b/src/test/helm/deployment_container_security_context_test.yaml @@ -22,7 +22,7 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test deployment +suite: test deployment security context release: name: vorgang-manager namespace: sh-helm-test @@ -31,11 +31,10 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check default values asserts: - - isKind: - of: Deployment - equal: path: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation value: false diff --git a/src/test/helm/deployment_defaults_labels_test.yaml b/src/test/helm/deployment_defaults_labels_test.yaml index 08f277ac27db074e7936b0fc2c7af85efb749301..2cf86a63ea9c342d7c5f6553cbba061eb8e367af 100644 --- a/src/test/helm/deployment_defaults_labels_test.yaml +++ b/src/test/helm/deployment_defaults_labels_test.yaml @@ -22,17 +22,16 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test deployment +suite: test deployment defualt labels release: name: vorgang-manager namespace: sh-helm-test templates: - templates/deployment.yaml - - templates/service.yaml - - templates/service_monitor.yaml set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check default labels asserts: @@ -49,26 +48,10 @@ tests: path: metadata.labels["app.kubernetes.io/namespace"] value: sh-helm-test - it: check component label for deployment - templates: - - templates/deployment.yaml asserts: - equal: path: spec.template.metadata.labels["component"] value: vorgang-manager - - it: check component label for service - templates: - - templates/service.yaml - asserts: - - equal: - path: metadata.labels["component"] - value: vorgang-manager-service - - it: check component label for service monitor - templates: - - templates/service_monitor.yaml - asserts: - - equal: - path: metadata.labels["component"] - value: vorgang-manager-service-monitor - it: should have label for mongodb client asserts: diff --git a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b5e90a80698041766edbf65b61e54943b2a8f032 --- /dev/null +++ b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml @@ -0,0 +1,50 @@ +# +# Copyright (C) 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. +# + +suite: test deployment topology spread constrains +release: + name: vorgang-manager + namespace: sh-helm-test +templates: + - templates/deployment.yaml +set: + ozgcloud: + environment: test + imagePullSecret: test-image-pull-secret + +tests: + - it: check default values of spec.template.spec.topologySpreadConstraints + asserts: + - equal: + path: spec.template.spec.topologySpreadConstraints[0].maxSkew + value: 1 + - equal: + path: spec.template.spec.topologySpreadConstraints[0].topologyKey + value: kubernetes.io/hostname + - equal: + path: spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable + value: ScheduleAnyway + - equal: + path: spec.template.spec.topologySpreadConstraints[0].labelSelector.matchLabels["app.kubernetes.io/name"] + value: vorgang-manager \ No newline at end of file diff --git a/src/test/helm/elasticsearch_deployment_test.yaml b/src/test/helm/deployment_elasticsearch_test.yaml similarity index 98% rename from src/test/helm/elasticsearch_deployment_test.yaml rename to src/test/helm/deployment_elasticsearch_test.yaml index 6dc0ed45bd0aa299b30ca0d45e06760396ff0248..2da7a513b36639efde128078b9fd5c0d0876c30e 100644 --- a/src/test/helm/elasticsearch_deployment_test.yaml +++ b/src/test/helm/deployment_elasticsearch_test.yaml @@ -28,9 +28,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check if elastic credentials are disabled by default - template: deployment.yaml asserts: - notContains: path: spec.template.spec.containers[0].env @@ -89,7 +89,6 @@ tests: - it: smoke test if elasticsearch is disabled when set to false - template: deployment.yaml set: ozgcloud.environment: test database.password: hase @@ -106,7 +105,6 @@ tests: optional: false - it: check enabled elastic credentials - template: deployment.yaml set: elasticsearch.enabled: true asserts: diff --git a/src/test/helm/deployment_env_test.yaml b/src/test/helm/deployment_env_test.yaml index 7c48f92fc3d6707ea82ff187e16eccf852d4e9ef..f4306525a9696b7c8c57b8dfe940712c09ad516c 100644 --- a/src/test/helm/deployment_env_test.yaml +++ b/src/test/helm/deployment_env_test.yaml @@ -28,9 +28,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check customList - template: deployment.yaml set: env.customList: - name: my_test_environment_name @@ -43,7 +43,6 @@ tests: value: "A test value" - it: check customList test value is not set by default - template: deployment.yaml asserts: - notContains: path: spec.template.spec.containers[0].env @@ -52,7 +51,6 @@ tests: value: "A test value" - it: should have processor configuration - template: deployment.yaml set: ozgcloud: environment: dev diff --git a/src/test/helm/deployment_grpc_info_manager_address_test.yaml b/src/test/helm/deployment_grpc_info_manager_address_test.yaml index 11542072c3ac471655983e96221d368c677d49aa..763578ba556ba1c456cdfa7f9d5969b818d13119 100644 --- a/src/test/helm/deployment_grpc_info_manager_address_test.yaml +++ b/src/test/helm/deployment_grpc_info_manager_address_test.yaml @@ -35,6 +35,7 @@ tests: environment: dev infoManager: address: https://info-manager.my-wonderful-domain.local:9000 + imagePullSecret: test-image-pull-secret asserts: - contains: path: spec.template.spec.containers[0].env diff --git a/src/test/helm/deployment_grpc_user_manager_address_test.yaml b/src/test/helm/deployment_grpc_user_manager_address_test.yaml index 016fca501d0c9a9a91b0634e9e0a15f42bb214c5..1e31f050c93476fd389121baed48304cd9b58747 100644 --- a/src/test/helm/deployment_grpc_user_manager_address_test.yaml +++ b/src/test/helm/deployment_grpc_user_manager_address_test.yaml @@ -31,10 +31,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: should set the grpc user-manager client address - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env @@ -42,8 +41,6 @@ tests: name: grpc_client_user-manager_address value: user-manager.sh-helm-test:9000 - it: should contain default user-manager grpc negotiationType tls - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env @@ -51,8 +48,6 @@ tests: name: grpc_client_user-manager_negotiationType value: TLS - it: should contain user-manager grpc negotiationType plaintext - templates: - - templates/deployment.yaml set: userManager.grpcClientNegotiationType: PLAINTEXT asserts: diff --git a/src/test/helm/deployment_host_aliases_test.yaml b/src/test/helm/deployment_host_aliases_test.yaml index 9f0fc25fe2aacb237130c90425a8e6c4a363bef3..549c387c725ba385235a1a6389da8d67a4e22520 100644 --- a/src/test/helm/deployment_host_aliases_test.yaml +++ b/src/test/helm/deployment_host_aliases_test.yaml @@ -31,6 +31,7 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: should not set hostAliases asserts: diff --git a/src/test/helm/deployment_imagepull_secret_test.yaml b/src/test/helm/deployment_imagepull_secret_test.yaml index 8d096eeba8850f1616715c79b58e2845ca64b465..a509da8e68281789a9454d33c4c5e018a63698b4 100644 --- a/src/test/helm/deployment_imagepull_secret_test.yaml +++ b/src/test/helm/deployment_imagepull_secret_test.yaml @@ -22,7 +22,7 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test deployment +suite: test deployment image pull secret release: name: vorgang-manager namespace: sh-helm-test @@ -32,19 +32,14 @@ set: ozgcloud: environment: dev tests: - - it: should use default imagePull secret - asserts: - - isKind: - of: Deployment - - equal: - path: spec.template.spec.imagePullSecrets[0].name - value: vorgang-manager-image-pull-secret - it: should set the imagePull secret set: imagePullSecret: image-pull-secret asserts: - - isKind: - of: Deployment - equal: path: spec.template.spec.imagePullSecrets[0].name - value: image-pull-secret \ No newline at end of file + value: image-pull-secret + - it: should fail if the imagePull secret not set + asserts: + - failedTemplate: + errorMessage: imagePullSecret must be set \ No newline at end of file diff --git a/src/test/helm/deployment_liveness_probe_test.yaml b/src/test/helm/deployment_liveness_probe_test.yaml index 82db783bcdb7deece5d0a346b2675305fce48582..6eb925f2db9adf6854a03cded85538fccb066d1f 100644 --- a/src/test/helm/deployment_liveness_probe_test.yaml +++ b/src/test/helm/deployment_liveness_probe_test.yaml @@ -31,15 +31,14 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: livenessProbe should be disabled by default - template: deployment.yaml asserts: - notExists: path: spec.template.spec.containers[0].livenessProbe - it: enable livenessProbe - template: deployment.yaml set: enableLivenessProbe: true asserts: @@ -54,3 +53,8 @@ tests: periodSeconds: 10 successThreshold: 1 timeoutSeconds: 3 + - it: not enable livenessProbe by default + asserts: + - isNull: + path: spec.template.spec.containers[0].livenessProbe + \ No newline at end of file diff --git a/src/test/helm/deployment_mongodb_test.yaml b/src/test/helm/deployment_mongodb_test.yaml index a36f2926e9496cd4b539ecf69a13494f549fb842..f63e3bb80bfce479451601935979dab04a63975d 100644 --- a/src/test/helm/deployment_mongodb_test.yaml +++ b/src/test/helm/deployment_mongodb_test.yaml @@ -28,9 +28,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check mongodb default env - template: deployment.yaml release: name: vorgang-manager asserts: @@ -57,7 +57,6 @@ tests: optional: true - it: check external mongodb - template: deployment.yaml release: name: vorgang-manager set: @@ -81,7 +80,7 @@ tests: name: vorgang-manager-database-spring - it: check mongodb set secretname - template: deployment.yaml + release: name: vorgang-manager set: @@ -102,8 +101,7 @@ tests: name: spring_data_mongodb_database value: vorgang-manager-database - - it: check mongodb root ca mount - template: deployment.yaml + - it: check mongodb root ca mount release: name: vorgang-manager asserts: @@ -123,7 +121,6 @@ tests: optional: true - it: check mongodb tls set tls cert name - template: deployment.yaml release: name: vorgang-manager set: diff --git a/src/test/helm/deployment_nachrichten_manager_address_test.yaml b/src/test/helm/deployment_nachrichten_manager_address_test.yaml index 4a8132270e6156ad9cd5e88762b056e44b8b417c..df50cbe8a66fdf4b2509a757ef468012499e0392 100644 --- a/src/test/helm/deployment_nachrichten_manager_address_test.yaml +++ b/src/test/helm/deployment_nachrichten_manager_address_test.yaml @@ -22,7 +22,7 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test environments +suite: test environments nachrichten-manager_url release: name: vorgang-manager namespace: sh-helm-test @@ -31,10 +31,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check if nachrichten-manager address is correct - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env diff --git a/src/test/helm/deployment_pod_default_spec_values_test.yaml b/src/test/helm/deployment_pod_default_spec_values_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..42f5e0771bff080656d567edd16939ab9a99c79a --- /dev/null +++ b/src/test/helm/deployment_pod_default_spec_values_test.yaml @@ -0,0 +1,65 @@ + # +# Copyright (C) 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. +# + +suite: test deployment container basics +release: + name: vorgang-manager + namespace: sh-helm-test +templates: + - templates/deployment.yaml +set: + ozgcloud: + environment: dev + imagePullSecret: test-image-pull-secret +tests: + - it: should have correct pod template values + asserts: + - isEmpty: + path: spec.template.spec.dnsConfig + - equal: + path: spec.template.spec.dnsPolicy + value: "ClusterFirst" + - equal: + path: spec.template.spec.restartPolicy + value: "Always" + - equal: + path: spec.template.spec.schedulerName + value: "default-scheduler" + - equal: + path: spec.template.spec.terminationGracePeriodSeconds + value: 30 + - it: should have correct values for container terminationMessagePolicy, terminationMessagePath, stdin, tty + asserts: + - equal: + path: spec.template.spec.containers[0].terminationMessagePolicy + value: File + - equal: + path: spec.template.spec.containers[0].terminationMessagePath + value: /dev/termination-log + - equal: + path: spec.template.spec.containers[0].stdin + value: true + - equal: + path: spec.template.spec.containers[0].tty + value: true \ No newline at end of file diff --git a/src/test/helm/deployment_rabbitmq_test.yaml b/src/test/helm/deployment_rabbitmq_env_test.yaml similarity index 97% rename from src/test/helm/deployment_rabbitmq_test.yaml rename to src/test/helm/deployment_rabbitmq_env_test.yaml index 24dc0338a27d155572f8da42cf8f8e926f0558fb..3adaadfd0c5356fca70a79477c7dfd801751512b 100644 --- a/src/test/helm/deployment_rabbitmq_test.yaml +++ b/src/test/helm/deployment_rabbitmq_env_test.yaml @@ -28,9 +28,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check rabbitmq spring env - template: deployment.yaml set: rabbitmq.enabled: true asserts: @@ -53,7 +53,6 @@ tests: key: password optional: false - it: check rabbitmq spring env is not set by default - template: deployment.yaml asserts: - notContains: path: spec.template.spec.containers[0].env @@ -74,7 +73,6 @@ tests: key: password optional: false - it: check rabbitmq spring env is not set - template: deployment.yaml set: rabbitmq.enabled: false asserts: diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml index b1eb74080c692af6ba87a46621f0d3f6d8d57473..7a545c8e7563e05cf5b7853bc87718f4b90c2240 100644 --- a/src/test/helm/deployment_resources_test.yaml +++ b/src/test/helm/deployment_resources_test.yaml @@ -22,7 +22,7 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test deployment +suite: test deployment resources release: name: vorgang-manager templates: @@ -30,9 +30,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: test resources - template: deployment.yaml set: resources: limits: @@ -54,8 +54,7 @@ tests: - equal: path: spec.template.spec.containers[0].resources.requests.memory value: 44Mi - - it: no resources defined - template: deployment.yaml + - it: no resources defined by default asserts: - isEmpty: path: spec.template.spec.containers[0].resources diff --git a/src/test/helm/deployment_service_account_test.yaml b/src/test/helm/deployment_service_account_test.yaml index 4d4f8a0b79bde3b86d0283792d82fe50c371fd3e..ad44c8d08f82196b65ff240d7db8bde467185be6 100644 --- a/src/test/helm/deployment_service_account_test.yaml +++ b/src/test/helm/deployment_service_account_test.yaml @@ -31,6 +31,7 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: should use service account with default name set: diff --git a/src/test/helm/deployment_springProfile_test.yaml b/src/test/helm/deployment_springProfile_env_test.yaml similarity index 84% rename from src/test/helm/deployment_springProfile_test.yaml rename to src/test/helm/deployment_springProfile_env_test.yaml index bc6e22a6779e1de00531a52f1ee232dfa3ba924e..7b24e13faf86d6f0adb38838aac3f548522724f3 100644 --- a/src/test/helm/deployment_springProfile_test.yaml +++ b/src/test/helm/deployment_springProfile_env_test.yaml @@ -30,20 +30,11 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - - it: is kind of Deployment - set: - env.overrideSpringProfiles: oc,stage,ea - templates: - - templates/deployment.yaml - asserts: - - isKind: - of: Deployment - it: should override spring profiles set: env.overrideSpringProfiles: oc,stage,ea - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env @@ -51,8 +42,6 @@ tests: name: spring_profiles_active value: oc,stage,ea - it: should generate spring profiles - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env diff --git a/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml b/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml index 501996d39001690d2e9788840e279ee30c6ba0c9..e39659efbe0ffbbcfca957884cca18d73810f6e4 100644 --- a/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml +++ b/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml @@ -31,15 +31,16 @@ templates: tests: - it: should fail on missing environment - template: deployment.yaml + set: + imagePullSecret: test-image-pull-secret asserts: - failedTemplate: errorMessage: ozgcloud.environment muss angegeben sein - - it: should not fail on missing environment - template: deployment.yaml + - it: should not fail on not missing environment and not missing imagepullsecret set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret asserts: - notFailedTemplate: {} diff --git a/src/test/helm/deployment_usermanager_url_test.yaml b/src/test/helm/deployment_usermanager_url_env_test.yaml similarity index 96% rename from src/test/helm/deployment_usermanager_url_test.yaml rename to src/test/helm/deployment_usermanager_url_env_test.yaml index 7d9e042f837d8def09f004944c2373188e85b87f..5a2ac4d9af36586647ccaa20b863a38a735ff3d5 100644 --- a/src/test/helm/deployment_usermanager_url_test.yaml +++ b/src/test/helm/deployment_usermanager_url_env_test.yaml @@ -31,10 +31,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check if user-manager url is correct - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env diff --git a/src/test/helm/deployment_zufimanager_address_test.yaml b/src/test/helm/deployment_zufimanager_address_env_test.yaml similarity index 96% rename from src/test/helm/deployment_zufimanager_address_test.yaml rename to src/test/helm/deployment_zufimanager_address_env_test.yaml index 3e506705ef32fa97a11aad0fa64350c2ae317bec..4771f72d053c23395bf8a67afb2684241875cd71 100644 --- a/src/test/helm/deployment_zufimanager_address_test.yaml +++ b/src/test/helm/deployment_zufimanager_address_env_test.yaml @@ -31,10 +31,9 @@ templates: set: ozgcloud: environment: dev + imagePullSecret: test-image-pull-secret tests: - it: check if zufi-manager address is correct - templates: - - templates/deployment.yaml asserts: - contains: path: spec.template.spec.containers[0].env diff --git a/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml b/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..76331e120081a0f27ce4b20a88ecb4d007ce3635 --- /dev/null +++ b/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml @@ -0,0 +1,75 @@ +# +# Copyright (C) 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. +# + +suite: test deployment general values +release: + name: vorgang-manager + namespace: sh-helm-test +templates: + - templates/deployment.yaml +set: + ozgcloud: + environment: dev + imagePullSecret: test-image-pull-secret + +tests: + - it: should have correct apiVersion + asserts: + - isKind: + of: Deployment + - isAPIVersion: + of: "apps/v1" + + - it: should have correct deployment metadata + asserts: + - equal: + path: metadata.name + value: vorgang-manager + - equal: + path: metadata.namespace + value: sh-helm-test + + + - it: should have correct deyployment general spec values + asserts: + - equal: + path: spec.progressDeadlineSeconds + value: 600 + - equal: + path: spec.replicas + value: 2 + - equal: + path: spec.revisionHistoryLimit + value: 10 + - it: should have correct deployment spec strategy values + asserts: + - equal: + path: spec.strategy + value: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + + diff --git a/src/test/helm/elasticsearch_cr_test.yaml b/src/test/helm/elasticsearch_cr_test.yaml index 59674fb8b925276d9ddbc32bd86ea673f569c057..068c1fd7c0170efcac8d73fdba88fc0440a1e7f9 100644 --- a/src/test/helm/elasticsearch_cr_test.yaml +++ b/src/test/helm/elasticsearch_cr_test.yaml @@ -12,13 +12,15 @@ tests: asserts: - isAPIVersion: of: operator.ozgcloud.de/v1 - - it: should contain kind + - it: should contain basic info set: elasticsearch: enabled: true asserts: - isKind: of: OzgCloudElasticsearch + - isAPIVersion: + of: operator.ozgcloud.de/v1 - it: should have metadata name set: elasticsearch: @@ -41,6 +43,7 @@ tests: set: elasticsearch: enabled: true + disableOzgCloudOperator: false asserts: - hasDocuments: count: 1 @@ -49,4 +52,14 @@ tests: asserts: - hasDocuments: count: 0 - documentIndex: 0 \ No newline at end of file + documentIndex: 0 + - it: should NOT create cr if disableOzgCloudOperator true + set: + elasticsearch: + enabled: true + disableOzgCloudOperator: true + asserts: + - hasDocuments: + count: 0 + documentIndex: 0 + \ No newline at end of file diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml index 16661a34b0b43473c82029e7496f2867220dd785..ac7df6574a59eae14b64a88872f8f37a182dfa89 100644 --- a/src/test/helm/network_policy_test.yaml +++ b/src/test/helm/network_policy_test.yaml @@ -253,39 +253,78 @@ tests: matchLabels: component: client2 - - it: add egress rules by values + - it: should add additionalIngressConfig set: networkPolicy: + dnsServerNamespace: test-namespace-dns + additionalIngressConfig: + - from: + - podSelector: + matchLabels: + additionalIngressConfig: yes + asserts: + - contains: + path: spec.ingress + content: + from: + - podSelector: + matchLabels: + additionalIngressConfig: yes + + - it: should add additionalEgressConfig + set: + networkPolicy: + dnsServerNamespace: test-namespace-dns additionalEgressConfig: - - to: - - ipBlock: - cidr: 1.2.3.4/32 - to: - podSelector: matchLabels: - component: ozg-testservice - ports: - - port: 12345 - protocol: TCP - - dnsServerNamespace: test-dns-namespace + additionalEgressConfig: yes asserts: - contains: path: spec.egress content: to: - - ipBlock: - cidr: 1.2.3.4/32 + - podSelector: + matchLabels: + additionalEgressConfig: yes + + + - it: should add additionalIngressConfigNamespace + set: + networkPolicy: + dnsServerNamespace: test-namespace-dns + additionalIngressConfigNamespace: + - from: + - podSelector: + matchLabels: + additionalIngressConfigNamespace: yes + asserts: + - contains: + path: spec.ingress + content: + from: + - podSelector: + matchLabels: + additionalIngressConfigNamespace: yes + + - it: should add additionalEgressConfigNamespace + set: + networkPolicy: + dnsServerNamespace: test-dns-namespace + additionalEgressConfigNamespace: + - to: + - podSelector: + matchLabels: + additionalEgressConfigNamespace: yes + asserts: - contains: path: spec.egress content: to: - podSelector: matchLabels: - component: ozg-testservice - ports: - - port: 12345 - protocol: TCP + additionalEgressConfigNamespace: yes - it: test network policy disabled set: diff --git a/src/test/helm/image_pull_secret_test.yaml b/src/test/helm/ozgcloud_proxyapi_secret_test.yaml similarity index 62% rename from src/test/helm/image_pull_secret_test.yaml rename to src/test/helm/ozgcloud_proxyapi_secret_test.yaml index 2d4aa120dfbd26bf3348cca913c6d53a34e44192..bfc35606b3bddf13b93662723d0a339d2b316f34 100644 --- a/src/test/helm/image_pull_secret_test.yaml +++ b/src/test/helm/ozgcloud_proxyapi_secret_test.yaml @@ -22,38 +22,45 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test image pull secret -templates: - - templates/image-pull-secret.yaml +suite: test secret ozgcloudProxyApi release: name: vorgang-manager - namespace: helm-test + namespace: sh-helm-test +templates: + - templates/secret_ozgcloud_proxyapi.yaml tests: - - it: should match basic data + - it: test metadata set: - imageCredentials: - registry: docker.ozg-sh.de - username: test - password: test1234 - email: webmaster@ozg-sh.de + ozgcloudProxyApi.apikey: api-key asserts: - - hasDocuments: - count: 1 - - containsDocument: - kind: Secret - apiVersion: v1 + - isKind: + of: Secret + - isAPIVersion: + of: v1 - equal: path: metadata.name - value: vorgang-manager-image-pull-secret + value: vorgang-manager-ozgcloud-proxyapi - equal: path: metadata.namespace - value: helm-test - - isNotNullOrEmpty: - path: data[".dockerconfigjson"] - - - it: should not create image pull secret + value: sh-helm-test + - it: test secret type set: - imagePullSecret: "image-pull-secret" + ozgcloudProxyApi.apikey: api-key + asserts: + - equal: + path: type + value: Opaque + - it: should not create secret by default asserts: - hasDocuments: - count: 0 \ No newline at end of file + count: 0 + + - it: should have data + set: + ozgcloudProxyApi.apikey: api-key + asserts: + - isNotEmpty: + path: data.ozgcloud_osi_postfach_proxyapi_key + + + diff --git a/src/test/helm/rabbitmq_exchange_test.yaml b/src/test/helm/rabbitmq_exchange_test.yaml index 8a8d0db7acd22d6b2e72b7730c4f9f3f5e825f1e..ca967c1df86550d4ae4da0deb6f490299cc1b866 100644 --- a/src/test/helm/rabbitmq_exchange_test.yaml +++ b/src/test/helm/rabbitmq_exchange_test.yaml @@ -35,18 +35,28 @@ tests: asserts: - isKind: of: Exchange + - isAPIVersion: + of: rabbitmq.com/v1beta1 - equal: path: metadata.name value: sh-helm-test - - it: test if spec name like namespace + - equal: + path: metadata.namespace + value: sh-helm-test + - it: should have correct spec set: rabbitmq.enabled: true asserts: - - isKind: - of: Exchange - equal: - path: spec.name - value: sh-helm-test-exchange + path: spec + value: + name: sh-helm-test-exchange + type: direct + autoDelete: false + durable: true + rabbitmqClusterReference: + name: ozg-mq-cluster + namespace: rabbitmq-system - it: should not create rabbitmq exchange set: rabbitmq.enabled: false diff --git a/src/test/helm/rabbitmq_permissions_test.yaml b/src/test/helm/rabbitmq_permissions_test.yaml index b680ac19caa9e22f859334ff4cd08a27ee7f12af..155d4d0b9e2481be7654ee6e2a973273a63c71f2 100644 --- a/src/test/helm/rabbitmq_permissions_test.yaml +++ b/src/test/helm/rabbitmq_permissions_test.yaml @@ -35,29 +35,32 @@ tests: asserts: - isKind: of: Permission + - isAPIVersion: + of: rabbitmq.com/v1beta1 - equal: - path: spec.user + path: metadata.name value: sh-helm-test - - it: test specs write permissions - set: - rabbitmq.enabled: true - rabbitmq.cluster.name: rabbit-test - rabbitmq.cluster.namespace: rabbit-test-ns - asserts: - - isKind: - of: Permission - equal: - path: spec.permissions.write - value: "sh-helm-test-.*" - - it: test specs read permissions + path: metadata.namespace + value: sh-helm-test + - it: should have correct spec set: rabbitmq.enabled: true asserts: - - isKind: - of: Permission - equal: - path: spec.permissions.read - value: "sh-helm-test-.*" + path: spec + value: + vhost: "/" + user: "sh-helm-test" + permissions: + write: "sh-helm-test-.*" + configure: ".*" + read: "sh-helm-test-.*" + rabbitmqClusterReference: + name: ozg-mq-cluster + namespace: rabbitmq-system + + - it: should not create rabbitmq permission set: rabbitmq.enabled: false diff --git a/src/test/helm/rabbitmq_queue_test.yaml b/src/test/helm/rabbitmq_queue_test.yaml index 684814c49727b442295925fecd63841a6ccf8edf..b1f486a1096af207c78388bb4a2ef36eda38fe47 100644 --- a/src/test/helm/rabbitmq_queue_test.yaml +++ b/src/test/helm/rabbitmq_queue_test.yaml @@ -35,9 +35,14 @@ tests: asserts: - isKind: of: Queue + - isAPIVersion: + of: rabbitmq.com/v1beta1 - equal: path: metadata.name value: sh-helm-test + - equal: + path: metadata.namespace + value: sh-helm-test - it: should not create rabbitmq queue set: rabbitmq.enabled: false @@ -47,4 +52,28 @@ tests: - it: should not create rabbitmq queue by default asserts: - hasDocuments: - count: 0 \ No newline at end of file + count: 0 + - it: should have rabbitmq credentials and clusterReference info when enabled + set: + rabbitmq.enabled: true + asserts: + - equal: + path: spec.name + value: sh-helm-test-queue + - equal: + path: spec.vhost + value: "/" + - equal: + path: spec.type + value: quorum + - equal: + path: spec.autoDelete + value: false + - equal: + path: spec.durable + value: true + - equal: + path: spec.rabbitmqClusterReference + value: + name: ozg-mq-cluster + namespace: rabbitmq-system \ No newline at end of file diff --git a/src/test/helm/rabbitmq_secret_test.yaml b/src/test/helm/rabbitmq_secret_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fc8fc6889b00b3e173b4dd493624ce6e740ac23e --- /dev/null +++ b/src/test/helm/rabbitmq_secret_test.yaml @@ -0,0 +1,79 @@ +# +# Copyright (C) 2022 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. +# + +suite: test rabbitmq secret +release: + name: vorgang-manager + namespace: sh-helm-test +templates: + - templates/rabbitmq_secret.yaml +tests: + - it: test metadata + set: + rabbitmq.enabled: true + asserts: + - isKind: + of: Secret + - isAPIVersion: + of: v1 + - equal: + path: metadata.name + value: rabbitmq-credentials + - equal: + path: metadata.namespace + value: sh-helm-test + - equal: + path: metadata.annotations + value: + "helm.sh/resource-policy": "keep" + - it: test secret type + set: + rabbitmq.enabled: true + asserts: + - equal: + path: type + value: Opaque + - it: should not create rabbitmq secret + set: + rabbitmq.enabled: false + asserts: + - hasDocuments: + count: 0 + - it: should not create rabbitmq secret by default + set: + ozgcloud.environment: test + asserts: + - hasDocuments: + count: 0 + + - it: should have stringData + set: + rabbitmq.enabled: true + asserts: + - isNotEmpty: + path: stringData.password + - isNotEmpty: + path: stringData.username + + diff --git a/src/test/helm/rabbitmq_user_test.yaml b/src/test/helm/rabbitmq_user_test.yaml index e05eb4ddbb45c744ba2aaeb82904c3e4542e17ee..35d940f7733e5516047117adaba1e619f0ee5b3b 100644 --- a/src/test/helm/rabbitmq_user_test.yaml +++ b/src/test/helm/rabbitmq_user_test.yaml @@ -35,9 +35,14 @@ tests: asserts: - isKind: of: User + - isAPIVersion: + of: rabbitmq.com/v1beta1 - equal: path: metadata.name value: sh-helm-test + - equal: + path: metadata.namespace + value: sh-helm-test - it: should not create rabbitmq user set: rabbitmq.enabled: false @@ -49,4 +54,18 @@ tests: ozgcloud.environment: test asserts: - hasDocuments: - count: 0 \ No newline at end of file + count: 0 + - it: should have rabbitmq credentials and clusterReference info when enabled + set: + rabbitmq.enabled: true + asserts: + - equal: + path: spec.importCredentialsSecret + value: + name: rabbitmq-credentials + - equal: + path: spec.rabbitmqClusterReference.name + value: ozg-mq-cluster + - equal: + path: spec.rabbitmqClusterReference.namespace + value: rabbitmq-system \ No newline at end of file diff --git a/src/test/helm/service_account_test.yaml b/src/test/helm/service_account_test.yaml index e71aa0fc9379b68553987dbfe6128ef61f6d0326..0e312737a09f243ce1ea1bc4fc52a5162e139596 100644 --- a/src/test/helm/service_account_test.yaml +++ b/src/test/helm/service_account_test.yaml @@ -36,6 +36,8 @@ tests: asserts: - isKind: of: ServiceAccount + - isAPIVersion: + of: v1 - equal: path: metadata.name value: vorgang-manager-service-account diff --git a/src/test/helm/service_monitor_test.yaml b/src/test/helm/service_monitor_test.yaml index 96f6e796d08698296662e02757263ff4276768ad..8d1a5caad68d8bc907e066a49b64ae20f4888623 100644 --- a/src/test/helm/service_monitor_test.yaml +++ b/src/test/helm/service_monitor_test.yaml @@ -29,13 +29,33 @@ release: templates: - templates/service_monitor.yaml tests: - - it: should have the label component with value vorgang-manager-service-monitor attached + - it: should have basic info asserts: - isKind: of: ServiceMonitor + - isAPIVersion: + of: monitoring.coreos.com/v1 - equal: - path: metadata.labels["component"] - value: vorgang-manager-service-monitor + path: metadata.name + value: vorgang-manager + - equal: + path: metadata.namespace + value: sh-helm-test + + - it: should contain default lables and component lables + asserts: + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: vorgang-manager + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vorgang-manager + app.kubernetes.io/namespace: sh-helm-test + app.kubernetes.io/part-of: ozgcloud + app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS + component: vorgang-manager-service-monitor + helm.sh/chart: vorgang-manager-0.0.0-MANAGED-BY-JENKINS + ozgcloud-mongodb-client: "true" - it: should be able to enable the endpoint asserts: - isKind: diff --git a/src/test/helm/service_test.yaml b/src/test/helm/service_test.yaml index 627df058bde17bd49836ffd528a740eb4af30030..6ffb004080c0a7fcf55888124ba95b37ea4d9fc6 100644 --- a/src/test/helm/service_test.yaml +++ b/src/test/helm/service_test.yaml @@ -22,20 +22,25 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test deployment +suite: test service release: name: vorgang-manager namespace: sh-helm-test templates: - templates/service.yaml tests: - - it: should have the label component with value vorgang-manager-service attached + - it: should have basic info asserts: - isKind: of: Service + - isAPIVersion: + of: v1 - equal: - path: metadata.labels.component - value: vorgang-manager-service + path: metadata.name + value: vorgang-manager + - equal: + path: metadata.namespace + value: sh-helm-test - it: should be of type ClusterIP asserts: - equal: @@ -74,4 +79,17 @@ tests: - equal: path: spec.selector["app.kubernetes.io/namespace"] value: sh-helm-test - \ No newline at end of file + - it: should contain default lables and component lables + asserts: + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: vorgang-manager + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vorgang-manager + app.kubernetes.io/namespace: sh-helm-test + app.kubernetes.io/part-of: ozgcloud + app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS + component: vorgang-manager-service + helm.sh/chart: vorgang-manager-0.0.0-MANAGED-BY-JENKINS + ozgcloud-mongodb-client: "true" \ No newline at end of file diff --git a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java index ebaf64a7ee19ca6dcf71de91a13e9f2a011d408d..85ae1cb4e52af123e2e6092e61ec85b16acf3021 100644 --- a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java +++ b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/VorgangManagerServerApplication.java @@ -28,8 +28,8 @@ import java.util.TimeZone; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.boot.task.TaskExecutorBuilder; -import org.springframework.boot.task.TaskExecutorCustomizer; +import org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; +import org.springframework.boot.task.ThreadPoolTaskExecutorCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.Primary; @@ -60,19 +60,19 @@ public class VorgangManagerServerApplication { } @Bean - TaskExecutorCustomizer addSecurityContextCustomizer() { + ThreadPoolTaskExecutorCustomizer addSecurityContextCustomizer() { return customizer -> customizer.setTaskDecorator(DelegatingSecurityContextRunnable::new); } @Bean - TaskExecutorCustomizer setThreadName() { + ThreadPoolTaskExecutorCustomizer setThreadName() { return customizer -> customizer.setThreadNamePrefix("ozgtask-"); } @Bean("taskExecutor") @Primary - TaskExecutor taskExecutor(TaskExecutorBuilder builder) { + TaskExecutor taskExecutor(ThreadPoolTaskExecutorBuilder builder) { return builder.build(); } diff --git a/vorgang-manager-interface/src/main/protobuf/document.model.proto b/vorgang-manager-interface/src/main/protobuf/document.model.proto new file mode 100644 index 0000000000000000000000000000000000000000..ff0025a2197b3ba328547cd595f741ea95852310 --- /dev/null +++ b/vorgang-manager-interface/src/main/protobuf/document.model.proto @@ -0,0 +1,46 @@ +/* + * Copyright (C) 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. + */ + syntax = "proto3"; + + package de.ozgcloud.document; + + option java_multiple_files = true; + option java_package = "de.ozgcloud.document"; + option java_outer_classname = "DocumentModelProto"; + +message GrpcGetDocumentRequest { + string id = 1; +} + +message GrpcGetDocumentResponse { + GrpcDocument document = 1; +} + +message GrpcDocument { + string id = 1; + string type = 2; + string fileId = 3; + string nachrichtSubject = 4; + string nachrichtText = 5; +} \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/document.proto b/vorgang-manager-interface/src/main/protobuf/document.proto new file mode 100644 index 0000000000000000000000000000000000000000..c2a903373b229e3461932fa15e50706a9e5b41af --- /dev/null +++ b/vorgang-manager-interface/src/main/protobuf/document.proto @@ -0,0 +1,36 @@ +/* + * Copyright (C) 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. + */ +syntax = "proto3"; + +package de.ozgcloud.document; + +import "document.model.proto"; + +option java_multiple_files = true; +option java_package = "de.ozgcloud.document"; +option java_outer_classname = "DocumentProto"; + +service DocumentService { + rpc GetDocument(GrpcGetDocumentRequest) returns (GrpcGetDocumentResponse) {} +} \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto b/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto index ace2dd7613c90a68b2d184c61926c77db9ea3eb9..7719beb188b32fd0fdec649061e9844c5b7119e6 100644 --- a/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto +++ b/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto @@ -113,6 +113,7 @@ message GrpcEingangHeader { message GrpcServiceKonto { string type = 1; repeated GrpcPostfachAddress postfachAddresses = 2; + string trustLevel = 3; } message GrpcPostfachAddress { diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index f6a78fc53972e0af85adda4f820c73badb54c46e..06f4f37af8f931a634649d52ed1213713bc83e4b 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -53,7 +53,7 @@ <zufi-manager-interface.version>1.0.0-SNAPSHOT</zufi-manager-interface.version> <user-manager-interface.version>2.1.0</user-manager-interface.version> - <bescheid-manager.version>1.9.0</bescheid-manager.version> + <bescheid-manager.version>1.10.0-SNAPSHOT</bescheid-manager.version> <processor-manager.version>0.3.0</processor-manager.version> <ozgcloud-starter.version>0.7.0-SNAPSHOT</ozgcloud-starter.version> diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevel.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevel.java new file mode 100644 index 0000000000000000000000000000000000000000..def17ea4fb35fadcfa7e7e9c9959304404a28239 --- /dev/null +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevel.java @@ -0,0 +1,39 @@ +package de.ozgcloud.vorgang.common.migration; + +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; + +import io.mongock.api.annotations.ChangeUnit; +import io.mongock.api.annotations.Execution; +import io.mongock.api.annotations.RollbackExecution; + +@ChangeUnit(id = "2024-04-02 17:15:00 OZG-4770", order = "M009", author = "ebardin", runAlways = true) +public class M009_SetServiceKontoTrustLevel { // NOSONAR + + private static final String VORGANG_COLLECTION = "vorgang"; + private static final String DEFAULT_TRUST_LEVEL = "STORK-QAA-Level-1"; + private static final String KEY_SERVICE_KONTO = "header.serviceKonto"; + private static final String KEY_TRUST_LEVEL = KEY_SERVICE_KONTO + ".trustLevel"; + + @Execution + public void doMigration(MongoOperations db) { + db.updateMulti(createFilterQuery(), createUpdate(), VORGANG_COLLECTION); + } + + Query createFilterQuery() { + var serviceKontoExistsCriteria = Criteria.where(KEY_SERVICE_KONTO).exists(true); + var trustLevelNotExistsCriteria = Criteria.where(KEY_TRUST_LEVEL).exists(false); + return new Query(new Criteria().andOperator(serviceKontoExistsCriteria, trustLevelNotExistsCriteria)); + } + + Update createUpdate() { + return new Update().set(KEY_TRUST_LEVEL, DEFAULT_TRUST_LEVEL); + } + + @RollbackExecution + public void rollback() { + // kein rollback implementiert + } +} \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java index d04f172061b55665adcdb7b4fa28df7d2e638cf1..f15d3ec01c853a64d85f299f846a1862c6557003 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/RenameUtil.java @@ -8,10 +8,14 @@ import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.core.query.UpdateDefinition; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) class RenameUtil { - private final static String SET_OPERATOR = "$set"; - private final static String REPLACE_ONE_OPERATOR = "$replaceOne"; + private static final String SET_OPERATOR = "$set"; + private static final String REPLACE_ONE_OPERATOR = "$replaceOne"; static final String CLIENT_KEY = "client"; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java index 1688f1232804f8e396504b8f1525dfb9e41119f3..1e314ce6d6217ffbe0010d97ab9a5b5abbc554d5 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/search/SearchIndexInitializer.java @@ -40,7 +40,6 @@ import lombok.extern.log4j.Log4j2; @Component @ConditionalOnProperty(prefix = "ozgcloud.elasticsearch", name = "address") @Profile("initSearchIndex") -@Async @Log4j2 public class SearchIndexInitializer implements ApplicationListener<ContextRefreshedEvent> { @Autowired @@ -52,6 +51,7 @@ public class SearchIndexInitializer implements ApplicationListener<ContextRefres @Autowired private ApplicationContext context; + @Async @Override public void onApplicationEvent(ContextRefreshedEvent event) { LOG.info("Start filling up index"); diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java index 413985f9f737f7747251e15d41bce5e90a5b9454..dc55642a887b0d8a453a10ead82e0fb7de5970c8 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java @@ -1,20 +1,45 @@ package de.ozgcloud.vorgang.servicekonto; import java.util.List; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; import lombok.Builder; import lombok.Getter; -import lombok.Setter; import lombok.Singular; +import lombok.extern.log4j.Log4j2; @Getter @Builder -@Setter +@Log4j2 public class ServiceKonto { public static final String OSI_IDENTIFIER = "OSI"; + private static final Set<String> EXPECTED_TRUST_LEVELS = Set.of("STORK-QAA-Level-1", "STORK-QAA-Level-2", "STORK-QAA-Level-3", + "STORK-QAA-Level-4"); private String type; + private String trustLevel; @Singular private List<PostfachAddress> postfachAddresses; + + static class ServiceKontoBuilder { + + public ServiceKontoBuilder trustLevel(String trustLevel) { + validateTrustLevel(trustLevel); + this.trustLevel = trustLevel; + return this; + } + + void validateTrustLevel(String trustLevel) { + if (StringUtils.isNotEmpty(trustLevel) && !EXPECTED_TRUST_LEVELS.contains(trustLevel)) { + logError(trustLevel); + } + } + + void logError(String trustLevelValue) { + LOG.error("Unexpected trust level: {}", trustLevelValue); + } + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..bdbcf04f6d8bb24fdfb319fdd45a57c0bcbf9835 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentEventListenerITCase.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 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.document; + +import static org.assertj.core.api.Assertions.*; +import static org.awaitility.Awaitility.*; +import static org.mockito.Mockito.*; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.test.annotation.DirtiesContext; + +import de.ozgcloud.apilib.common.command.grpc.CommandMapper; +import de.ozgcloud.bescheid.common.callcontext.CallContextUser; +import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; +import de.ozgcloud.command.Command; +import de.ozgcloud.command.CommandCreatedEvent; +import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; +import de.ozgcloud.vorgang.command.CommandTestFactory; + +@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = { + "grpc.server.inProcessName=test", + "grpc.server.port=-1", + "grpc.client.ozgcloud-command-manager.address=in-process:test", + "grpc.client.vorgang-manager.address=in-process:test" +}) +@DataITCase +@DirtiesContext +class DocumentEventListenerITCase { + + private static final String FILE_ID = "file-id"; + + @Autowired + private ApplicationEventPublisher eventPublisher; + @SpyBean + private DocumentEventListener eventListener; + @Autowired + private CommandMapper mapper; + @Autowired + private MongoOperations mongoOperations; + + @MockBean + private CurrentUserService currentUserService; + @Mock + private CallContextUser callContextUser; + + @Captor + private ArgumentCaptor<BescheidDocumentCreatedEvent> bescheidDocumentCreatedEventCaptor; + @Captor + private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor; + + @BeforeEach + void init() { + mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); + when(currentUserService.getUser()).thenReturn(callContextUser); + } + + @Test + void shouldCreateDocument() { + var bescheidItem = mongoOperations.save(createBescheidItem("DRAFT")); + var command = createCommand(bescheidItem.getId()); + + eventPublisher.publishEvent(new CommandCreatedEvent(command)); + + assertThat(loadBescheidDocument()).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID); + } + + @Test + void shouldFailWhenNoBescheidFound() { + var command = createCommand("non-existing-id"); + + eventPublisher.publishEvent(new CommandCreatedEvent(command)); + + await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> { + verify(eventListener, timeout(5000)).publishEvent(commandFailedEventCaptor.capture()); + assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId()); + }); + } + + @Test + void shouldFailWhenNotDraft() { + var bescheidItem = mongoOperations.save(createBescheidItem("BESCHEID")); + var command = createCommand(bescheidItem.getId()); + + eventPublisher.publishEvent(new CommandCreatedEvent(command)); + + await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> { + verify(eventListener, timeout(5000)).publishEvent(commandFailedEventCaptor.capture()); + assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId()); + }); + } + + private VorgangAttachedItem createBescheidItem(String status) { + return VorgangAttachedItemTestFactory.createBuilder().id(null).version(0) + .item(Map.of("status", status)) + .build(); + } + + private Map<String, Object> loadBescheidDocument() { + verify(eventListener, timeout(5000)).publishEvent(bescheidDocumentCreatedEventCaptor.capture()); + var bescheidDocumentId = bescheidDocumentCreatedEventCaptor.getValue().getCreatedResource(); + return mongoOperations.findById(bescheidDocumentId, VorgangAttachedItem.class).getItem(); + } + + private Command createCommand(String relationId) { + return CommandTestFactory.createBuilder() + .relationId(relationId) + .order(DocumentEventListener.CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER) + .bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID)) + .build(); + } +} \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..95720de7ca399b35508f54d47da2550cb858dadd --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 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.document; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Map; +import java.util.Optional; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.test.annotation.DirtiesContext; + +import de.ozgcloud.bescheid.common.callcontext.CallContextUser; +import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.document.DocumentServiceGrpc.DocumentServiceBlockingStub; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; +import io.grpc.StatusRuntimeException; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = { + "grpc.server.inProcessName=test", + "grpc.server.port=-1", + "grpc.client.vorgang-manager.address=in-process:test", + "grpc.client.inProcess.address=in-process:test", +}) +@DataITCase +@DirtiesContext +class DocumentGrpcServiceITCase { + + @GrpcClient("inProcess") + private DocumentServiceBlockingStub documentServiceStub; + + @Autowired + private MongoOperations mongoOperations; + + @MockBean + private CurrentUserService currentUserService; + @Mock + private CallContextUser callContextUser; + + @BeforeEach + void init() { + mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); + when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser)); + when(currentUserService.getUser()).thenReturn(callContextUser); + } + + @Test + void shouldGetDocument() { + var documentId = saveDocument(); + + var response = documentServiceStub.getDocument(GrpcGetDocumentRequest.newBuilder().setId(documentId).build()); + + assertThat(response.hasDocument()).isTrue(); + } + + @Test + void shouldThrowExceptionWhenDocumentNotFound() { + saveDocument(); + var request = GrpcGetDocumentRequest.newBuilder().setId("not-found").build(); + + Assertions.assertThrows(StatusRuntimeException.class, () -> documentServiceStub.getDocument(request)); + } + + private String saveDocument() { + var document = VorgangAttachedItemTestFactory.createBuilder() + .id(null) + .version(0) + .itemName(DocumentService.DOCUMENT_ITEM_NAME) + .item(Map.of( + Document.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE, + Document.FIELD_DOCUMENT_FILE, "file-id", + Document.FIELD_NACHRICHT_TEXT, "nachricht-text", + Document.FIELD_NACHRICHT_SUBJECT, "nachricht-subject")) + .build(); + return mongoOperations.save(document, VorgangAttachedItem.COLLECTION_NAME).getId(); + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java index 50e69e9d83be93729a9db83b85d1bbf25c33429e..055a48e234bab978031fcbfa3d91176df3c20640 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java @@ -50,6 +50,7 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.web.client.ExpectedCount; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; @@ -77,6 +78,7 @@ import io.grpc.stub.StreamObserver; }) @WithMockUser @DataITCase +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) class PostfachMailITCase { private static final String TEST_OSI_POSTFACH_URI = "http://localhost/ApiProxy/V1/Message"; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevelITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevelITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..1159d4bb164efd9f92d8c0e10ddb204b98df726e --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M009_SetServiceKontoTrustLevelITCase.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 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.vorgang.common.migration; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.bson.Document; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; + +import de.ozgcloud.common.test.DataITCase; + +@DataITCase +class M009_SetServiceKontoTrustLevelITCase { + + private static final String DEFAULT_TRUST_LEVEL = "STORK-QAA-Level-1"; + private static final String FIELD_HEADER = "header"; + private static final String FIELD_SERVICE_KONTO = "serviceKonto"; + private static final String FIELD_TRUST_LEVEL = "trustLevel"; + private static final String FIELD_DUMMY_KEY = "HEADER_FIELD"; + private static final String DUMMY_VALUE = "HEADER_VALUE"; + + @Spy + private M009_SetServiceKontoTrustLevel migration; + + @Autowired + private MigrationDbTestUtils dbTestUtils; + @Autowired + private MongoTemplate template; + + @BeforeEach + void init() { + dbTestUtils.dropVorgangCollection(); + } + + @Test + void shouldSetTrustLevel() { + saveVorgangWithServiceKonto(); + + migration.doMigration(template); + + assertThat(getServiceKonto()).containsEntry(FIELD_TRUST_LEVEL, DEFAULT_TRUST_LEVEL); + } + + @Test + void shouldUpdateAllVorgangs() { + saveVorgangWithServiceKonto(); + saveVorgangWithServiceKonto(); + + migration.doMigration(template); + + assertThat(loadVorgangs()).hasSize(2); + loadVorgangs().forEach(vorgang -> assertThat(getServiceKonto(vorgang)).containsEntry(FIELD_TRUST_LEVEL, DEFAULT_TRUST_LEVEL)); + } + + @Test + void shouldSkipWhenTrustLevelExists() { + var expectedTrustLevel = "trust-level"; + saveVorgangWithServiceKonto(Map.of(FIELD_TRUST_LEVEL, expectedTrustLevel)); + + migration.doMigration(template); + + assertThat(getServiceKonto()).containsEntry(FIELD_TRUST_LEVEL, expectedTrustLevel); + } + + @Test + void shouldKeepOtherValues() { + saveVorgangWithServiceKonto(); + + migration.doMigration(template); + + assertThat(getServiceKonto()).containsEntry(FIELD_DUMMY_KEY, DUMMY_VALUE); + } + + @Test + void shouldNotMigrateIfNoServiceKonto() { + dbTestUtils.saveVorgang(new Document(Map.of("header", Map.of(FIELD_DUMMY_KEY, DUMMY_VALUE)))); + + migration.doMigration(template); + + assertThat(getServiceKonto()).isNull(); + } + + private void saveVorgangWithServiceKonto() { + saveVorgangWithServiceKonto(Collections.emptyMap()); + } + + private void saveVorgangWithServiceKonto(Map<String, String> serviceKontoValues) { + var serviceKonto = new Document(serviceKontoValues); + serviceKonto.append(FIELD_DUMMY_KEY, DUMMY_VALUE); + dbTestUtils.saveVorgang(new Document(Map.of(FIELD_HEADER, Map.of(FIELD_SERVICE_KONTO, serviceKonto)))); + } + + private Document getServiceKonto() { + var vorgangs = loadVorgangs(); + assertThat(vorgangs).hasSize(1); + return getServiceKonto(vorgangs.get(0)); + } + + private Document getServiceKonto(Document vorgang) { + return vorgang.get("header", Document.class).get("serviceKonto", Document.class); + } + + private List<Document> loadVorgangs() { + return dbTestUtils.findVorgang(new Query()); + } +} \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java index a394c99824ba082f6b54bd650baeac8e835dcc76..162064ab402e09dd8ee9b02117e36438032afbf1 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/GrpcServiceKontoTestFactory.java @@ -11,6 +11,7 @@ public class GrpcServiceKontoTestFactory { public static GrpcServiceKonto.Builder createBuilder() { return GrpcServiceKonto.newBuilder() .setType(ServiceKontoTestFactory.TYPE) + .setTrustLevel(ServiceKontoTestFactory.TRUST_LEVEL) .addPostfachAddresses(GrpcPostfachAddressTestFactory.create()); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..285fb8fbcbade9604a96da371652d3b44f91b4d0 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 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.vorgang.servicekonto; + +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; + +class ServiceKontoTest { + + @InjectMocks + private ServiceKonto serviceKonto; + + @Test + void shouldCallValidateTrustLevel() { + var builder = spy(ServiceKonto.builder()); + + builder.trustLevel(ServiceKontoTestFactory.TRUST_LEVEL); + + verify(builder).validateTrustLevel(ServiceKontoTestFactory.TRUST_LEVEL); + } + + @DisplayName("should validate trust level when") + @ParameterizedTest(name = "value is \"{0}\"") + @NullAndEmptySource + @ValueSource(strings = { "STORK-QAA-Level-1", "STORK-QAA-Level-2", "STORK-QAA-Level-3", "STORK-QAA-Level-4" }) + void shouldValidateTrustLevelWhen(String trustLevel) { + var builder = spy(ServiceKonto.builder()); + + builder.validateTrustLevel(trustLevel); + + verify(builder, never()).logError(trustLevel); + } + + @DisplayName("should log error when trust level is not expected") + @ParameterizedTest(name = "value is \"{0}\"") + @ValueSource(strings = { "trust-me", " " }) + void shouldLogErrorWhenTrustLevelIsNotExpected(String trustLevel) { + var builder = spy(ServiceKonto.builder()); + + builder.validateTrustLevel(trustLevel); + + verify(builder).logError(trustLevel); + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java index 7b5645ba07abacb17dd70a1d6873959b2a71f668..d8791679849d93ad70149a507d8d45299c593529 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/servicekonto/ServiceKontoTestFactory.java @@ -3,6 +3,7 @@ package de.ozgcloud.vorgang.servicekonto; public class ServiceKontoTestFactory { public final static String TYPE = "OSI"; + public final static String TRUST_LEVEL = "STORK-QAA-Level-1"; public static ServiceKonto create() { return createBuilder().build(); @@ -11,6 +12,7 @@ public class ServiceKontoTestFactory { public static ServiceKonto.ServiceKontoBuilder createBuilder() { return ServiceKonto.builder() .type(TYPE) + .trustLevel(TRUST_LEVEL) .postfachAddress(PostfachAddressTestFactory.create()); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java index 9e559153d6bc699f756f384bc2f9c39d84a2f68e..216eb98e9acdd32f73761e69c40c489ffc10a07c 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceTest.java @@ -158,6 +158,7 @@ class VorgangServiceTest { assertThat(vorgang.getHeader().getServiceKonto()).isNull(); } + } }