diff --git a/.gitignore b/.gitignore index 3fc1d884b983db7cd48581b4198239e70ebc5119..174f39620a3a67eaad565eae9eaff3b03614809e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ target/ .idea *.iml *.orig +.vscode/ diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 2181142a99ae6775e9d9dedcabe3e516e76c29ab..18496857ab75f33de8fb37f5f43600ed908b2201 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -5,24 +5,31 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.4.0-SNAPSHOT</version> + <version>4.5.0-SNAPSHOT</version> <relativePath /> </parent> <groupId>de.ozgcloud.bescheid</groupId> <artifactId>bescheid-manager</artifactId> <name>OZG-Cloud Bescheid Manager</name> - <version>1.18.0-SNAPSHOT</version> + <version>1.20.0-SNAPSHOT</version> <properties> - <vorgang-manager.version>2.15.0-SNAPSHOT</vorgang-manager.version> - <nachrichten-manager.version>2.12.0-PR-31-SNAPSHOT</nachrichten-manager.version> + <vorgang-manager.version>2.17.0-SNAPSHOT</vorgang-manager.version> + <nachrichten-manager.version>2.9.0</nachrichten-manager.version> + <nachrichten-manager.version>2.14.0-PR-31-SNAPSHOT</nachrichten-manager.version> + <document-manager.version>1.0.0-SNAPSHOT</document-manager.version> <api-lib.version>0.13.0-PR-31-SNAPSHOT</api-lib.version> <spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version> </properties> <dependencies> <!-- ozg-cloud --> + <dependency> + <groupId>de.ozgcloud.document</groupId> + <artifactId>document-manager-server</artifactId> + <version>${document-manager.version}</version> + </dependency> <dependency> <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-interface</artifactId> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java deleted file mode 100644 index 63f65d84733dae7ab98e63095234692c04f09dc7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java +++ /dev/null @@ -1,77 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.common.binaryfile.FileId; -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@Builder(toBuilder = true) -@Getter -public class Bescheid { - - public static final String FIELD_VORGANG_ID = "vorgangId"; - public static final String FIELD_CREATED_BY = "createdBy"; - - public static final String FIELD_BEWILLIGT = "bewilligt"; - public static final String FIELD_STATUS = "status"; - public static final String FIELD_BESCHEID_DOCUMENT = "bescheidDocument"; - public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm"; - public static final String FIELD_SEND_BY = "sendBy"; - - public static final String FIELD_NACHRICHT_TEXT = "nachrichtText"; - public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject"; - public static final String FIELD_ATTACHMENTS = "attachments"; - public static final String FIELD_SENT_INFO = "sentInfo"; - - private BescheidId id; - private long version; - - private VorgangId vorgangId; - private UserId createdBy; - - private boolean bewilligt; - private Status status; - private FileId bescheidDocument; - private LocalDate beschiedenAm; - private SendBy sendBy; - - private SentInfo sentInfo; - - @Builder.Default - private Optional<String> nachrichtSubject = Optional.empty(); - @Builder.Default - private Optional<String> nachrichtText = Optional.empty(); - - @Singular - private List<FileId> attachments; - - public enum Status { - DRAFT, SENT; - - public boolean not(Object value) { - return !hasValue(value); - } - - public boolean hasValue(Object value) { - return this.name().equalsIgnoreCase(String.valueOf(value)); - } - } - - public enum SendBy { - NACHRICHT, MANUAL; - - public boolean notValue(Object sendByValue) { - return !hasValue(sendByValue); - } - - public boolean hasValue(Object sendByValue) { - return this.name().equalsIgnoreCase(String.valueOf(sendByValue)); - } - - } -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java deleted file mode 100644 index c3e424ba83e903aee750e69067b037cd5a6e4875..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java +++ /dev/null @@ -1,61 +0,0 @@ -package de.ozgcloud.bescheid; - -import static de.ozgcloud.common.grpc.GrpcUtil.*; - -import java.util.UUID; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import io.grpc.CallOptions; -import io.grpc.Channel; -import io.grpc.ClientCall; -import io.grpc.ClientInterceptor; -import io.grpc.ForwardingClientCall.SimpleForwardingClientCall; -import io.grpc.Metadata; -import io.grpc.MethodDescriptor; - -@Component("bescheidCallContextInterceptor") -public class BescheidCallContextAttachingInterceptor implements ClientInterceptor { - - public static final String BESCHEID_MANAGER_CLIENT_NAME = "OzgCloud_BescheidManager"; - - @Autowired - private CurrentUserService userService; - - // <A> = Request, <B> = Response - @Override - public <A, B> ClientCall<A, B> interceptCall(MethodDescriptor<A, B> method, CallOptions callOptions, Channel next) { - return new CallContextAttachingClientCall<>(next.newCall(method, callOptions)); - } - - final class CallContextAttachingClientCall<A, B> extends SimpleForwardingClientCall<A, B> { - - protected CallContextAttachingClientCall(ClientCall<A, B> delegate) { - super(delegate); - } - - @Override - public void start(Listener<B> responseListener, Metadata headers) { - headers.merge(buildCallContextMetadata()); - super.start(responseListener, headers); - } - - private Metadata buildCallContextMetadata() { - var metadata = new Metadata(); - - userService.getUser().getUserId().ifPresent(userId -> metadata.put(HEADER_KEY_USER_ID, userId.getBytes())); - metadata.put(HEADER_KEY_CLIENT_NAME, BESCHEID_MANAGER_CLIENT_NAME.getBytes()); - metadata.put(HEADER_KEY_REQUEST_ID, generateRequestId().getBytes()); - - return metadata; - } - - // TODO requestId für command handling uebertragen / erstellen - private String generateRequestId() { - return UUID.randomUUID().toString(); - } - - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java deleted file mode 100644 index 237f07e8205b684d16980017556901a95034ec2f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -class BescheidCreatedEvent extends CommandExecutedEvent { - - public BescheidCreatedEvent(Command command) { - super(command.getId()); - } - - public BescheidCreatedEvent(Command command, String createdItemId) { - super(command, createdItemId); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java deleted file mode 100644 index dd8fc4c9c180a9bd7125415509125ad57ab830a0..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java +++ /dev/null @@ -1,34 +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.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -class BescheidDeletedEvent extends CommandExecutedEvent { - - public BescheidDeletedEvent(Command command) { - super(command); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java deleted file mode 100644 index 3beaadf3f4fd167bba8a29b34c613afe2348604c..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ /dev/null @@ -1,226 +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.bescheid; - -import static java.util.Objects.*; - -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Optional; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.stereotype.Component; - -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.binaryfile.BinaryFileService; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEvent; -import de.ozgcloud.command.CommandExecutedEvent; -import de.ozgcloud.command.CommandFailedEvent; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.BescheidDocumentCreatedEvent; -import de.ozgcloud.document.Document; -import de.ozgcloud.document.DocumentService; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -@RequiredArgsConstructor -class BescheidEventListener { - - public static final String CREATE_BESCHEID_ORDER = "CREATE_BESCHEID"; - public static final String DELETE_BESCHEID_ORDER = "DELETE_BESCHEID"; - public static final String UPDATE_BESCHEID_ORDER = "UPDATE_BESCHEID"; - public static final String CREATE_BESCHEID_DOCUMENT_ORDER = "CREATE_BESCHEID_DOCUMENT"; - public static final String SEND_BESCHEID_ORDER = "SEND_BESCHEID"; - - public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> CREATE_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_CREATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_DELETE_BESCHEID_COMMAND = command -> DELETE_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_DELETE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_DELETE_BESCHEID_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_UPDATE_BESCHEID_COMMAND = command -> UPDATE_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_UPDATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_UPDATE_BESCHEID_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_CREATE_BESCHEID_DOCUMENT_COMMAND = command -> CREATE_BESCHEID_DOCUMENT_ORDER.equals(command.getOrder()); - private static final String IS_CREATE_BESCHEID_DOCUMENT = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_DOCUMENT_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_SEND_BESCHEID_COMMAND = command -> nonNull(command) && SEND_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_SEND_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_SEND_BESCHEID_COMMAND.test(event.getSource())}"; - private static final String IS_SEND_BESCHEID_ORDER = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_SEND_BESCHEID_COMMAND.test(event.getCommand())}"; - - static final String VORGANG_ID_BODY_KEY = "vorgangId"; - static final String BESCHEID_VOM_BODY_KEY = "bescheidVom"; - static final String GENEHMIGT_BODY_KEY = "genehmigt"; - - private static final String LOG_MESSAGE_TEMPLATE = "{}. Command failed."; - private static final String ERROR_MESSAGE_TEMPLATE = "Error on executing %s Command."; - - private final BescheidService service; - private final BinaryFileService fileService; - private final AttachedItemService attachedItemService; - private final DocumentService documentService; - - private final ApplicationEventPublisher eventPublisher; - private final CurrentUserService userService; - private final UserProfileService userProfileService; - - @EventListener(condition = IS_CREATE_BESCHEID) - public void onCreateBescheidCommand(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doCreateBescheid); - } - - void doCreateBescheid(Command command) { - var createdItemId = service.createBescheidDraft(command); - eventPublisher.publishEvent(new BescheidCreatedEvent(command, createdItemId)); - } - - @EventListener(condition = IS_DELETE_BESCHEID) - public void onDeleteBescheid(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doDeleteBescheid); - } - - void doDeleteBescheid(Command command) { - attachedItemService.deleteBescheidDraft(command); - eventPublisher.publishEvent(new BescheidDeletedEvent(command)); - } - - @EventListener(condition = IS_UPDATE_BESCHEID) - public void onUpdateBescheidCommand(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doUpdateBescheid); - } - - void doUpdateBescheid(Command command) { - attachedItemService.updateBescheidDraft(command, getDocument(command)); - eventPublisher.publishEvent(new BescheidUpdatedEvent(command)); - } - - Optional<Document> getDocument(Command command) { - return Optional.ofNullable(MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT)) - .map(StringUtils::trimToNull) - .map(documentService::getDocument); - } - - @EventListener(condition = IS_CREATE_BESCHEID_DOCUMENT) - public void onCreatedBescheidDocument(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doCreateBescheidDocument); - } - - void doCreateBescheidDocument(Command command) { - var bescheid = doCreateBescheidBiz(command); - var bescheidDocument = documentService.createBescheidDocument(command, bescheid); - eventPublisher.publishEvent(new BescheidDocumentCreatedEvent(command, bescheidDocument)); - } - - BescheidResponse doCreateBescheidBiz(@NonNull Command command) { - var bescheid = service.createBescheid(createRequest(command)); - return fileService.uploadBescheidFile(bescheid); - } - - @EventListener(condition = IS_SEND_BESCHEID) - public void onSendBescheidCommand(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doSendBescheid); - } - - void doSendBescheid(Command command) { - var bescheidItem = attachedItemService.getItem(command.getRelationId()); - if (SendBy.MANUAL.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) { - service.sendBescheidManually(bescheidItem, command); - } else if (SendBy.NACHRICHT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) { - service.sendBescheidPostfachMail(bescheidItem, command); - } else { - throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Allowed values are %s." - .formatted(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY), - Arrays.stream(SendBy.values()).map(SendBy::name).collect(Collectors.joining(",")))); - } - eventPublisher.publishEvent(new BescheidSentEvent(command)); - } - - BescheidRequest createRequest(Command command) { - var eventBody = command.getBodyObject(); - var builder = BescheidRequest.builder(); - - builder.vorgangId(VorgangId.from(command.getVorgangId())); - Optional.ofNullable(MapUtils.getString(eventBody, BESCHEID_VOM_BODY_KEY)) - .map(LocalDate::parse).ifPresent(builder::bescheidVom); - Optional.ofNullable(MapUtils.getBoolean(eventBody, GENEHMIGT_BODY_KEY)) - .ifPresentOrElse(builder::genehmigt, () -> builder.genehmigt(true)); - builder.createFor(userProfileService.getUserProfile()); - - return builder.build(); - } - - @EventListener(condition = IS_SEND_BESCHEID_ORDER) - public void onBescheidSent(CommandExecutedEvent event) { - runWithSecurityContext(event.getCommand(), this::setAntragBewilligung); - } - - void setAntragBewilligung(Command command) { - service.setAntragBewilligung(attachedItemService.getItem(command.getRelationId())); - } - - void runWithSecurityContext(Command command, Consumer<Command> commandExecutor) { - SecurityContext prevContext = null; - try { - prevContext = userService.startSecurityContext(command); - commandExecutor.accept(command); - } catch (Exception e) { - var errorMessage = ERROR_MESSAGE_TEMPLATE.formatted(command.getOrder()); - LOG.error(LOG_MESSAGE_TEMPLATE, errorMessage, e); - eventPublisher.publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(errorMessage, e))); - } finally { - userService.resetSecurityContext(prevContext); - } - } - - private String buildErrorMessage(String message, Exception cause) { - try { - StringBuilder sb = new StringBuilder(message); - - if (StringUtils.isNotBlank(cause.getMessage())) { - sb.append(" Cause: ").append(cause.getMessage()); - } - - return sb.toString(); - } catch (Exception e2) { - LOG.error("Error in building Error Message (sick).", e2); - return message; - } - } - -} 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 a4636f96286f70d63b1edc7c45ea6d317744cc2f..81a7307914080aac3ab9599d2b6c20e38b168863 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java @@ -3,17 +3,25 @@ package de.ozgcloud.bescheid; import java.util.Optional; import java.util.stream.Stream; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceImplBase; -import de.ozgcloud.bescheid.vorgang.VorgangId; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.BescheidService; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.server.service.GrpcService; @GrpcService @RequiredArgsConstructor +@Deprecated +@Component("deprecatedBescheidGrpcService") class BescheidGrpcService extends BescheidServiceImplBase { private final BescheidService service; + @Qualifier("deprecatedBescheidMapper") private final BescheidMapper mapper; @Override diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java deleted file mode 100644 index 4c0f60434f23ebdc201ed906cdc5eb80f9a363cd..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.common.datatype.StringBasedValue; - -public class BescheidId extends StringBasedValue { - - BescheidId(String id) { - super(id); - } - - public static BescheidId from(String id) { - return new BescheidId(id); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java deleted file mode 100644 index 7fbeae993b492c3a8f0d891641640faac9958065..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java +++ /dev/null @@ -1,43 +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.bescheid; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class BescheidManagerConfig { - - private String version; - private String javaVersion; - private Features features; - - @Builder - @Getter - static class Features { - - private boolean canCreateBescheidDocument; - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java deleted file mode 100644 index 824f5ad0608057bec16dd5ef1d701fe481d9ff71..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java +++ /dev/null @@ -1,49 +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.bescheid; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService; -import de.ozgcloud.bescheid.common.callcontext.BescheidManagerCallContextProvider; -import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Configuration -public class BescheidManagerConfiguration { - - public static final String COMMAND_SERVICE_NAME = "bescheid_OzgCloudCommandService"; - - @GrpcClient("command-manager") - private CommandServiceGrpc.CommandServiceBlockingStub commandServiceStub; - - @Bean(COMMAND_SERVICE_NAME) - OzgCloudCommandService grpcOzgCloudCommandService(CommandMapper commandMapper, BescheidManagerCallContextProvider contextProvider) { - return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, contextProvider, - GrpcOzgCloudCommandService.DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java index 28d4be14a789e33ff2b5b301c70341ad80f0b560..7624432d0d5ca27ce50af9db638acd3ee045fd47 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java @@ -1,6 +1,6 @@ package de.ozgcloud.bescheid; -import static de.ozgcloud.bescheid.Bescheid.*; +import static de.ozgcloud.document.bescheid.Bescheid.*; import java.time.LocalDate; import java.util.Collection; @@ -13,6 +13,7 @@ import java.util.Optional; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.mapstruct.AnnotateWith; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -20,19 +21,29 @@ import org.mapstruct.NullValueCheckStrategy; import org.mapstruct.NullValuePropertyMappingStrategy; import org.mapstruct.ReportingPolicy; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.command.Command; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.common.datatype.StringBasedValue; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.Bescheid.SendBy; +import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.document.bescheid.BescheidId; +import de.ozgcloud.document.bescheid.BescheidManagerConfig; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.UserId; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; +import de.ozgcloud.document.common.attached_item.AttachedItem; +import de.ozgcloud.document.common.attached_item.AttachedItemService; @Mapper(uses = { SentInfoMapper.class }, // unmappedTargetPolicy = ReportingPolicy.WARN, // collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) // +@AnnotateWith(value = Component.class, elements = @AnnotateWith.Element(strings = "deprecatedBescheidMapper")) +@Deprecated public abstract class BescheidMapper { @Autowired diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java deleted file mode 100644 index 3110e878975886da00f8989e378afc465415f67c..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.bescheid.vorgang.Vorgang; - -public interface BescheidRemoteService { - - BescheidResponse create(BescheidRequest request, Vorgang vorgang); -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java deleted file mode 100644 index bd827b7b2f17effbf96c62304087fcf873925227..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.time.LocalDate; - -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class BescheidRequest { - - private VorgangId vorgangId; - - private LocalDate bescheidVom; - private boolean genehmigt; - - private UserProfile createFor; -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java deleted file mode 100644 index 234aec472536d4d2b549abda4606d2368f2bbd74..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.io.File; -import java.util.List; -import java.util.Optional; - -import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.common.binaryfile.FileId; -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -import lombok.With; - -@Builder(toBuilder = true) -@Getter -public class BescheidResponse { - - private VorgangId vorgangId; - - private boolean bewilligt; - private UserId createdBy; - - private String bescheidFileName; - private File bescheidFile; - @With - private FileId bescheidFileId; - private String contentType; - private long size; - - @Builder.Default - private Optional<String> nachrichtSubject = Optional.empty(); - @Builder.Default - private Optional<String> nachrichtText = Optional.empty(); - - @Singular - private List<FileId> attachments; - - private ServiceKonto serviceKonto; -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java deleted file mode 100644 index 8bfb22f6eec2e1cdee3bef6f7414dedfad82bd26..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java +++ /dev/null @@ -1,34 +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.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -public class BescheidSentEvent extends CommandExecutedEvent { - - public BescheidSentEvent(final Command command) { - super(command); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java deleted file mode 100644 index cd1d2fc2ccb45a29beedfc74b4d90b7ecc8d559f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java +++ /dev/null @@ -1,378 +0,0 @@ -package de.ozgcloud.bescheid; - -import static java.util.Objects.*; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import jakarta.annotation.PostConstruct; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.info.BuildProperties; -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.OzgCloudCreateSubCommandsRequest; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.administration.AdministrationService; -import de.ozgcloud.bescheid.attributes.ClientAttributeService; -import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangService; -import de.ozgcloud.command.Command; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.Document; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Service -@Log4j2 -@RequiredArgsConstructor -public class BescheidService { - - static final String DEFAULT_NACHRICHT_SUBJECT = "Ihr Bescheid zum Antrag"; - public static final String DEFAULT_NACHRICHT_TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; - public static final String KEY_TEMPLATE_SIGNATURE = "signature"; - - private static final String ERROR_MESSAGE_NO_SERVICE = "No Bescheid Endpoint is configured."; - - static final String VORGANG_BESCHEIDEN_ORDER = "VORGANG_BESCHEIDEN"; - static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL"; - static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; - - static final String FIELD_POSTFACH_ID = "postfachId"; - static final String FIELD_REPLY_OPTION = "replyOption"; - static final String REPLY_OPTION = "FORBIDDEN"; - static final String FIELD_SUBJECT = "subject"; - static final String FIELD_MAIL_BODY = "mailBody"; - static final String FIELD_ATTACHMENTS = "attachments"; - static final String SUBJECT = "Ihr Bescheid zum Antrag"; - - private final VorgangService vorgangService; - private final AttachedItemService attachedItemService; - private final UserProfileService userProfileService; - @Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME) - private final OzgCloudCommandService commandService; - private final AdministrationService administrationService; - - private final CommandMapper commandMapper; - private final ClientAttributeService bescheidClientAttributeService; - private final BuildProperties buildProperties; - private final Optional<BescheidRemoteService> remoteService; - private final BescheidMapper mapper; - - private final TemplateHandler templateHandler; - - @PostConstruct - void logStatus() { - remoteService.ifPresentOrElse( - service -> LOG.info("Bescheid-Manager is configured."), - () -> LOG.info("No BescheidRemoteService configured - Bescheid creation is not possible.")); - } - - public Optional<Bescheid> findDraft(String vorgangId) { - return attachedItemService.findBescheidItem(VorgangId.from(vorgangId)).map(mapper::mapFromAttachedItem); - } - - public Stream<Bescheid> findAll(VorgangId vorgangId) { - return attachedItemService.findAllBescheid(vorgangId).stream().map(mapper::mapFromAttachedItem); - } - - public String createBescheidDraft(Command createBescheidDraftCommand) { - validateBescheidData(createBescheidDraftCommand.getBodyObject()); - return attachedItemService.createBescheidDraft(buildBescheidDraft(createBescheidDraftCommand)); - } - - void validateBescheidData(Map<String, Object> bodyObject) { - validateBescheidField(bodyObject, Bescheid.FIELD_BESCHIEDEN_AM); - validateBescheidField(bodyObject, Bescheid.FIELD_BEWILLIGT); - validateSendBy(MapUtils.getString(bodyObject, Bescheid.FIELD_SEND_BY)); - } - - void validateBescheidField(Map<String, Object> bescheid, String field) { - if (isNull(bescheid.get(field))) { - throw new TechnicalException("Fields '%s' is required for bescheid creation".formatted(field)); - } - } - - void validateSendBy(String sendBy) { - if (isUnknownSendByValue(sendBy)) { - var possibleSendByValues = Arrays.stream(Bescheid.SendBy.values()).map(Bescheid.SendBy::name) - .collect(Collectors.joining(",")); - var message = String.format("Unexpected value for field '%s': %s. Allowed are: %s", Bescheid.FIELD_SEND_BY, sendBy, - possibleSendByValues); - throw new TechnicalException(message); - } - } - - private boolean isUnknownSendByValue(String sendByValue) { - return Arrays.stream(Bescheid.SendBy.values()).noneMatch(sendBy -> sendBy.hasValue(sendByValue)); - } - - Bescheid buildBescheidDraft(Command command) { - var bescheid = mapper.mapFromCommand(command); - var resultBuilder = bescheid.toBuilder().id(null).version(0).status(Bescheid.Status.DRAFT); - if (bescheid.getNachrichtSubject().isEmpty()) { - resultBuilder.nachrichtSubject(Optional.of(DEFAULT_NACHRICHT_SUBJECT)); - } - if (bescheid.getNachrichtText().isEmpty()) { - resultBuilder.nachrichtText(Optional.of(createNachrichtText())); - } - return resultBuilder.build(); - } - - String createNachrichtText() { - return templateHandler.fillTemplate(DEFAULT_NACHRICHT_TEMPLATE_FILE, getTemplateParameters()); - } - - Map<String, Object> getTemplateParameters() { - return administrationService.getNachrichtSignature().map(signature -> Map.<String, Object>of(KEY_TEMPLATE_SIGNATURE, signature)) - .orElseGet(Collections::emptyMap); - } - - public BescheidResponse createBescheid(BescheidRequest request) { - checkRemoteService(); - - return doCreateBescheid(request); - } - - private BescheidResponse doCreateBescheid(BescheidRequest request) { - var vorgang = vorgangService.getById(request.getVorgangId()); - return remoteService.map(service -> service.create(request, vorgang)) - .map(bescheid -> updateBescheid(bescheid, vorgang)) - .orElseThrow(() -> new TechnicalException(ERROR_MESSAGE_NO_SERVICE)); - } - - private BescheidResponse updateBescheid(BescheidResponse bescheid, Vorgang vorgang) { - return bescheid.toBuilder().vorgangId(vorgang.getId()).serviceKonto(vorgang.getServiceKonto()).build(); - } - - private void checkRemoteService() { - if (remoteService.isEmpty()) { - LOG.error(ERROR_MESSAGE_NO_SERVICE); - throw new TechnicalException(ERROR_MESSAGE_NO_SERVICE); - } - } - - public void sendBescheidManually(AttachedItem bescheidItem, Command parentCommand) { - validateBescheidSendManually(bescheidItem, parentCommand.getRelationVersion()); - var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - addSubCommands(parentCommand.getId(), buildSetBescheidSentSubCommands(bescheidItem, vorgang, getUserId())); - } - - void validateBescheidSendManually(AttachedItem bescheidItem, long version) { - validateBescheid(bescheidItem, version); - var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY); - if (Bescheid.SendBy.MANUAL.notValue(sendBy)) { - throw new TechnicalException( - "Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.MANUAL)); - } - } - - public void sendBescheidPostfachMail(AttachedItem bescheidItem, Command parentCommand) { - validateBescheidSendPostfach(bescheidItem, parentCommand.getRelationVersion()); - var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - var userId = getUserId(); - var subCommands = buildSetBescheidSentSubCommands(bescheidItem, vorgang, userId); - subCommands.add(buildSendPostfachNachrichtCommand(bescheidItem, vorgang.getServiceKonto(), userId)); - addSubCommands(parentCommand.getId(), subCommands); - } - - public void validateBescheidSendPostfach(AttachedItem bescheidItem, long version) { - validateBescheid(bescheidItem, version); - var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY); - if (Bescheid.SendBy.NACHRICHT.notValue(sendBy)) { - throw new TechnicalException( - "Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT)); - } - if (getNachrichtSubject(bescheidItem).isEmpty()) { - throw new TechnicalException("Bescheid has no nachricht subject"); - } - if (getNachrichtText(bescheidItem).isEmpty()) { - throw new TechnicalException("Bescheid has no nachricht text"); - } - } - - void validateBescheid(AttachedItem bescheidItem, long version) { - if (bescheidItem.getVersion() != version) { - throw new TechnicalException("Bescheid has different version. Expected: %d, but was: %d".formatted(version, bescheidItem.getVersion())); - } - var status = MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_STATUS); - if (Bescheid.Status.DRAFT.not(status)) { - throw new TechnicalException("Bescheid has status '%s'. Bescheid must have status DRAFT".formatted(status)); - } - if (StringUtils.isBlank(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT))) { - throw new TechnicalException("Bescheid has no document"); - } - } - - Optional<String> getNachrichtSubject(AttachedItem bescheidItem) { - return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT)) - .map(StringUtils::trimToNull); - } - - Optional<String> getNachrichtText(AttachedItem bescheidItem) { - return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT)) - .map(StringUtils::trimToNull); - } - - String getUserId() { - return userProfileService.getUserProfile().getId().toString(); - } - - List<OzgCloudCommand> buildSetBescheidSentSubCommands(AttachedItem bescheidItem, Vorgang vorgang, String userId) { - var subCommands = new ArrayList<OzgCloudCommand>(); - subCommands.add(buildVorgangBescheidenCommand(vorgang)); - subCommands.add(buildSetBescheidSentStatusCommand(bescheidItem, userId)); - return subCommands; - } - - OzgCloudCommand buildVorgangBescheidenCommand(Vorgang vorgang) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(vorgang.getId().toString())) - .relationId(commandMapper.mapRelationId(vorgang.getId().toString())) - .relationVersion(vorgang.getVersion()) - .order(VORGANG_BESCHEIDEN_ORDER) - .build(); - } - - OzgCloudCommand buildSetBescheidSentStatusCommand(AttachedItem bescheidItem, String userId) { - return OzgCloudCommand.builder() - .relationId(commandMapper.mapRelationId(bescheidItem.getId())) - .relationVersion(bescheidItem.getVersion()) - .order(AttachedItemService.PATCH_ATTACHED_ITEM) - .bodyObject(Map.of( - AttachedItem.PROPERTY_ID, bescheidItem.getId(), - AttachedItem.PROPERTY_ITEM, buildBescheidSentStatusItem(userId))) - .build(); - } - - Map<String, Object> buildBescheidSentStatusItem(String userId) { - return Map.of( - Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(), - Bescheid.FIELD_SENT_INFO, buildSentInfoMap(userId)); - } - - Map<String, Object> buildSentInfoMap(String userId) { - return Map.of( - SentInfo.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), - SentInfo.FIELD_SENT_BY, userId); - } - - OzgCloudCommand buildSendPostfachNachrichtCommand(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto, String userId) { - var bodyObject = buildSendNachrichtCommandBody(bescheidItem, buildPostfachAddress(serviceKonto.getPostfachAddresses().getFirst(), - serviceKonto.getType())); - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheidItem.getVorgangId())) - .order(SEND_POSTFACH_NACHRICHT_ORDER) - .createdBy(commandMapper.toOzgCloudUserId(userId)) - .bodyObject(bodyObject) - .build(); - } - - Map<String, Object> buildPostfachAddress(Vorgang.PostfachAddress postfachAddress, String serviceKontoType) { - return Map.of(Vorgang.PostfachAddress.FIELD_TYPE, postfachAddress.getType(), - Vorgang.PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(), - Vorgang.PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(), - Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, serviceKontoType); - } - - Map<String, Object> buildSendNachrichtCommandBody(AttachedItem bescheidItem, Map<String, Object> postfachAddress) { - return Map.of( - FIELD_REPLY_OPTION, REPLY_OPTION, - FIELD_SUBJECT, getNachrichtSubject(bescheidItem).orElse(SUBJECT), - FIELD_MAIL_BODY, getNachrichtText(bescheidItem).orElse(StringUtils.EMPTY), - FIELD_ATTACHMENTS, buildAttachments(bescheidItem), - Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress); - - } - - List<String> buildAttachments(AttachedItem bescheidItem) { - return Stream.concat(Stream.of(getBescheidFileId(bescheidItem)), getAttachments(bescheidItem).stream()).map(FileId::toString).toList(); - } - - FileId getBescheidFileId(AttachedItem bescheidItem) { - var bescheidDocument = attachedItemService.getItem(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT)); - return FileId.from(MapUtils.getString(bescheidDocument.getItem(), Document.FIELD_DOCUMENT_FILE)); - } - - List<FileId> getAttachments(AttachedItem bescheidItem) { - var attachmentsObject = bescheidItem.getItem().get(Bescheid.FIELD_ATTACHMENTS); - if (attachmentsObject instanceof Collection<?> attachments) { - return attachments.stream().map(String::valueOf).map(FileId::from).toList(); - } - return getStringAsList(attachmentsObject); - } - - List<FileId> getStringAsList(Object attachmentsObject) { - if (attachmentsObject instanceof String attachment && StringUtils.isNotBlank(attachment)) { - return Collections.singletonList(FileId.from(attachment)); - } - return Collections.emptyList(); - } - - void addSubCommands(String parentCommandId, List<OzgCloudCommand> subCommands) { - commandService.addSubCommands(buildCreateSubCommandsRequest(parentCommandId, subCommands)); - } - - OzgCloudCreateSubCommandsRequest buildCreateSubCommandsRequest(String parentCommandId, List<OzgCloudCommand> subCommands) { - return OzgCloudCreateSubCommandsRequest.builder() - .parentId(parentCommandId) - .executionMode(SUBCOMMANDS_EXECUTION_MODE) - .completedIfSubsCompleted(true) - .subCommands(subCommands) - .build(); - } - - public void setAntragBewilligung(AttachedItem bescheidItem) { - try { - bescheidClientAttributeService.setAntragResult(bescheidItem.getVorgangId(), getBewilligt(bescheidItem)); - } catch (Exception e) { - LOG.error("Cannot set antrag result on vorgang (id: {})", bescheidItem.getVorgangId(), e); - } - } - - boolean getBewilligt(AttachedItem bescheidItem) { - return MapUtils.getBooleanValue(bescheidItem.getItem(), Bescheid.FIELD_BEWILLIGT, false); - } - - public BescheidManagerConfig getConfig() { - return BescheidManagerConfig.builder() - .version(buildProperties.getVersion()) - .javaVersion(getJavaVersion()) - .features(buildFeatures()) - .build(); - } - - String getJavaVersion() { - return System.getProperty("java.version"); - } - - BescheidManagerConfig.Features buildFeatures() { - return BescheidManagerConfig.Features.builder() - .canCreateBescheidDocument(remoteService.isPresent()) - .build(); - } - - public Bescheid getBescheid(String id) { - return mapper.mapFromAttachedItem(attachedItemService.getItem(id)); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java deleted file mode 100644 index a6021663da81fbecf37f177b3d522cefeb7d8afb..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -class BescheidUpdatedEvent extends CommandExecutedEvent { - - public BescheidUpdatedEvent(Command command) { - super(command); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java index 95c5b586e88adc7881815f3331ad7213f5bcb530..0d7c6c9309c551922060c4f82efe5df3859d9373 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java @@ -7,12 +7,18 @@ import java.util.HashMap; import java.util.Map; import org.apache.commons.collections.MapUtils; +import org.mapstruct.AnnotateWith; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; +import org.springframework.stereotype.Component; + +import de.ozgcloud.document.bescheid.SentInfo; @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) +@AnnotateWith(value = Component.class, elements = @AnnotateWith.Element(strings = "deprecatedSentInfoMapper")) +@Deprecated public interface SentInfoMapper { String GRPC_DATE_TIME_FORMATTER = "yyyy-MM-dd'T'HH:mm:ss'Z'"; diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java deleted file mode 100644 index d92b4024521b151c049a71edc1f22f3bafa55de0..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.util.Objects; - -import de.ozgcloud.common.datatype.StringBasedValue; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -public class UserId extends StringBasedValue { - - UserId(String userId) { - super(userId); - } - - public static UserId from(String userId) { - if (Objects.nonNull(userId)) { - return new UserId(userId); - } - return null; - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java deleted file mode 100644 index 59f93a0239f649eb4156fb5512494e06749066d9..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java +++ /dev/null @@ -1,44 +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.bescheid.administration; - -import java.util.Optional; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.context.annotation.Configuration; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@RefreshScope -@Configuration -@ConfigurationProperties(prefix = "ozgcloud.postfach") -public class AdministrationProperties { - - private Optional<String> signatur = Optional.empty(); - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java deleted file mode 100644 index 920c5ea67d8285d1646b7840bf6c5fd91fb8c1ab..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java +++ /dev/null @@ -1,47 +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.bescheid.administration; - -import java.util.Optional; - -import org.springframework.cloud.endpoint.RefreshEndpoint; -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class AdministrationService { - - private final AdministrationProperties administrationProperties; - private final RefreshEndpoint refreshEndpoint; - - public Optional<String> getNachrichtSignature() { - return administrationProperties.getSignatur(); - } - - public void refreshConfig() { - refreshEndpoint.refresh(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java deleted file mode 100644 index 41fde870cc01fe94e9d2089742e77ffffd6a3f4a..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java +++ /dev/null @@ -1,43 +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.bescheid.administration; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import lombok.RequiredArgsConstructor; - -@Component -@ConditionalOnProperty(value = "ozgcloud.administration.sync.enabled", havingValue = "true", matchIfMissing = true) -@RequiredArgsConstructor -public class AdministrationSyncScheduler { - - private final AdministrationService service; - - @Scheduled(initialDelayString = "${ozgcloud.administration.sync.delay}", fixedDelayString = "${ozgcloud.administration.sync.delay}") - public void sync() { - service.refreshConfig(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java deleted file mode 100644 index d87ae7496591bc23df9ba65148ca8c5f2ba24559..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java +++ /dev/null @@ -1,66 +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. - */ -package de.ozgcloud.bescheid.attributes; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttributeValue; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest; -import io.grpc.ClientInterceptor; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service("bescheid_ClientAttributeRemoteService") -class ClientAttributeRemoteService { - - @GrpcClient("vorgang-manager") - private ClientAttributeServiceBlockingStub serviceBlockingStub; - - @Autowired - private ClientInterceptor bescheidCallContextInterceptor; - - public void setBooleanReadOnlyClientAttribute(String vorgangId, String attributeName, boolean value) { - serviceBlockingStub.withInterceptors(bescheidCallContextInterceptor).set(buildRequest(vorgangId, attributeName, value)); - } - - GrpcSetClientAttributeRequest buildRequest(String vorgangId, String attributeName, boolean value) { - return GrpcSetClientAttributeRequest.newBuilder() - .setVorgangId(vorgangId) - .setAttribute(buildClientAttribute(attributeName, value)) - .build(); - } - - GrpcClientAttribute buildClientAttribute(String attributeName, boolean value) { - return GrpcClientAttribute.newBuilder() - .setClientName(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME) - .setAccess(GrpcAccessPermission.READ_ONLY) - .setAttributeName(attributeName) - .setValue(GrpcClientAttributeValue.newBuilder().setBoolValue(value).build()) - .build(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java deleted file mode 100644 index 158597163c2ee60cfc4640a47e4704b453bda5b6..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java +++ /dev/null @@ -1,42 +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. - */ -package de.ozgcloud.bescheid.attributes; - -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; - -@Service("bescheid_ClientAttributeService") -@RequiredArgsConstructor -public class ClientAttributeService { - - public static final String ATTRIBUTE_NAME_ANTRAG_BEWILLIGT = "antragBewilligt"; - - private final ClientAttributeRemoteService bescheidClientAttributeRemoteService; - - public void setAntragResult(String vorgangId, boolean antragResult) { - bescheidClientAttributeRemoteService.setBooleanReadOnlyClientAttribute(vorgangId, ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, antragResult); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java deleted file mode 100644 index 08cac0cfb0bb41e32c4c71b4ad88556326607c4f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java +++ /dev/null @@ -1,100 +0,0 @@ -package de.ozgcloud.bescheid.binaryfile; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.apache.commons.io.IOUtils; -import org.springframework.stereotype.Service; - -import com.google.protobuf.ByteString; - -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils; -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileMetaData; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileRequest; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse; -import de.ozgcloud.vorgang.grpc.command.GrpcCallContext; -import io.grpc.stub.CallStreamObserver; -import io.grpc.stub.StreamObserver; -import lombok.NonNull; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service -class BinaryFileRemoteService { - - private static final String CALL_CONTEXT_CLIENT = "bescheid-manager"; - private static final String VORGANG_ATTACHMENT_FIELD = "bescheid"; - - @GrpcClient("vorgang-manager") - private BinaryFileServiceStub binaryFileRemoteStub; - - public FileId uploadBescheidFile(@NonNull BescheidResponse bescheid) { - try (var in = openFile(bescheid.getBescheidFile())) { - var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, in, - this::buildCallStreamObserver) - .withMetaData(buildMetaDataRequest(bescheid)) - .send(); - - return FileId.from(waitUntilFutureToComplete(resultFuture, in).getFileId()); - } catch (IOException e) { - throw new TechnicalException("Error on uploading file.", e); - } - } - - private InputStream openFile(File file) { - try { - return new FileInputStream(file); - } catch (FileNotFoundException e) { - throw new TechnicalException("File to upload not found.", e); - } - } - - private GrpcUploadBinaryFileRequest buildMetaDataRequest(BescheidResponse bescheid) { - return GrpcUploadBinaryFileRequest.newBuilder() - .setMetadata(GrpcUploadBinaryFileMetaData.newBuilder() - // TODO remove context - check why needed! - .setContext(GrpcCallContext.newBuilder().setClient(CALL_CONTEXT_CLIENT).build()) - .setVorgangId(bescheid.getVorgangId().toString()) - .setField(VORGANG_ATTACHMENT_FIELD) - .setContentType(bescheid.getContentType()) - .setSize(bescheid.getBescheidFile().length()) - .setFileName(bescheid.getBescheidFileName()) - .build()) - .build(); - } - - private GrpcUploadBinaryFileRequest buildChunkRequest(byte[] bytes, Integer length) { - return GrpcUploadBinaryFileRequest.newBuilder().setFileContent((ByteString.copyFrom(bytes, 0, length))).build(); - } - - private CallStreamObserver<GrpcUploadBinaryFileRequest> buildCallStreamObserver( - StreamObserver<GrpcUploadBinaryFileResponse> responseObserver) { - return (CallStreamObserver<GrpcUploadBinaryFileRequest>) binaryFileRemoteStub.uploadBinaryFileAsStream(responseObserver); - } - - GrpcUploadBinaryFileResponse waitUntilFutureToComplete(FileSender<GrpcUploadBinaryFileRequest, GrpcUploadBinaryFileResponse> fileSender, - InputStream fileContentStream) { - try { - return fileSender.getResultFuture().get(10, TimeUnit.MINUTES); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - fileSender.cancelOnError(e); - throw new TechnicalException("Waiting for finishing upload was interrupted.", e); - } catch (ExecutionException | TimeoutException e) { - fileSender.cancelOnTimeout(); - throw new TechnicalException("Error / Timeout on uploading data.", e); - } finally { - IOUtils.closeQuietly(fileContentStream); - } - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java deleted file mode 100644 index 11ddd6e95554acaf4a7839057a92489f373fa1c2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.bescheid.binaryfile; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.bescheid.BescheidResponse; -import lombok.NonNull; - -@Service -public class BinaryFileService { - - @Autowired - private BinaryFileRemoteService remoteService; - - public BescheidResponse uploadBescheidFile(@NonNull BescheidResponse bescheid) { - var fileId = remoteService.uploadBescheidFile(bescheid); - - return bescheid.withBescheidFileId(fileId); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java deleted file mode 100644 index 40cbdaffe962730c81d9c95239babda672aac989..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java +++ /dev/null @@ -1,52 +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.bescheid.common.callcontext; - -import java.util.Optional; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.apilib.common.callcontext.CallContext; -import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -public class BescheidManagerCallContextProvider implements OzgCloudCallContextProvider { - - private final CurrentUserService currentUserService; - - @Override - public CallContext provideContext() { - var callContextBuilder = CallContext.builder().clientName(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - getUserId().ifPresent(callContextBuilder::userId); - return callContextBuilder.build(); - } - - Optional<OzgCloudUserId> getUserId() { - return currentUserService.getUser().getUserId().map(OzgCloudUserId::from); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java deleted file mode 100644 index 77ec99f9581295e299a16064de28351cfc3ffaf4..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java +++ /dev/null @@ -1,64 +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. - */ -package de.ozgcloud.bescheid.common.callcontext; - -import java.util.Collection; -import java.util.stream.Collectors; - -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -public class CallContextAuthenticationToken extends AbstractAuthenticationToken { - - private final CallContextUser user; - - static CallContextAuthenticationToken authenticate(CallContextUser user) { - return new CallContextAuthenticationToken(user); - } - - private CallContextAuthenticationToken(CallContextUser user) { - super(user.getOrganisatorischeEinheitenIds().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toSet())); - this.user = user; - super.setAuthenticated(true); - } - - @Override - public Object getCredentials() { - return null; - } - - @Override - public Object getPrincipal() { - return user; - } - - @Override - public Collection<GrantedAuthority> getAuthorities() { - return user.getOrganisatorischeEinheitenIds().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toUnmodifiableSet()); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java deleted file mode 100644 index 667bb03d8dacb64af48b7d542c893cdca0d594c2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java +++ /dev/null @@ -1,58 +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. - */ -package de.ozgcloud.bescheid.common.callcontext; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Optional; - -import org.springframework.security.core.AuthenticatedPrincipal; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@Builder -@Getter -public class CallContextUser implements AuthenticatedPrincipal, Serializable { - - private static final long serialVersionUID = 1L; - - private final String clientName; - - @Builder.Default - private final transient Optional<String> userId = Optional.empty(); - @Builder.Default - private final transient Optional<String> userName = Optional.empty(); - @Singular - private final Collection<String> organisatorischeEinheitenIds; - @Builder.Default - private final transient boolean organisationEinheitenIdCheckNecessary = false; - - @Override - public String getName() { - return clientName; - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java deleted file mode 100644 index b77b10a648b85eb1da8a39dfc30ecd6a00f18cd9..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java +++ /dev/null @@ -1,106 +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. - */ -package de.ozgcloud.bescheid.common.callcontext; - -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.authentication.AuthenticationTrustResolver; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; - -import de.ozgcloud.command.Command; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Service("bescheid_currentUserService") -public class CurrentUserService { - - private final AuthenticationTrustResolver trustResolver; - - public CallContextUser getUser() { - return findUser().orElseThrow(() -> new IllegalStateException("No authenticated User found")); - } - - public Optional<CallContextUser> findUser() { - return findTrustedAuthentication() - .map(this::mapToCallContextUser) - // remove this filter as soon we have a trusted authentication - .filter(user -> StringUtils.isNotBlank(user.getClientName())); - } - - private CallContextUser mapToCallContextUser(Authentication auth) { - if (auth instanceof CallContextAuthenticationToken) { - return (CallContextUser) auth.getPrincipal(); - } else { - return CallContextUser.builder() - .clientName(auth.getName()) - .organisatorischeEinheitenIds( - auth.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toUnmodifiableSet())) - .build(); - } - } - - public Optional<Authentication> findAuthentication() { - return findTrustedAuthentication(); - } - - Optional<Authentication> findTrustedAuthentication() { - return Optional.ofNullable(SecurityContextHolder.getContext()) - .map(SecurityContext::getAuthentication) - .filter(auth -> !trustResolver.isAnonymous(auth)) - .filter(Authentication::isAuthenticated); - } - - public SecurityContext startSecurityContext(Command command) { - var prevContext = SecurityContextHolder.getContext(); - - SecurityContextHolder.clearContext(); - SecurityContextHolder.getContext().setAuthentication(CallContextAuthenticationToken.authenticate(createUser(command))); - - return prevContext; - } - - CallContextUser createUser(Command command) { - var builder = CallContextUser.builder() - .userId(Optional.ofNullable(command.getCreatedBy())) - .userName(Optional.ofNullable(command.getCreatedByName())) - .clientName("Alfa") // FIXME read client name from command - .organisationEinheitenIdCheckNecessary(false); - - return builder.build(); - } - - public void resetSecurityContext(SecurityContext context) { - SecurityContextHolder.clearContext(); - if (Objects.nonNull(context)) { - SecurityContextHolder.setContext(context); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java deleted file mode 100644 index 8355a9ffca2cf8b9ad91449133240e11745131c5..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.ozgcloud.bescheid.common.freemarker; - -import java.io.IOException; -import java.io.StringWriter; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -public class TemplateHandler { - - private final Configuration freemarkerConfig; - - public String getRawTemplate(String templateName) { - return getTemplate(templateName).toString(); - } - - public String fillTemplate(String templateName, Object dataModel) { - try { - var template = getTemplate(templateName); - var stringWriter = new StringWriter(); - template.process(dataModel, stringWriter); - return stringWriter.toString(); - - } catch (IOException | TemplateException e) { - throw new TechnicalException("Error filling template", e); - } - } - - private Template getTemplate(String templateName) { - try { - return freemarkerConfig.getTemplate(templateName); - } catch (IOException e) { - throw new TechnicalException("Error loading mail template", e); - } - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java deleted file mode 100644 index 889dbbad42e09d5195cc3daa107994e9af542b5f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java +++ /dev/null @@ -1,38 +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.bescheid.common.user; - -import de.ozgcloud.bescheid.UserId; -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class UserProfile { - - private UserId id; - private String firstName; - private String lastName; - private String email; -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java deleted file mode 100644 index 0c7c5ceda1c008597995a38a5306b704226085b6..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java +++ /dev/null @@ -1,40 +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.bescheid.common.user; - -import org.mapstruct.Mapper; - -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.apilib.user.OzgCloudUserProfile; -import de.ozgcloud.bescheid.UserId; - -@Mapper -public interface UserProfileMapper { - - UserProfile mapProfile(OzgCloudUserProfile userProfile); - - default UserId mapUserId(OzgCloudUserId id) { - return UserId.from(id.toString()); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java deleted file mode 100644 index 5346ead50451064408dd1db5146536520b566b99..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java +++ /dev/null @@ -1,52 +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.bescheid.common.user; - -import java.util.Optional; - -import org.springframework.stereotype.Service; - -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.apilib.user.OzgCloudUserProfileService; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class UserProfileService { - - private final CurrentUserService currentUserService; - private final Optional<OzgCloudUserProfileService> userProfileService; - private final UserProfileMapper mapper; - - public UserProfile getUserProfile() { - var service = userProfileService.orElseThrow(() -> new IllegalStateException("No connection to user-manager configured.")); - - return currentUserService.getUser().getUserId().map(OzgCloudUserId::from) - .map(service::getById) - .map(mapper::mapProfile).orElseThrow(() -> new TechnicalException("Unknown UserId or cannot load user profile.")); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java deleted file mode 100644 index 60949bbe87cf4d3b6c2a366dcc529d4be45c99bf..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java +++ /dev/null @@ -1,54 +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.bescheid.common.user; - -import java.util.UUID; - -import com.thedeanda.lorem.LoremIpsum; - -import de.ozgcloud.bescheid.UserId; - -public class UserProfileTestFactory { - - private static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance(); - - public static final String ID_STR = UUID.randomUUID().toString(); - public static final UserId ID = UserId.from(ID_STR); - - public static final String FIRST_NAME = LOREM_IPSUM.getFirstName(); - public static final String LAST_NAME = LOREM_IPSUM.getLastName(); - public static final String EMAIL = "test-email@local"; - - public static UserProfile create() { - return createBuilder().build(); - } - - public static UserProfile.UserProfileBuilder createBuilder() { - return UserProfile.builder() - .id(ID) - .firstName(FIRST_NAME) - .lastName(LAST_NAME) - .email(EMAIL); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java deleted file mode 100644 index ef9589219948ef6c2db265e1d6653b1f06403ba3..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.ozgcloud.bescheid.dummy; - -import java.util.Optional; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.google.common.net.MediaType; - -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.bescheid.BescheidRemoteService; -import de.ozgcloud.bescheid.BescheidRequest; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.common.binaryfile.TempFileUtils; - -@Service -@ConditionalOnProperty("ozgcloud.feature.bescheid.enable-dummy-document-processor") -class DummyBescheidRemoteService implements BescheidRemoteService { - - private static final String DUMMY_BESCHEID_FILE_NAME = "dummy-bescheid.pdf"; - private static final String DUMMY_BESCHEID_CONTENT_TYPE = MediaType.PDF.toString(); - - @Override - public BescheidResponse create(BescheidRequest request, Vorgang vorgang) { - var file = TempFileUtils.writeTmpFile(this.getClass().getClassLoader().getResourceAsStream(DUMMY_BESCHEID_FILE_NAME)); - - return BescheidResponse.builder() - .bescheidFile(file) - .bescheidFileName(DUMMY_BESCHEID_FILE_NAME) - .contentType(DUMMY_BESCHEID_CONTENT_TYPE) - .nachrichtText(Optional.of("Dummy Bescheid")) - .nachrichtSubject(Optional.of("Nachricht Subject")) - .size(file.length()) - .createdBy(request.getCreateFor().getId()) - .build(); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java deleted file mode 100644 index b93412e26623f5b7f04b7f96a1e38a51b56018d2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java +++ /dev/null @@ -1,248 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.Optional; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.http.HttpStatusCode; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.BodyExtractors; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.WebClient; -import org.w3c.dom.Document; -import org.w3c.dom.Text; -import org.xml.sax.SAXException; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; - -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.bescheid.BescheidRemoteService; -import de.ozgcloud.bescheid.BescheidRequest; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.BescheidData; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.SmartDocument.Selection; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.common.binaryfile.FileDataDeserializer; -import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import reactor.core.publisher.Mono; - -@Log4j2 -@Service -@RequiredArgsConstructor -@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url") -class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { - - private static final String FILE_TYPE_PDF = "PDF"; - private static final String FILE_TYPE_XML = "XML"; - - static final String NACHRICHTEN_TEXT_EXPRESSION = "/root/SmartDocument/Fields/NachrichtenText/text()"; // NOSONAR - static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; // NOSONAR - - @SuppressWarnings("deprecation") // SD requires forced UTF-8 encoding - private static final MediaType JSON_MEDIA_TYPE_FOR_SD = MediaType.APPLICATION_JSON_UTF8; - - @Qualifier("smartDocuments") - private final WebClient smartDocumentsWebClient; - - private final SmartDocumentsProperties properties; - - @Override - public BescheidResponse create(BescheidRequest request, Vorgang vorgang) { - var sdRequest = createRequest(request, vorgang); - LOG.debug(() -> buildLogRequest(sdRequest)); - - return smartDocumentsWebClient.post().accept(MediaType.APPLICATION_JSON) - .contentType(JSON_MEDIA_TYPE_FOR_SD) - .bodyValue(sdRequest) - .retrieve() - .onStatus(HttpStatusCode::is4xxClientError, this::handleClientError) - .bodyToMono(SmartDocumentsResponse.class) - .map(response -> buildBescheid(request, response)) - .block(); - } - - Mono<Throwable> handleClientError(ClientResponse response) { - return response.body(BodyExtractors.toMono(String.class)) - .map(content -> new TechnicalException("Client-Error: " + content)); - } - - private String buildLogRequest(SmartDocumentsRequest request) { - try { - ObjectMapper oj = new ObjectMapper(); - return oj.writerWithDefaultPrettyPrinter().writeValueAsString(request); - } catch (Exception e) { - LOG.warn("Error writing request as json-string for logging.", e); - return "Error generating logging string"; - } - } - - BescheidResponse buildBescheid(BescheidRequest request, SmartDocumentsResponse smartDocumentsResponse) { - var smartDocumentsFile = getSmartDocumentsFile(smartDocumentsResponse); - - return BescheidResponse.builder() - .bescheidFile(smartDocumentsFile.getDocument().getData()) - .bescheidFileName(smartDocumentsFile.getFilename()) - .size(smartDocumentsFile.getDocument().getData().length()) - .contentType(MediaType.APPLICATION_PDF_VALUE) - .nachrichtText(getNachrichtText(smartDocumentsResponse)) - .bewilligt(request.isGenehmigt()) - .createdBy(request.getCreateFor().getId()) - .vorgangId(request.getVorgangId()) - .build(); - } - - private SmartDocumentFile getSmartDocumentsFile(SmartDocumentsResponse response) { - return getSmartDocumentsFile(response, FILE_TYPE_PDF) - .orElseThrow(() -> new IllegalStateException("No PDF File in SmartDocuments Response found.")); - } - - Optional<String> getNachrichtText(SmartDocumentsResponse response) { - return getXMLFile(response).flatMap(this::extractTextFromXmlFile); - } - - Optional<String> extractTextFromXmlFile(File xmlFile) { - try { - var document = parseXml(xmlFile); - if (document.isPresent()) { - return document.flatMap(this::getNachrichtenText).or(() -> getFieldTemplateText(document.get())).map(Text::getTextContent); - } - } catch (RuntimeException e) { - LOG.warn("Unexpected Error on extracting NachrichtText: {}", e.getMessage(), e); - } - return Optional.empty(); - } - - Optional<Document> parseXml(File xmlFile) { - try { - return Optional.of(DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(xmlFile)); - } catch (SAXException | IOException | ParserConfigurationException e) { - LOG.warn("XML-Parsing error on extracting Nachricht-Text: {}", e.getMessage(), e); - } - return Optional.empty(); - } - - Optional<Text> getNachrichtenText(Document document) { - return evaluateXPath(document, NACHRICHTEN_TEXT_EXPRESSION); - } - - Optional<Text> getFieldTemplateText(Document document) { - return evaluateXPath(document, FIELD_TEMPLATE_EXPRESSION); - } - - Optional<Text> evaluateXPath(Document document, String xpathExpression) { - try { - var expr = XPathFactory.newInstance().newXPath().compile(xpathExpression); - return Optional.ofNullable(expr.evaluate(document, XPathConstants.NODE)).map(Text.class::cast); - } catch (ClassCastException e) { - LOG.warn("Error on extraction Nachricht-Text. XPath return unexpected Type.", e); - } catch (XPathExpressionException e) { - LOG.warn("Cannot evaluate XPath: {}", xpathExpression, e); - } - return Optional.empty(); - } - - Optional<File> getXMLFile(SmartDocumentsResponse response) { - return getSmartDocumentsFile(response, FILE_TYPE_XML) - .map(SmartDocumentFile::getDocument) - .map(SmartDocumentDocument::getData); - } - - Optional<SmartDocumentFile> getSmartDocumentsFile(SmartDocumentsResponse response, String fileType) { - return response.getFile().stream() - .filter(file -> file.getOutputFormat().equals(fileType)) - .findFirst(); - } - - SmartDocumentsRequest createRequest(BescheidRequest request, Vorgang vorgang) { - return logRequest(SmartDocumentsRequest.builder() - .smartDocument(buildSDSection(vorgang)) - .customerData( - CustomerData.builder() - .vorgang(vorgang) - .userData(buildUserData(request.getCreateFor())) - .bescheid(BescheidData.builder().bescheidVom(request.getBescheidVom()).genehmigt(request.isGenehmigt()).build()) - .build()) - - .build()); - } - - private UserData buildUserData(UserProfile userProfile) { - return UserData.builder() - .firstName(userProfile.getFirstName()) - .lastName(userProfile.getLastName()) - .email(userProfile.getEmail()) - .build(); - } - - private SmartDocumentsRequest.SmartDocument buildSDSection(Vorgang vorgang) { - return SmartDocumentsRequest.SmartDocument.builder().selection(Selection.builder() - .templateGroup(properties.getTemplateGroup()) - .template(vorgang.getVorgangName()) - .build()) - .build(); - } - - private SmartDocumentsRequest logRequest(SmartDocumentsRequest request) { - LOG.debug(() -> { - var ojMapper = new ObjectMapper(); - try { - return ojMapper.writeValueAsString(request); - } catch (JsonProcessingException e) { - LOG.warn("Json Processing Exception on logging request.", e); - return request.toString(); - } - }); - - return request; - } - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - static class SmartDocumentsResponse { - Collection<SmartDocumentFile> file; - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - static class SmartDocumentFile { - private String filename; - private SmartDocumentDocument document; - private String outputFormat; - } - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - static class SmartDocumentDocument { - @JsonDeserialize(using = FileDataDeserializer.class) - private File data; - } - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java deleted file mode 100644 index 579a53d016fe65a7a0c9110173ead505b2793476..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.ExchangeFilterFunctions; -import org.springframework.web.reactive.function.client.WebClient; - -import reactor.netty.http.client.HttpClient; -import reactor.netty.transport.ProxyProvider; - -@Configuration -@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url") -class SmartDocumentsConfiguration { - - @Autowired - private SmartDocumentsProperties properties; - - @Bean("smartDocuments") - WebClient smartDocumentsWebClient() { - ReactorClientHttpConnector connector = new ReactorClientHttpConnector(buildHttpClient()); - - return WebClient.builder() - .baseUrl(properties.getUrl()) - .filter(ExchangeFilterFunctions.basicAuthentication(properties.getBasicAuth().getUsername(), properties.getBasicAuth().getPassword())) - .clientConnector(connector) - .build(); - } - - private HttpClient buildHttpClient() { - if (properties.getProxy() != null) { - return createProxyHttpClient(); - } else { - return createNoProxyHttpClient(); - } - } - - private HttpClient createNoProxyHttpClient() { - return HttpClient.create(); - } - - private HttpClient createProxyHttpClient() { - return HttpClient.create() - .proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP) - .host(properties.getProxy().getHost()) - .port(properties.getProxy().getPort()) - .username(properties.getProxy().getUsername()) - .password(username -> properties.getProxy().getPassword())); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java deleted file mode 100644 index c45e9383c581e237dbf565d6daab0a5b9c217dc7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java +++ /dev/null @@ -1,88 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; - -import org.apache.logging.log4j.core.config.plugins.validation.constraints.NotBlank; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.validation.annotation.Validated; - -import lombok.Getter; -import lombok.Setter; - -@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url") -@Validated -@Getter -@Setter -@Configuration -@ConfigurationProperties("ozgcloud.bescheid.smart-documents") -public class SmartDocumentsProperties { - - /** - * Location of the Smart Documents Server - */ - @NotBlank - private String url; - - /** - * Credential for basic auth to the Smart Documents Server - */ - @NotNull - @Valid - private UsernamePassword basicAuth; - - /** - * Smart Documents Template Group - */ - @NotBlank - private String templateGroup; - /** - * Smart Documents Template - */ - @NotBlank - private String template; - - /** - * Proxy Configuration if required. - */ - private ProxyConfiguration proxy; - - @Getter - @Setter - static class UsernamePassword { - /** - * Username for authentication - */ - @NotBlank - private String username; - /** - * Password for authentication - */ - @NotBlank - private String password; - } - - @Getter - @Setter - static class ProxyConfiguration { - /** - * Host Address of the proxy server with protocol - */ - @NotBlank - private String host; - /** - * Port Number of the proxy server - */ - private int port = 8080; - /** - * Username for Authentication for the proxy server - */ - private String username; - /** - * Username for Authentication for the proxy server - */ - private String password; - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java deleted file mode 100644 index d842134f98b72ab6a3961ecef0f6aad924d90637..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java +++ /dev/null @@ -1,68 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import java.time.LocalDate; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import de.ozgcloud.bescheid.vorgang.Vorgang; -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; - -@Builder -@Getter -@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) -@ToString -class SmartDocumentsRequest { - - @Builder.Default - private CustomerData customerData = CustomerData.builder().build(); - @Builder.Default - private SmartDocument smartDocument = SmartDocument.builder().build(); - - @Builder - @Getter - static class CustomerData { - private Vorgang vorgang; - private BescheidData bescheid; - private UserData userData; - - @Builder - @Getter - static class BescheidData { - private LocalDate bescheidVom; - private boolean genehmigt; - } - - @Builder - @Getter - static class UserData { - private String firstName; - private String lastName; - private String email; - } - } - - @Builder - @Getter - @JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) - static class SmartDocument { - - @Builder.Default - @JsonProperty("Selection") - private Selection selection = Selection.builder().build(); - - @Builder - @Getter - @JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) - static class Selection { - @Builder.Default - private String templateGroup = "Kiel"; - @Builder.Default - private String template = "Halteverbot"; - } - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java deleted file mode 100644 index a5445250df8668b4c23a5c8db18295914e78a9ae..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.ReportingPolicy; -import org.mapstruct.factory.Mappers; - -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcFormData; -import de.ozgcloud.vorgang.vorgang.GrpcPostfachAddress; -import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; -import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, // - uses = { FormDataEntryMapper.class, GrpcObjectMapper.class }) -interface BescheidVorgangMapper { - - @Mapping(target = "serviceKonto", source = "header.serviceKonto") - @Mapping(target = "vorgangNummer", source = "nummer") - @Mapping(target = "vorgangName", source = "name") - Vorgang mapVorgang(GrpcVorgangWithEingang vorgang); - - @Mapping(target = "postfachAddress", ignore = true) - @Mapping(target = "postfachAddresses", source = "postfachAddressesList") - Vorgang.ServiceKonto mapServiceKonto(GrpcServiceKonto serviceKonto); - - Vorgang.PostfachAddress mapAddress(GrpcPostfachAddress address); - - VorgangId mapVorgangId(String vorgangId); - - Vorgang.Eingang mapEingang(GrpcEingang eingang); - - default Collection<FormDataEntry> mapFormData(GrpcFormData value) { - var result = new ArrayList<FormDataEntry>(); - var entryMapper = Mappers.getMapper(FormDataEntryMapper.class); - - result.addAll(value.getFieldList().stream().map(entryMapper::fromGrpc).toList()); - result.addAll(value.getFormList().stream().map(entryMapper::fromGrpc).toList()); - - return Collections.unmodifiableList(result); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java deleted file mode 100644 index e0e2988ba7883c82f423e767b6df2b0d8cd34b87..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java +++ /dev/null @@ -1,63 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@JsonSerialize(using = FormDataEntrySerializer.class) -public interface FormDataEntry { - - String getName(); - @JsonIgnore - String getLabel(); - - @JsonIgnore - default boolean isSubForm() { - return false; - } - - @JsonIgnore - default boolean isFormEntry() { - return false; - } - - @Builder - @Getter - static class SubForm implements FormDataEntry { - - private String name; - @JsonIgnore - private String label; - - @Singular - private List<FormDataEntry> entries; - - @JsonIgnore - @Override - public boolean isSubForm() { - return true; - } - } - - @Builder - @Getter - static class FormField implements FormDataEntry { - - private String name; - @JsonIgnore - private String label; - - private Object value; - - @JsonIgnore - @Override - public boolean isFormEntry() { - return true; - } - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java deleted file mode 100644 index 6cd404f3247936a7b6c6ff83e07c00c85c914b20..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.util.List; -import java.util.stream.Stream; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.ReportingPolicy; - -import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField; -import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm; -import de.ozgcloud.vorgang.vorgang.GrpcFormField; -import de.ozgcloud.vorgang.vorgang.GrpcSubForm; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR) -public interface FormDataEntryMapper { - - @Mapping(target = "entries", source = ".", qualifiedByName = "mapEntrys") - @Mapping(target = "entry", ignore = true) - @Mapping(target = "name", source = "title") - SubForm fromGrpc(GrpcSubForm subForm); - - FormField fromGrpc(GrpcFormField field); - - @Named("mapEntrys") - default List<FormDataEntry> mapEntrys(GrpcSubForm subForm) { - var fieldStream = subForm.getFieldList().stream().map(this::fromGrpc); - var subFormsStream = subForm.getSubFormList().stream().map(this::fromGrpc); - - return Stream.concat(fieldStream, subFormsStream).toList(); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java deleted file mode 100644 index 0a3b48dbe0074d56570a050af1f196edf4da2222..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java +++ /dev/null @@ -1,81 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.io.IOException; -import java.util.List; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField; -import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm; -import de.ozgcloud.common.errorhandling.TechnicalException; - -public class FormDataEntrySerializer extends StdSerializer<FormDataEntry> { - - public FormDataEntrySerializer() { - super(FormDataEntry.class); - } - - @Override - public void serialize(FormDataEntry value, JsonGenerator gen, SerializerProvider provider) throws IOException { - - if (value.isFormEntry()) { - var formEntry = (FormField) value; - Optional.ofNullable(formEntry.getValue()).map(Object::toString).filter(StringUtils::isNoneBlank) - .ifPresent(val -> writeStringField(value.getName(), val, gen)); - } - if (value.isSubForm()) { - gen.writeFieldName(value.getName()); - gen.writeStartObject(); - var subForm = (SubForm) value; - - subForm.getEntries().forEach(entry -> writeObject(entry, gen)); - gen.writeEndObject(); - } - } - - private void writeStringField(String name, String value, JsonGenerator gen) { - try { - gen.writeStringField(name, value); - } catch (IOException e) { - throw new TechnicalException("Error writing string field in json.", e); - } - } - - static void writeObject(Object pojo, JsonGenerator jgen) { - try { - jgen.writeObject(pojo); - } catch (IOException e) { - throw new TechnicalException("Error on writing object to json.", e); - } - } -} - -class FormDataEntryListSerializer extends StdSerializer<List<FormDataEntry>> { - - public FormDataEntryListSerializer() { - super(List.class, true); - } - - @Override - public void serialize(List<FormDataEntry> value, JsonGenerator gen, SerializerProvider provider) throws IOException { - gen.writeStartObject(); - - value.forEach(entry -> defaultSerializeValue(entry, gen, provider)); - gen.writeEndObject(); - } - - private void defaultSerializeValue(Object value, JsonGenerator jgen, SerializerProvider provider) { - try { - var serializer = provider.findValueSerializer(FormDataEntry.class); - serializer.serialize(value, jgen, provider); - } catch (IOException e) { - throw new TechnicalException("Error serializing value.", e); - } - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java deleted file mode 100644 index ba0e51d7681c81f51a00cad46317330410b98d1e..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java +++ /dev/null @@ -1,97 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -import lombok.ToString; - -@Builder -@Getter -@ToString -public class Vorgang { - - @JsonIgnore - private VorgangId id; - private long version; - - private String vorgangName; - - private String vorgangNummer; - private String aktenzeichen; - - @JsonIgnore - @ToString.Exclude - private ServiceKonto serviceKonto; - @ToString.Exclude - private Eingang eingang; - - @Builder - @Getter - public static class ServiceKonto { - - public static final String FIELD_SERVICEKONTO_TYPE = "serviceKontoType"; - public static final String FIELD_POSTFACH_ADDRESS = "postfachAddress"; - - private String type; - @Singular - private List<PostfachAddress> postfachAddresses; - } - - @Builder - @Getter - public static class PostfachAddress { - - public static final String FIELD_VERSION = "version"; - public static final String FIELD_TYPE = "type"; - public static final String FIELD_IDENTIFIER = "identifier"; - - private String version; - private int type; - private Map<String, Object> identifier; - } - - @Builder - @Getter - static class Eingang { - private Antragsteller antragsteller; - private ZustaendigeStelle zustaendigeStelle; - - @Singular("formData") - @JsonSerialize(using = FormDataEntryListSerializer.class) - private List<FormDataEntry> formData; - } - - @Builder - @Getter - @JsonInclude(Include.NON_EMPTY) - static class Antragsteller { - private String anrede; - private String nachname; - private String vorname; - private String geburtsdatum; - private String geburtsort; - private String geburtsname; - private String email; - private String telefon; - private String strasse; - private String hausnummer; - private String plz; - private String ort; - } - - @Builder - @Getter - static class ZustaendigeStelle { - private String organisationseinheitenId; - private String email; - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java deleted file mode 100644 index 2cb8785e563dbbff842baa5996e971d905be1bc7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import de.ozgcloud.common.datatype.StringBasedValue; - -public class VorgangId extends StringBasedValue { - - VorgangId(String vorgangId) { - super(vorgangId); - } - - public static VorgangId from(String vorgangId) { - return new VorgangId(vorgangId); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java deleted file mode 100644 index c3a1aa72e30e3147d913117c6f5f4d77e8ee6a12..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.ClientInterceptor; -import lombok.NonNull; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service("bescheid_VorgangRemoteService") -class VorgangRemoteService { - - @GrpcClient("vorgang-manager") - private VorgangServiceBlockingStub vorgangServiceStub; - @Autowired - private BescheidVorgangMapper mapper; - - @Autowired - private ClientInterceptor bescheidCallContextInterceptor; - - public Vorgang getById(@NonNull VorgangId vorgangId) { - var request = GrpcFindVorgangWithEingangRequest.newBuilder().setId(vorgangId.toString()).build(); - var response = vorgangServiceStub - .withInterceptors(bescheidCallContextInterceptor) - .findVorgangWithEingang(request); - - return mapper.mapVorgang(response.getVorgangWithEingang()); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java deleted file mode 100644 index 98689c96ea25c66ffcfbe9cab54556b148b7fc65..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import org.springframework.stereotype.Service; - -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Service("bescheid_VorgangService") -@RequiredArgsConstructor -public class VorgangService { - - private final VorgangRemoteService remoteService; - - public Vorgang getById(@NonNull VorgangId id) { - return remoteService.getById(id); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java deleted file mode 100644 index f47223bc22488d80380ad986dd37ebf79e4c27db..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java +++ /dev/null @@ -1,54 +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.common.attached_item; - -import java.util.Map; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@Builder(toBuilder = true) -@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; - - @Singular("itemEntry") - private Map<String, Object> item; - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java deleted file mode 100644 index c3431d175ebf43e14f6a7fd15baf34cb7b81a5f6..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java +++ /dev/null @@ -1,47 +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.common.attached_item; - -import java.util.Map; - -import org.mapstruct.Mapper; -import org.mapstruct.NullValueCheckStrategy; - -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; - -@Mapper(uses = { GrpcObjectMapper.class }, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) -public interface AttachedItemMapper { - - AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item); - - default Map<String, Object> toMap(AttachedItem attachedItem) { - return Map.of( - AttachedItem.PROPERTY_VORGANG_ID, attachedItem.getVorgangId(), - AttachedItem.PROPERTY_CLIENT, attachedItem.getClient(), - AttachedItem.PROPERTY_ITEM_NAME, attachedItem.getItemName(), - AttachedItem.PROPERTY_ITEM, attachedItem.getItem()); - } - -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java deleted file mode 100644 index d0ad2ed4e32a2eb9fe424440629f23e0e50e9331..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java +++ /dev/null @@ -1,230 +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.common.attached_item; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Qualifier; -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.Bescheid; -import de.ozgcloud.bescheid.Bescheid.Status; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidManagerConfiguration; -import de.ozgcloud.bescheid.BescheidMapper; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.command.Command; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.Document; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class AttachedItemService { - - public static final String BESCHEID_ITEM_NAME = "Bescheid"; - public static final String PATCH_ATTACHED_ITEM = "PATCH_ATTACHED_ITEM"; - 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"; - - @Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME) - private final OzgCloudCommandService commandService; - private final VorgangAttachedItemRemoteService remoteService; - - private final CommandMapper commandMapper; - private final AttachedItemMapper attachedItemMapper; - private final BescheidMapper bescheidMapper; - - public Optional<AttachedItem> findBescheidItem(VorgangId vorgangId) { - return remoteService.findBescheidDraft(vorgangId); - } - - public AttachedItem getItem(String id) { - return remoteService.getItem(id); - } - - public String createBescheidDraft(Bescheid bescheidDraft) { - return remoteService.findBescheidDraft(bescheidDraft.getVorgangId()) - .map(bescheidItem -> overrideAttachedItem(mergeBescheidDrafts(bescheidItem, bescheidDraft))) - .orElseGet(() -> createAttachedItem(bescheidDraft)); - } - - AttachedItem mergeBescheidDrafts(AttachedItem existingBescheidItem, Bescheid newBescheidDraft) { - return existingBescheidItem.toBuilder() - .item(bescheidMapper.mapToItem(newBescheidDraft)) - .build(); - } - - String overrideAttachedItem(AttachedItem bescheidItem) { - var finishedOzgCloudCommand = commandService.createAndWaitUntilDone(buildPatchAttachedItemCommand(bescheidItem, bescheidItem.getItem())); - return finishedOzgCloudCommand.getCreatedResource(); - } - - Map<String, Object> buildItemMapWithAllBescheidFields(Command command) { - var result = new HashMap<String, Object>(); - result.put(Bescheid.FIELD_BESCHIEDEN_AM, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM)); - result.put(Bescheid.FIELD_BEWILLIGT, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT)); - result.put(Bescheid.FIELD_BESCHEID_DOCUMENT, - MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT)); - result.put(Bescheid.FIELD_SEND_BY, getSendBy(command.getBodyObject())); - result.put(Bescheid.FIELD_NACHRICHT_TEXT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT)); - result.put(Bescheid.FIELD_NACHRICHT_SUBJECT, - MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT)); - result.put(Bescheid.FIELD_ATTACHMENTS, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS)); - return result; - } - - private String getSendBy(Map<String, Object> body) { - return MapUtils.getString(body, Bescheid.FIELD_SEND_BY); - } - - public void updateBescheidDraft(Command command, Optional<Document> document) { - createCommandAfterValidation(command, bescheid -> buildUpdateBescheidDraftCommand(command, document, bescheid)); - } - - private OzgCloudCommand buildUpdateBescheidDraftCommand(Command command, Optional<Document> document, AttachedItem bescheidItem) { - return buildPatchAttachedItemCommand(bescheidItem, buildAttachedItemAsMap(command, buildBescheidItemAsMap(command, document))); - } - - Map<String, Object> buildBescheidItemAsMap(Command command, Optional<Document> newDocument) { - var itemMap = buildItemMapWithExistingBescheidFields(command); - var savedBescheid = getItem(command.getRelationId()); - - getNewNachrichtText(savedBescheid, newDocument) - .ifPresent(nachrichtText -> itemMap.put(Bescheid.FIELD_NACHRICHT_TEXT, nachrichtText)); - - return itemMap; - } - - Optional<String> getNewNachrichtText(AttachedItem bescheidItem, Optional<Document> newDocument) { - return newDocument - .filter(document -> isDifferentDocument(document, bescheidItem)) - .map(Document::getNachrichtText) - .filter(StringUtils::isNotBlank); - } - - boolean isDifferentDocument(Document document, AttachedItem bescheidItem) { - return !StringUtils.equals(document.getId(), getBescheidDocumentId(bescheidItem)); - } - - private String getBescheidDocumentId(AttachedItem item) { - return MapUtils.getString(item.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT); - } - - OzgCloudCommand buildPatchAttachedItemCommand(AttachedItem bescheidItem, Map<String, Object> bodyObject) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheidItem.getId())) - .relationVersion(bescheidItem.getVersion()) - .order(PATCH_ATTACHED_ITEM) - .bodyObject(bodyObject) - .build(); - } - - String createAttachedItem(Bescheid bescheidDraft) { - var bescheidItem = bescheidMapper.mapFromBescheid(bescheidDraft); - return commandService.createAndWaitUntilDone(buildCreateAttachedItemCommand(bescheidItem)).getCreatedResource(); - } - - OzgCloudCommand buildCreateAttachedItemCommand(AttachedItem bescheidItem) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheidItem.getVorgangId())) - .order(CREATE_ATTACHED_ITEM_ORDER) - .bodyObject(attachedItemMapper.toMap(bescheidItem)).build(); - } - - Map<String, Object> buildAttachedItemAsMap(Command command, Map<String, Object> itemMap) { - var result = new HashMap<String, Object>(); - result.put(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId()); - result.put(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - result.put(AttachedItem.PROPERTY_ITEM_NAME, BESCHEID_ITEM_NAME); - result.put(AttachedItem.PROPERTY_ITEM, itemMap); - return result; - } - - Map<String, Object> buildItemMapWithExistingBescheidFields(Command command) { - var result = buildItemMap(Bescheid.Status.DRAFT); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_SEND_BY, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS, result); - return result; - } - - void addValueFromMapIfExists(Map<String, Object> sourceMap, String key, Map<String, Object> targetMap) { - if (sourceMap.containsKey(key)) { - targetMap.put(key, sourceMap.get(key)); - } - } - - public void deleteBescheidDraft(Command command) { - createCommandAfterValidation(command, bescheid -> buildDeleteItemCommand(command, bescheid)); - } - - private void createCommandAfterValidation(Command command, Function<AttachedItem, OzgCloudCommand> buildCommand) { - var bescheid = remoteService.getItem(command.getRelationId()); - validateBescheidStatus(bescheid); - commandService.createAndWaitUntilDone(buildCommand.apply(bescheid)); - } - - void validateBescheidStatus(AttachedItem bescheid) { - var bescheidStatus = MapUtils.getString(bescheid.getItem(), Bescheid.FIELD_STATUS); - if (Bescheid.Status.DRAFT.not(bescheidStatus)) { - throw new TechnicalException("Bescheid draft with ID '%s' has an unexpected status: '%s'".formatted(bescheid.getId(), bescheidStatus)); - } - } - - OzgCloudCommand buildDeleteItemCommand(Command command, AttachedItem bescheid) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheid.getId())) - .relationVersion(bescheid.getVersion()) - .order(DELETE_ATTACHED_ITEM) - .build(); - } - - Map<String, Object> buildItemMap(Status status) { - var itemMap = new HashMap<String, Object>(); - itemMap.put(Bescheid.FIELD_STATUS, status.name()); - return itemMap; - } - - public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) { - return remoteService.findAllBescheid(vorgangId); - } -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java deleted file mode 100644 index 1d8756a0c968d0463e6f94391afb91fad9143c04..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java +++ /dev/null @@ -1,112 +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.common.attached_item; - -import static de.ozgcloud.common.attached_item.AttachedItemService.*; - -import java.time.LocalDate; -import java.util.Comparator; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import org.apache.commons.collections.MapUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub; -import io.grpc.ClientInterceptor; -import lombok.extern.log4j.Log4j2; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service -@Log4j2 -class VorgangAttachedItemRemoteService { - - private static final Comparator<AttachedItem> BY_BESCHIEDEN_AM_DESC = (bescheid1, bescheid2) -> { - var beschiedenAm1 = LocalDate.parse(MapUtils.getString(bescheid1.getItem(), Bescheid.FIELD_BESCHIEDEN_AM)); - var beschiedenAm2 = LocalDate.parse(MapUtils.getString(bescheid2.getItem(), Bescheid.FIELD_BESCHIEDEN_AM)); - return beschiedenAm2.compareTo(beschiedenAm1); - }; - - @GrpcClient("vorgang-manager") - private VorgangAttachedItemServiceBlockingStub serviceStub; - @Autowired - private ClientInterceptor bescheidCallContextInterceptor; - @Autowired - private AttachedItemMapper attachedItemMapper; - - public Optional<AttachedItem> findBescheidDraft(VorgangId vorgangId) { - return findBescheidDraft(buildFindRequest(vorgangId.toString())); - } - - public List<AttachedItem> findAllBescheid(VorgangId vorgangId) { - return findAllBescheid(buildFindRequest(vorgangId.toString())).toList(); - } - - GrpcFindVorgangAttachedItemRequest buildFindRequest(String vorgangId) { - return GrpcFindVorgangAttachedItemRequest.newBuilder() - .setVorgangId(vorgangId) - .setItemName(BESCHEID_ITEM_NAME) - .setClient(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME) - .build(); - } - - Optional<AttachedItem> findBescheidDraft(GrpcFindVorgangAttachedItemRequest request) { - var bescheidItems = findAllBescheid(request).filter(this::hasStatusDraft).toList(); - if (bescheidItems.size() > 1) { - LOG.error("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(), - bescheidItems.getFirst().getVorgangId()); - } - return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.getFirst()); - } - - Stream<AttachedItem> findAllBescheid(GrpcFindVorgangAttachedItemRequest request) { - var grpcResponse = getServiceStub().find(request); - return grpcResponse.getVorgangAttachedItemsList().stream().map(attachedItemMapper::mapFromVorgangAttachedItem) - .sorted(BY_BESCHIEDEN_AM_DESC); - } - - boolean hasStatusDraft(AttachedItem bescheidItem) { - return Bescheid.Status.DRAFT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_STATUS)); - } - - 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(); - } - - VorgangAttachedItemServiceBlockingStub getServiceStub() { - return serviceStub.withInterceptors(bescheidCallContextInterceptor); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java deleted file mode 100644 index aa8c127a165ad74cb1132759d977139faace6434..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java +++ /dev/null @@ -1,34 +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 de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -public class BescheidDocumentCreatedEvent extends CommandExecutedEvent { - - public BescheidDocumentCreatedEvent(Command command, String createdResource) { - super(command, createdResource); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java deleted file mode 100644 index fc0d09b53f1d9cbc4d3792dca94c429f46d3e5e1..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java +++ /dev/null @@ -1,44 +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 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/DocumentEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentEventListener.java deleted file mode 100644 index 316388c1057e9a90a9459d21abf64f01dec871a3..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentEventListener.java +++ /dev/null @@ -1,99 +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 java.util.Objects; -import java.util.function.Predicate; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.stereotype.Component; - -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.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Component -@RequiredArgsConstructor -@Log4j2 -public class DocumentEventListener { - - static final String CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER = "CREATE_BESCHEID_DOCUMENT_FROM_FILE"; - public static final Predicate<Command> IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE_COMMAND = command -> - CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER.equals(command.getOrder()); - private static final String IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE = "{T(de.ozgcloud.document.DocumentEventListener).IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE_COMMAND.test(event.getSource())}"; - - private static final String ERROR_MESSAGE = "Error on executing Create Bescheid Document Command."; - - private final DocumentService documentService; - - private final ApplicationEventPublisher eventPublisher; - private final CurrentUserService userService; - - @EventListener(condition = IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE) - public void onCreateBescheidDocumentFromFile(CommandCreatedEvent event) { - SecurityContext prevContext = null; - var command = event.getSource(); - try { - prevContext = userService.startSecurityContext(command); - var createdDocumentId = documentService.createBescheidDocument(command); - publishEvent(new BescheidDocumentCreatedEvent(command, createdDocumentId)); - } catch (Exception e) { - LOG.error("{} Command failed.", ERROR_MESSAGE, e); - publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(e))); - } finally { - userService.resetSecurityContext(prevContext); - } - } - - void publishEvent(ApplicationEvent event) { - eventPublisher.publishEvent(event); - } - - String buildErrorMessage(Exception e) { - try { - StringBuilder sb = new StringBuilder(ERROR_MESSAGE); - - if (Objects.nonNull(e.getCause()) && StringUtils.isNotBlank(e.getCause().getMessage())) { - sb.append(" Cause: " + e.getCause().getMessage()); - } - - if (e instanceof TechnicalException techException) { - sb.append(" ExceptionId: " + techException); - } - - return sb.toString(); - } catch (Exception e2) { - LOG.error("Error in building Error Message (sick).", e2); - return ERROR_MESSAGE; - } - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java deleted file mode 100644 index 673935d696777f3708fafbe134a8a496541b0d02..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java +++ /dev/null @@ -1,48 +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 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 deleted file mode 100644 index a0e8848a34a11b3f1f1a12c961b178563d935647..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java +++ /dev/null @@ -1,58 +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 org.apache.commons.collections.MapUtils; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.NullValueCheckStrategy; - -import de.ozgcloud.common.attached_item.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 deleted file mode 100644 index 0a4d0f0660902d0e74d1b93db4a5ac09d877ddda..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java +++ /dev/null @@ -1,129 +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 java.util.Objects.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -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.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.command.Command; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.errorhandling.TechnicalException; - -@Service -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"; - public static final String FIELD_DOCUMENT_TYPE = "type"; - public static final String FIELD_DOCUMENT_FILE = "documentFile"; - public static final String FIELD_NACHRICHT_TEXT = "nachrichtText"; - - @Autowired - private AttachedItemService attachedItemService; - @Autowired - @Qualifier("bescheid_OzgCloudCommandService") - private OzgCloudCommandService commandService; - @Autowired - private CommandMapper commandMapper; - @Autowired - private DocumentMapper documentMapper; - - public String createBescheidDocument(Command command) { - return createBescheidDocument(command, buildItemMap(command)); - } - - public String createBescheidDocument(Command command, BescheidResponse bescheid) { - return createBescheidDocument(command, buildItemMap(bescheid)); - } - - String createBescheidDocument(Command command, Map<String, Object> itemMap) { - validateBescheidItem(command.getRelationId()); - var ozgCloudCommand = buildCreateDocumentOzgCommand(command, buildAttachedItem(command, itemMap)); - var executedCommand = commandService.createAndWaitUntilDone(ozgCloudCommand); - return executedCommand.getCreatedResource(); - } - - void validateBescheidItem(String bescheidId) { - var bescheidData = attachedItemService.getItem(bescheidId).getItem(); - var status = MapUtils.getString(bescheidData, Bescheid.FIELD_STATUS); - if (Bescheid.Status.DRAFT.not(status)) { - throw new TechnicalException("Bescheid is not in draft status"); - } - } - - OzgCloudCommand buildCreateDocumentOzgCommand(Command command, Map<String, Object> bodyObject) { - return OzgCloudCommand.builder() - .order(CREATE_ATTACHED_ITEM_ORDER) - .vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId())) - .relationId(commandMapper.mapRelationId(command.getVorgangId())) - .bodyObject(bodyObject) - .build(); - } - - Map<String, Object> buildAttachedItem(Command command, Map<String, Object> itemMap) { - var result = new HashMap<String, Object>(); - result.put(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId()); - result.put(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - result.put(AttachedItem.PROPERTY_ITEM_NAME, DOCUMENT_ITEM_NAME); - result.put(AttachedItem.PROPERTY_ITEM, itemMap); - return result; - } - - Map<String, Object> buildItemMap(Command command) { - var fileId = Optional.ofNullable(command.getBodyObject().get(FIELD_DOCUMENT_FILE)).map(String::valueOf) - .orElseThrow(() -> new TechnicalException("Document file is missing")); - return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId); - } - - Map<String, Object> buildItemMap(BescheidResponse bescheid) { - if (isNull(bescheid.getBescheidFileId())) { - throw new TechnicalException("Bescheid file id is missing."); - } - return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, - FIELD_DOCUMENT_FILE, bescheid.getBescheidFileId().toString(), - FIELD_NACHRICHT_TEXT, bescheid.getNachrichtText().orElse(StringUtils.EMPTY)); - } - - public Document getDocument(String id) { - return documentMapper.fromAttachedItem(attachedItemService.getItem(id)); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java deleted file mode 100644 index 66403e2e7b83b2ac4ce30cb2b532cbdca881da64..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java +++ /dev/null @@ -1,137 +0,0 @@ -package de.ozgcloud.bescheid; - -import static org.mockito.ArgumentMatchers.*; -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.Mock; -import org.springframework.beans.factory.annotation.Autowired; -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.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEventTestFactory; -import de.ozgcloud.command.CommandExecutedEvent; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.test.ITCase; - -@ITCase -class BescheidEventListenerITCase { - - private static final Command COMMAND_WITH_OTHER_ORDER = CommandTestFactory.createBuilder().order("OTHER").build(); - - @Autowired - private ApplicationEventPublisher publisher; - @SpyBean - private BescheidEventListener listener; - - @MockBean - private BescheidService service; - @MockBean - private CurrentUserService userService; - @MockBean - private UserProfileService userProfileService; - @MockBean - private OzgCloudCommandService commandService; - @MockBean - private CommandMapper commandMapper; - @MockBean - private AttachedItemService attachedItemService; - - @Mock - private UserProfile userProfile; - - @BeforeEach - void init() { - when(userProfileService.getUserProfile()).thenReturn(userProfile); - } - - @Nested - class TestCreateBescheid { - - private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.CREATE_BESCHEID_ORDER).build(); - - @Test - void shouldCallService() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); - - verify(service).createBescheidDraft(command); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(service); - } - } - - @Nested - class TestDeleteBescheid { - - private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.DELETE_BESCHEID_ORDER).build(); - - @Test - void shouldCallService() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); - - verify(attachedItemService).deleteBescheidDraft(command); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(attachedItemService); - } - } - - @Nested - class TestUpdateBescheid { - - private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.UPDATE_BESCHEID_ORDER).build(); - - @Test - void shouldCallService() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); - - verify(attachedItemService).updateBescheidDraft(any(), any()); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(attachedItemService); - } - } - - @Nested - class TestBescheidSent { - - private static final Command COMMAND = CommandTestFactory.createBuilder().order(BescheidEventListener.SEND_BESCHEID_ORDER).build(); - - @Test - void shouldCallMethod() { - publisher.publishEvent(new CommandExecutedEvent(COMMAND)); - - verify(listener).setAntragBewilligung(COMMAND); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(new CommandExecutedEvent(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(listener); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java deleted file mode 100644 index a3734e17d99a07d77410d213ebbe30415424cb1f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java +++ /dev/null @@ -1,669 +0,0 @@ -package de.ozgcloud.bescheid; - -import static de.ozgcloud.bescheid.BescheidEventListener.*; -import static de.ozgcloud.bescheid.BescheidRequestTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.function.Consumer; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.security.core.context.SecurityContext; - -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.binaryfile.BinaryFileService; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEventTestFactory; -import de.ozgcloud.command.CommandExecutedEvent; -import de.ozgcloud.command.CommandFailedEvent; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItemTestFactory; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.BescheidDocumentCreatedEvent; -import de.ozgcloud.document.Document; -import de.ozgcloud.document.DocumentService; -import de.ozgcloud.document.DocumentTestFactory; - -class BescheidEventListenerTest { - - @Spy - @InjectMocks - private BescheidEventListener listener; - - @Mock - private BescheidService service; - @Mock - private BinaryFileService fileService; - @Mock - private AttachedItemService attachedItemService; - @Mock - private DocumentService documentService; - - @Mock - private ApplicationEventPublisher eventPublisher; - @Mock - private CurrentUserService userService; - @Mock - private UserProfileService userProfileService; - @Mock - private TemplateHandler templateHandler; - - @Nested - class TestOnCreateBescheidCommand { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheid() { - listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doCreateBescheid(command); - } - } - - @Nested - class TestDoCreateBescheid { - - private static final Command COMMAND = CommandTestFactory.createBuilder() - .bodyObject( - Map.of(VORGANG_ID_BODY_KEY, VORGANG_ID.toString(), - BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING, - GENEHMIGT_BODY_KEY, GENEHMIGT)) - .build(); - - @Captor - private ArgumentCaptor<BescheidCreatedEvent> eventCaptor; - - @Test - void shouldCallCreateBescheidDraft() { - listener.doCreateBescheid(COMMAND); - - verify(service).createBescheidDraft(COMMAND); - } - - @Test - @DisplayName("should publish BescheidCreatedEvent after creating BescheidDraft") - void shouldPublishBescheidCreatedEventWithCommand() { - var createdResource = "item-id"; - when(service.createBescheidDraft(any())).thenReturn(createdResource); - - listener.doCreateBescheid(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCommand()).isSameAs(COMMAND); - } - - @Test - @DisplayName("should publish BescheidCreatedEvent with created resource") - void shouldPublishBescheidCreatedEventWithCreatedResource() { - var createdResource = "item-id"; - when(service.createBescheidDraft(any())).thenReturn(createdResource); - - listener.doCreateBescheid(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCreatedResource()).isEqualTo(createdResource); - } - } - - @Nested - class TestCreateBescheidRequest { - - private static final Command COMMAND = CommandTestFactory.createBuilder() - .vorgangId(VORGANG_ID.toString()) - .bodyObject( - Map.of(BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING, - GENEHMIGT_BODY_KEY, false)) - .build(); - - @Test - void shouldSetVorgangId() { - var request = createBescheidRequest(); - - assertThat(request.getVorgangId()).isEqualTo(VORGANG_ID); - } - - @Test - void shouldSetBescheidVom() { - var request = createBescheidRequest(); - - assertThat(request.getBescheidVom()).isEqualTo(BESCHEID_VOM); - } - - @Test - void shouldSetGenehmigt() { - var request = createBescheidRequest(); - - assertThat(request.isGenehmigt()).isFalse(); - } - - @Test - void shouldSetDefaultGenehmigt() { - Command command = CommandTestFactory.createBuilder() - .vorgangId(VORGANG_ID.toString()) - .bodyObject( - Map.of(BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING)) - .build(); - - var request = listener.createRequest(command); - - assertThat(request.isGenehmigt()).isTrue(); - } - - @Test - void shouldContainUserProfile() { - UserProfile user = UserProfileTestFactory.create(); - when(userProfileService.getUserProfile()).thenReturn(user); - - var request = listener.createRequest(COMMAND); - - assertThat(request.getCreateFor()).isSameAs(user); - } - - private BescheidRequest createBescheidRequest() { - return listener.createRequest(COMMAND); - } - } - - @Nested - class TestOnDeleteBescheid { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onDeleteBescheid(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheid() { - listener.onDeleteBescheid(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doDeleteBescheid(command); - } - } - - @Nested - class TestDoDeleteBescheid { - - @Captor - private ArgumentCaptor<BescheidDeletedEvent> bescheidDeletedEventCaptor; - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallAttachedItemService() { - listener.doDeleteBescheid(command); - - verify(attachedItemService).deleteBescheidDraft(command); - } - - @Test - void shouldPublishCommandExecutedEvent() { - listener.doDeleteBescheid(command); - - verify(eventPublisher).publishEvent(bescheidDeletedEventCaptor.capture()); - assertThat(bescheidDeletedEventCaptor.getValue().getCommand()).isSameAs(command); - } - - } - - @Nested - class TestOnUpdateBescheid { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onUpdateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheid() { - listener.onUpdateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doUpdateBescheid(command); - } - - } - - @Nested - class TestDoUpdateBescheid { - - @Captor - private ArgumentCaptor<BescheidUpdatedEvent> bescheidUpdatedEventCaptor; - - private final Command command = CommandTestFactory.createBuilder().build(); - private final Document document = DocumentTestFactory.create(); - - @BeforeEach - void mock() { - doReturn(Optional.of(document)).when(listener).getDocument(command); - } - - @Test - void shouldGetDocument() { - listener.doUpdateBescheid(command); - - verify(listener).getDocument(command); - } - - @Test - void shouldCallUpdateBescheidDraft() { - listener.doUpdateBescheid(command); - - verify(attachedItemService).updateBescheidDraft(command, Optional.of(document)); - } - - @Test - void shouldPublishBescheidUpdatedEvent() { - listener.doUpdateBescheid(command); - - verify(eventPublisher).publishEvent(bescheidUpdatedEventCaptor.capture()); - assertThat(bescheidUpdatedEventCaptor.getValue().getCommand()).isSameAs(command); - } - } - - @DisplayName("Get document") - @Nested - class TestGetDocument { - - @DisplayName("if exists") - @Nested - class TestIfExists { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @BeforeEach - void mock() { - when(documentService.getDocument(any())).thenReturn(DocumentTestFactory.create()); - } - - @Test - void shouldCallService() { - listener.getDocument(command); - - verify(documentService).getDocument(DocumentTestFactory.ID); - } - - @Test - void shouldReturnValue() { - var document = listener.getDocument(command); - - assertThat(document.get()).usingRecursiveComparison().isEqualTo(DocumentTestFactory.create()); - } - } - - @Test - void shouldReturnEmptyIfNoDocumentExists() { - var document = listener.getDocument(createCommandWithoutDocument()); - - assertThat(document).isEmpty(); - } - - private Command createCommandWithoutDocument() { - var bescheidItemMap = AttachedItemTestFactory.createBescheidItem(); - bescheidItemMap.remove(DocumentTestFactory.ID); - return CommandTestFactory.createBuilder().bodyObject(bescheidItemMap).build(); - } - } - - @Nested - class TestOnCreateBescheidDocument { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onCreatedBescheidDocument(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheidDocument() { - listener.onCreatedBescheidDocument(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doCreateBescheidDocument(command); - } - } - - @Nested - class TestDoCreateBescheidDocument { - - private static final Command COMMAND = CommandTestFactory.create(); - private static final BescheidResponse BESCHEID = BescheidResponseTestFactory.create(); - - @Captor - private ArgumentCaptor<BescheidDocumentCreatedEvent> eventCaptor; - - @BeforeEach - void init() { - doReturn(BESCHEID).when(listener).doCreateBescheidBiz(any()); - } - - @Test - void shouldCallCreateBescheidBiz() { - listener.doCreateBescheidDocument(COMMAND); - - verify(listener).doCreateBescheidBiz(COMMAND); - } - - @Test - void shouldCallCreateBescheidDocument() { - listener.doCreateBescheidDocument(COMMAND); - - verify(documentService).createBescheidDocument(COMMAND, BESCHEID); - } - - @Test - @DisplayName("should publish BescheidDocumentCreatedEvent with command") - void shouldPublishEventWithCommand() { - listener.doCreateBescheidDocument(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCommand()).isEqualTo(COMMAND); - } - - @Test - @DisplayName("should publish BescheidDocumentCreatedEvent with createdResource") - void shouldPublishEventWithCreatedResource() { - var bescheidDocument = "document-id"; - when(documentService.createBescheidDocument(any(), any(BescheidResponse.class))).thenReturn(bescheidDocument); - - listener.doCreateBescheidDocument(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCreatedResource()).isEqualTo(bescheidDocument); - } - } - - @Nested - class TestCreateBescheidBiz { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallCreateRequest() { - listener.doCreateBescheidBiz(command); - - verify(listener).createRequest(command); - } - - @Test - void shouldCallBescheidService() { - var bescheidRequest = BescheidRequestTestFactory.create(); - doReturn(bescheidRequest).when(listener).createRequest(any()); - - listener.doCreateBescheidBiz(command); - - verify(service).createBescheid(bescheidRequest); - } - - @Test - void shouldCallFileService() { - var bescheid = BescheidResponseTestFactory.create(); - when(service.createBescheid(any())).thenReturn(bescheid); - - listener.doCreateBescheidBiz(command); - - verify(fileService).uploadBescheidFile(bescheid); - } - - @Test - void shouldReturnBescheid() { - var bescheid = BescheidResponseTestFactory.create(); - when(fileService.uploadBescheidFile(any())).thenReturn(bescheid); - - var result = listener.doCreateBescheidBiz(command); - - assertThat(result).isSameAs(bescheid); - } - } - - @Nested - class TestOnSendBescheidCommand { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onSendBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteDoSendBescheid() { - listener.onSendBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doSendBescheid(command); - } - } - - @Nested - class TestDoSendBescheid { - - @Captor - private ArgumentCaptor<BescheidSentEvent> bescheidSentEventCaptor; - - @Test - void shouldThrowExceptionIfUnkonwnSendBy() { - var item = AttachedItemTestFactory.createBescheidItem(); - item.put(Bescheid.FIELD_SEND_BY, "unknown"); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build(); - when(attachedItemService.getItem(any())).thenReturn(bescheidItem); - var command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build(); - - Assertions.assertThrows(TechnicalException.class, () -> listener.doSendBescheid(command)); - } - - @DisplayName("manually") - @Nested - class TestManually { - - private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID) - .relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - private final AttachedItem bescheidItem = createManuallyBescheidItem(); - - private AttachedItem createManuallyBescheidItem() { - var attachedItem = AttachedItemTestFactory.createBescheid(); - var item = new HashMap<>(attachedItem.getItem()); - - item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL); - - return attachedItem.toBuilder().item(item).build(); - } - - @BeforeEach - void init() { - when(attachedItemService.getItem(any())).thenReturn(bescheidItem); - } - - @Test - void shouldCallSendBescheid() { - listener.doSendBescheid(COMMAND); - - verify(service).sendBescheidManually(bescheidItem, COMMAND); - verify(service, never()).sendBescheidPostfachMail(any(), any()); - } - - @Test - void shouldPublishEvent() { - listener.doSendBescheid(COMMAND); - - verify(eventPublisher).publishEvent(bescheidSentEventCaptor.capture()); - assertThat(bescheidSentEventCaptor.getValue().getCommand()).isEqualTo(COMMAND); - } - } - - @DisplayName("per postfach mail") - @Nested - class TestPostfachMail { - - private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID) - .relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - private AttachedItem bescheidItem; - - @BeforeEach - void init() { - var item = AttachedItemTestFactory.createBescheidItem(); - item.put(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()); - bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build(); - when(attachedItemService.getItem(any())).thenReturn(bescheidItem); - } - - @Test - void shouldCallBescheidService() { - listener.doSendBescheid(COMMAND); - - verify(service).sendBescheidPostfachMail(bescheidItem, COMMAND); - verify(service, never()).sendBescheidManually(any(), any()); - } - - @Test - void shouldPublishEvent() { - listener.doSendBescheid(COMMAND); - - verify(eventPublisher).publishEvent(bescheidSentEventCaptor.capture()); - assertThat(bescheidSentEventCaptor.getValue().getCommand()).isEqualTo(COMMAND); - } - } - } - - @Nested - class TestOnBescheidSent { - - private static final Command COMMAND = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onBescheidSent(new CommandExecutedEvent(COMMAND)); - - verify(listener).runWithSecurityContext(eq(COMMAND), any()); - } - - @Test - void shouldExecuteSetAntragBewilligung() { - listener.onBescheidSent(new CommandExecutedEvent(COMMAND)); - - verify(listener).setAntragBewilligung(COMMAND); - } - } - - @Nested - class TestSetAntragBewilligung { - - private static final Command COMMAND = CommandTestFactory.create(); - - @Test - void shouldCallGetItem() { - listener.setAntragBewilligung(COMMAND); - - verify(attachedItemService).getItem(CommandTestFactory.RELATION_ID); - } - - @Test - void shouldCallSetAntragBewilligung() { - var item = AttachedItemTestFactory.createBescheid(); - when(attachedItemService.getItem(any())).thenReturn(item); - - listener.setAntragBewilligung(COMMAND); - - verify(service).setAntragBewilligung(item); - } - } - - @Nested - class TestRunWithSecurityContext { - - private final Command command = CommandTestFactory.createBuilder().build(); - - @Mock - private Consumer<Command> commandExecutor; - @Mock - private SecurityContext secContext; - @Captor - private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor; - - @BeforeEach - void init() { - when(userService.startSecurityContext(any())).thenReturn(secContext); - } - - @Test - void shouldStartSecurityContext() { - listener.runWithSecurityContext(command, commandExecutor); - - verify(userService).startSecurityContext(command); - } - - @Test - void shouldExecuteCommand() { - listener.runWithSecurityContext(command, commandExecutor); - - verify(commandExecutor).accept(command); - } - - @Test - void shouldResetSecurityContext() { - listener.runWithSecurityContext(command, commandExecutor); - - verify(userService).resetSecurityContext(secContext); - } - - @Test - void shouldResetSecurityContextAfterException() { - doThrow(new RuntimeException("ups")).when(commandExecutor).accept(any()); - - listener.runWithSecurityContext(command, commandExecutor); - - verify(userService).resetSecurityContext(secContext); - } - - @Test - void shouldPublishCommandFailedEvent() { - doThrow(new RuntimeException("ups")).when(commandExecutor).accept(any()); - - listener.runWithSecurityContext(command, commandExecutor); - - verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture()); - assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId()); - assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isNotEmpty(); - } - } -} 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 04871bb15ac3d213da2197b73610bd3660bd410e..311d893f13c7e541cd15f8763e33d2736d7b3f59 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java @@ -17,11 +17,13 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.common.attached_item.AttachedItemMapper; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.attached_item.AttachedItemTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.BescheidService; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; +import de.ozgcloud.document.common.attached_item.AttachedItemMapper; +import de.ozgcloud.document.common.attached_item.AttachedItemService; import io.grpc.stub.StreamObserver; class BescheidGrpcServiceTest { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java index cdd3c20e856282db187f1f101422e449e2ecd354..58d8b89820838aba7b2f76a916c3ce1da3d91b1b 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java @@ -23,8 +23,9 @@ */ package de.ozgcloud.bescheid; -import de.ozgcloud.bescheid.BescheidManagerConfig.BescheidManagerConfigBuilder; -import de.ozgcloud.bescheid.BescheidManagerConfig.Features; +import de.ozgcloud.document.bescheid.BescheidManagerConfig; +import de.ozgcloud.document.bescheid.BescheidManagerConfig.BescheidManagerConfigBuilder; +import de.ozgcloud.document.bescheid.BescheidManagerConfig.Features; public class BescheidManagerConfigTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java index 4e867c490dcc6bdcecd99e3b26cbc221caf686be..feabd948c1bd5f5233bcc69761dd1fc5eb040bd7 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java @@ -19,9 +19,11 @@ import org.mockito.Spy; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.document.DocumentTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.document.common.attached_item.AttachedItemService; class BescheidMapperTest { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java deleted file mode 100644 index dbe4f9e43deb4fbcd43ea0b8b960bc3861570174..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.time.LocalDate; - -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; - -public class BescheidRequestTestFactory { - - static final VorgangId VORGANG_ID = VorgangTestFactory.ID; - static final String BESCHEID_VOM_STRING = "2023-01-04"; - static final LocalDate BESCHEID_VOM = LocalDate.parse(BESCHEID_VOM_STRING); - static final boolean GENEHMIGT = true; - - public static BescheidRequest create() { - return createBuilder().build(); - } - - public static BescheidRequest.BescheidRequestBuilder createBuilder() { - return BescheidRequest.builder() - .vorgangId(VORGANG_ID) - .bescheidVom(BESCHEID_VOM) - .genehmigt(GENEHMIGT) - .createFor(UserProfileTestFactory.create()); - - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java deleted file mode 100644 index 94581c9fe21016dfb70cdb0b7f5279b42f877b94..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.io.File; -import java.util.Optional; - -import org.springframework.http.MediaType; - -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.document.DocumentTestFactory; - -public class BescheidResponseTestFactory { - - public static final String BESCHEID_FILE_NAME = "testbescheid"; - public static final File BESCHEID_FILE = TempFileUtils.writeTmpFile(BESCHEID_FILE_NAME.getBytes()); - public static final int BESCHEID_FILE_SIZE = BESCHEID_FILE_NAME.getBytes().length; - - public static final String CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE; - - public static BescheidResponse create() { - return createBuilder().build(); - } - - public static BescheidResponse.BescheidResponseBuilder createBuilder() { - return BescheidResponse.builder() - .createdBy(UserProfileTestFactory.ID) - .vorgangId(VorgangTestFactory.ID) - .contentType(CONTENT_TYPE) - .bescheidFileName(BESCHEID_FILE_NAME) - .bescheidFile(BESCHEID_FILE) - .bescheidFileId(FileId.from(DocumentTestFactory.ID)) - .nachrichtSubject(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)) - .nachrichtText(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)) - .bewilligt(BescheidTestFactory.BEWILLIGT) - .size(BESCHEID_FILE_SIZE) - .attachments(BescheidTestFactory.ATTACHMENTS) - .serviceKonto(ServiceKontoTestFactory.create()); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java deleted file mode 100644 index e593e429c550d90454013369ab01640091b5afef..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java +++ /dev/null @@ -1,1599 +0,0 @@ -package de.ozgcloud.bescheid; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.boot.info.BuildProperties; -import org.springframework.test.util.ReflectionTestUtils; - -import de.ozgcloud.apilib.common.command.OzgCloudCommand; -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.apilib.common.datatypes.GenericId; -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.administration.AdministrationService; -import de.ozgcloud.bescheid.attributes.ClientAttributeService; -import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.vorgang.PostfachAddressTestFactory; -import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangService; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItemTestFactory; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.datatype.StringBasedValue; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.DocumentTestFactory; - -class BescheidServiceTest { - - @Spy - @InjectMocks - private BescheidService service; - - @Mock - private VorgangService vorgangService; - @Mock - private AttachedItemService attachedItemService; - @Mock - private UserProfileService userProfileService; - @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; - @Mock - private ClientAttributeService clientAttributeService; - @Mock - private BuildProperties buildProperties; - @Mock - private BescheidRemoteService remoteService; - @Mock - private BescheidMapper mapper; - @Mock - private AdministrationService administrationService; - @Mock - private TemplateHandler templateHandler; - - @BeforeEach - void init() { - ReflectionTestUtils.setField(service, "remoteService", Optional.of(remoteService)); - } - - @Nested - class TestFindDraft { - - private final AttachedItem vorgangAttachedItem = AttachedItemTestFactory.create(); - - private final Bescheid bescheid = BescheidTestFactory.create(); - - @BeforeEach - void mock() { - when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(vorgangAttachedItem)); - when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid); - } - - @Test - void shouldCallVorgangAttachedItemRemoteService() { - service.findDraft(VorgangTestFactory.ID_STR); - - verify(attachedItemService).findBescheidItem(VorgangTestFactory.ID); - } - - @Test - void shouldCallMapper() { - service.findDraft(VorgangTestFactory.ID_STR); - - verify(mapper).mapFromAttachedItem(vorgangAttachedItem); - } - - @Test - void shouldReturnValue() { - var draft = service.findDraft(VorgangTestFactory.ID_STR); - - assertThat(draft).hasValue(bescheid); - } - } - - @DisplayName("Find all") - @Nested - class TestFindAll { - - private final AttachedItem attachedItem = AttachedItemTestFactory.create(); - private final Bescheid bescheid = BescheidTestFactory.create(); - - @BeforeEach - void mock() { - when(attachedItemService.findAllBescheid(any())).thenReturn(Collections.singleton(attachedItem)); - when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid); - } - - @Test - void shouldCallVorgangAttachedItemService() { - findAll(); - - verify(attachedItemService).findAllBescheid(VorgangTestFactory.ID); - } - - @Test - void shouldCallMapper() { - findAll(); - - verify(mapper).mapFromAttachedItem(attachedItem); - } - - @Test - void shouldReturnValue() { - var bescheide = findAll(); - - assertThat(bescheide).containsExactly(bescheid); - } - - private List<Bescheid> findAll() { - return service.findAll(VorgangTestFactory.ID).toList(); - } - } - - @Nested - class TestCreateBescheidDraft { - - private static final Map<String, Object> COMMAND_BODY = Map.of("key", "value"); - private static final Command COMMAND = CommandTestFactory.createBuilder().bodyObject(COMMAND_BODY).build(); - private static final Bescheid BESCHEID_DRAFT = BescheidTestFactory.create(); - - @BeforeEach - void init() { - doNothing().when(service).validateBescheidData(any()); - doReturn(BESCHEID_DRAFT).when(service).buildBescheidDraft(any()); - } - - @Test - void shouldCallValidateBescheidData() { - service.createBescheidDraft(COMMAND); - - verify(service).validateBescheidData(COMMAND_BODY); - } - - @Test - void shouldCallAttachedItemService() { - service.createBescheidDraft(COMMAND); - - verify(attachedItemService).createBescheidDraft(BESCHEID_DRAFT); - } - - @Test - void shouldReturnResult() { - var createdBescheidId = "created-bescheid-id"; - when(attachedItemService.createBescheidDraft(any(Bescheid.class))).thenReturn(createdBescheidId); - - var result = service.createBescheidDraft(COMMAND); - - assertThat(result).isEqualTo(createdBescheidId); - } - } - - @Nested - class TestValidateBescheidData { - - private static final Command CREATE_BESCHEID_DRAFT_COMMAND = CommandTestFactory.createBuilder() - .bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldValidate() { - assertDoesNotThrow(() -> service.validateBescheidData(CREATE_BESCHEID_DRAFT_COMMAND.getBodyObject())); - } - - @DisplayName("should fail if bescheidAm is missing") - @Test - void shouldThrowExceptionByBescheidAm() { - var map = Map.<String, Object>of(Bescheid.FIELD_BEWILLIGT, true); - - assertThrows(TechnicalException.class, () -> service.validateBescheidData(map)); - } - - @DisplayName("should fail if bewilligt is missing") - @Test - void shouldThrowExceptionByBewilligt() { - var map = Map.<String, Object>of(Bescheid.FIELD_BESCHIEDEN_AM, "2021-01-01"); - - assertThrows(TechnicalException.class, () -> service.validateBescheidData(map)); - } - - @Test - void shouldValidateSendBy() { - var bodyObject = Map.<String, Object>of(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); - doNothing().when(service).validateBescheidField(any(), any()); - - service.validateBescheidData(bodyObject); - - verify(service).validateSendBy(SendBy.MANUAL.name()); - } - - @DisplayName("validate sendBy") - @Nested - class TestValidateSendBy { - - @ValueSource(strings = { "not-exist", "" }) - @ParameterizedTest - void shouldThrowExceptionOnNonExistingSendByValue(String sendBy) { - assertThrows(TechnicalException.class, () -> service.validateSendBy(sendBy)); - } - - @EnumSource(names = { "NACHRICHT", "MANUAL" }) - @ParameterizedTest - void shouldNotThrowAnyExceptionOnExistingSendByValue(SendBy sendBy) { - assertDoesNotThrow(() -> service.validateSendBy(sendBy.name())); - } - } - } - - @Nested - class TestBuildBescheidDraft { - - private static final Command CREATE_BESCHEID_DRAFT_COMMAND = CommandTestFactory.createBuilder() - .bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - private final Bescheid bescheid = BescheidTestFactory.createBuilder().status(Bescheid.Status.SENT).build(); - - @BeforeEach - void init() { - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - } - - @Test - void shouldCallMapFromCommand() { - buildBescheidDraft(); - - verify(mapper).mapFromCommand(CREATE_BESCHEID_DRAFT_COMMAND); - } - - @Test - void shouldResetId() { - var result = buildBescheidDraft(); - - assertThat(result.getId()).isNull(); - } - - @Test - void shouldResetVersion() { - var result = buildBescheidDraft(); - - assertThat(result.getVersion()).isZero(); - } - - @Test - void shouldSetStatus() { - var result = buildBescheidDraft(); - - assertThat(result.getStatus()).isEqualTo(Bescheid.Status.DRAFT); - } - - @Test - void shouldNotOverrideNachrichtSubject() { - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtSubject()).contains(BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldSetNachrichtSubject() { - var bescheid = BescheidTestFactory.createBuilder().nachrichtSubject(Optional.empty()).build(); - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtSubject()).contains(BescheidService.SUBJECT); - } - - @Test - void shouldNotOverrideNachrichtText() { - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtText()).contains(BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldCallCreateNachrichtText() { - var createdText = "created text"; - doReturn(createdText).when(service).createNachrichtText(); - var bescheid = BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build(); - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - - buildBescheidDraft(); - - verify(service).createNachrichtText(); - } - - @Test - void shouldSetNachrichtText() { - var createdText = "created text"; - doReturn(createdText).when(service).createNachrichtText(); - var bescheid = BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build(); - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtText()).contains(createdText); - } - - private Bescheid buildBescheidDraft() { - return service.buildBescheidDraft(CREATE_BESCHEID_DRAFT_COMMAND); - } - } - - @Nested - class TestCreateNachrichtText { - - @Captor - private ArgumentCaptor<Map<String, Object>> signatureCaptor; - - @Test - void shouldCallGetTemplateParameters() { - service.createNachrichtText(); - - verify(service).getTemplateParameters(); - } - - @Test - void shouldCallFillTemplate() { - var parameterMap = Map.<String, Object>of("key", "value"); - doReturn(parameterMap).when(service).getTemplateParameters(); - - service.createNachrichtText(); - - verify(templateHandler).fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, parameterMap); - } - - @Test - void shouldReturnNachricht() { - when(templateHandler.fillTemplate(any(), any())).thenReturn(BescheidTestFactory.NACHRICHT_TEXT); - - var result = service.createNachrichtText(); - - assertThat(result).isEqualTo(BescheidTestFactory.NACHRICHT_TEXT); - } - } - - @Nested - class TestGetTemplateParameters { - - @Test - void shouldCallAdministrationService() { - service.createNachrichtText(); - - verify(administrationService).getNachrichtSignature(); - } - - @Test - void shouldReturnParameters() { - var signature = "signature"; - when(administrationService.getNachrichtSignature()).thenReturn(Optional.of(signature)); - - var result = service.getTemplateParameters(); - - assertThat(result).containsEntry(BescheidService.KEY_TEMPLATE_SIGNATURE, signature); - } - - @Test - void shouldReturnEmptyMap() { - var result = service.getTemplateParameters(); - - assertThat(result).isEmpty(); - } - } - - @Nested - class TestCreateBescheid { - - private final Vorgang vorgang = VorgangTestFactory.create(); - private final BescheidResponse bescheid = BescheidResponseTestFactory.createBuilder().vorgangId(null).build(); - - @BeforeEach - void initMocks() { - when(vorgangService.getById(any())).thenReturn(vorgang); - when(remoteService.create(any(), any())).thenReturn(bescheid); - } - - @Test - void shouldLoadVorgang() { - service.createBescheid(BescheidRequestTestFactory.create()); - - verify(vorgangService).getById(VorgangTestFactory.ID); - } - - @Test - void shouldCreateBescheid() { - BescheidRequest request = BescheidRequestTestFactory.create(); - - service.createBescheid(request); - - verify(remoteService).create(request, vorgang); - } - - @Test - void shouldReturnCreatedBescheid() { - var result = service.createBescheid(BescheidRequestTestFactory.create()); - - assertThat(result).usingRecursiveComparison().isEqualTo(BescheidResponseTestFactory.create()); - } - } - - @Nested - class TestSendBescheidManually { - - private static final Vorgang VORGANG = VorgangTestFactory.create(); - - @Mock - private OzgCloudCommand subCommand; - - @Captor - private ArgumentCaptor<VorgangId> vorgangIdCaptor; - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void init() { - doNothing().when(service).validateBescheidSendManually(any(), anyLong()); - doNothing().when(service).addSubCommands(any(), any()); - doReturn(UserProfileTestFactory.ID_STR).when(service).getUserId(); - doReturn(List.of(subCommand)).when(service).buildSetBescheidSentSubCommands(any(), any(), any()); - when(vorgangService.getById(any())).thenReturn(VORGANG); - } - - @Test - void shouldCallValidateBescheid() { - sendBescheid(); - - verify(service).validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldCallGetVorgang() { - sendBescheid(); - - verify(vorgangService).getById(vorgangIdCaptor.capture()); - assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldCallGetUserId() { - sendBescheid(); - - verify(service).getUserId(); - } - - @Test - void shouldCallBuildSetBescheidSentSubCommands() { - sendBescheid(); - - verify(service).buildSetBescheidSentSubCommands(bescheidItem, VORGANG, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldCallAddSubCommands() { - sendBescheid(); - - verify(service).addSubCommands(CommandTestFactory.ID, List.of(subCommand)); - } - - private void sendBescheid() { - var parentCommand = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build(); - service.sendBescheidManually(bescheidItem, parentCommand); - } - } - - @Nested - class TestValidateBescheidSendManually { - - private final AttachedItem attachedItem = createManuallySendBescheid(); - - private AttachedItem createManuallySendBescheid() { - var bescheidItem = AttachedItemTestFactory.createBescheid(); - var item = new HashMap<>(bescheidItem.getItem()); - - item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); - - return bescheidItem.toBuilder().item(item).build(); - } - - @Test - void shouldCallValidateBescheid() { - service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION); - - verify(service).validateBescheid(attachedItem, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldValidate() { - doNothing().when(service).validateBescheid(any(), anyLong()); - - assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION)); - } - - @DisplayName("should decline when") - @ParameterizedTest(name = "sendBy = {0}") - @EnumSource(value = Bescheid.SendBy.class, names = "MANUAL", mode = EnumSource.Mode.EXCLUDE) - void shouldDeclineSendByNotManual(Bescheid.SendBy sendBy) { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name()).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("sendBy"); - } - } - - @Nested - class TestSendBescheidPostfachMail { - - private static final Command PARENT_COMMAND = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build(); - private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create(); - private static final Vorgang VORGANG = VorgangTestFactory.createBuilder().serviceKonto(SERVICE_KONTO).build(); - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private OzgCloudCommand setBescheidSentSubCommand; - @Mock - private OzgCloudCommand sendPostfachNachrichtSubCommand; - @Captor - private ArgumentCaptor<VorgangId> vorgangIdCaptor; - @Captor - private ArgumentCaptor<List<OzgCloudCommand>> subCommandsCaptor; - - @BeforeEach - void init() { - doNothing().when(service).validateBescheidSendPostfach(any(), anyLong()); - doNothing().when(service).addSubCommands(any(), any()); - doReturn(UserProfileTestFactory.ID_STR).when(service).getUserId(); - var subCommands = new ArrayList<OzgCloudCommand>(); - subCommands.add(setBescheidSentSubCommand); - doReturn(subCommands).when(service).buildSetBescheidSentSubCommands(any(), any(), any()); - doReturn(sendPostfachNachrichtSubCommand).when(service).buildSendPostfachNachrichtCommand(any(), any(), any()); - when(vorgangService.getById(any())).thenReturn(VORGANG); - } - - @Test - void shouldCallValidateBescheid() { - sendBescheid(); - - verify(service).validateBescheidSendPostfach(BESCHEID_ITEM, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldCallVorgangService() { - sendBescheid(); - - verify(vorgangService).getById(vorgangIdCaptor.capture()); - assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldCallGetUserId() { - sendBescheid(); - - verify(service).getUserId(); - } - - @Test - void shouldCallBuildSetBescheidSentSubCommands() { - sendBescheid(); - - verify(service).buildSetBescheidSentSubCommands(BESCHEID_ITEM, VORGANG, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldCallBuildSendPostfachNachrichtCommand() { - sendBescheid(); - - verify(service).buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldCallAddSubCommands() { - sendBescheid(); - - verify(service).addSubCommands(eq(CommandTestFactory.ID), subCommandsCaptor.capture()); - assertThat(subCommandsCaptor.getValue()).containsExactly(setBescheidSentSubCommand, sendPostfachNachrichtSubCommand); - } - - private void sendBescheid() { - service.sendBescheidPostfachMail(BESCHEID_ITEM, PARENT_COMMAND); - } - } - - @Nested - class TestValidateBescheidSendPostfach { - - @Test - void shouldCallValidateBescheid() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION); - - verify(service).validateBescheid(bescheidItem, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldValidate() { - doNothing().when(service).validateBescheid(any(), anyLong()); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - assertDoesNotThrow(() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)); - } - - @DisplayName("should decline when") - @ParameterizedTest(name = "sendBy = {0}") - @EnumSource(value = Bescheid.SendBy.class, names = "NACHRICHT", mode = EnumSource.Mode.EXCLUDE) - void shouldDeclineSendByNotPostfach(Bescheid.SendBy sendBy) { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("sendBy"); - } - - @Test - void shouldDeclineWhenNoSubject() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, null) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("nachricht subject"); - } - - @Test - void shouldDeclineWhenNoText() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, null).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("nachricht text"); - } - } - - @Nested - class TestValidateBescheid { - - private final AttachedItem attachedItem = createManuallySendBescheid(); - - private AttachedItem createManuallySendBescheid() { - var bescheidItem = AttachedItemTestFactory.createBescheid(); - var item = new HashMap<>(bescheidItem.getItem()); - - item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); - - return bescheidItem.toBuilder().item(item).build(); - } - - @Test - void shouldValidateBescheid() { - assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION)); - } - - @DisplayName("should decline when") - @ParameterizedTest(name = "status = {0}") - @EnumSource(value = Bescheid.Status.class, names = "DRAFT", mode = EnumSource.Mode.EXCLUDE) - void shouldDeclineNotDraft(Bescheid.Status status) { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_STATUS, status.name()).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("has status"); - } - - @Test - void shouldDeclineWhenNoDocument() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, null).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("document"); - } - - @Test - void shouldDeclineWhenVersionMismatch() { - var bescheidItem = AttachedItemTestFactory.createBescheid(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION + 1)).getMessage(); - assertThat(message).contains("version"); - } - } - - @Nested - class TestGetAttachments { - - @Test - void shouldReturnEmptyList() { - var result = service.getAttachments(AttachedItemTestFactory.createBescheidBuilder().clearItem().build()); - - assertThat(result).isEmpty(); - } - - @Nested - class TestWithCollection { - - @Test - void shouldReturnAttachments() { - var result = service.getAttachments(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsExactly(BescheidTestFactory.ATTACHMENT, BescheidTestFactory.ATTACHMENT); - } - - @Test - void shouldReturnEmpty() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_ATTACHMENTS, Collections.emptyList()).build(); - - var result = service.getAttachments(bescheidItem); - - assertThat(result).isEmpty(); - } - - } - - @Nested - class TestSingleAttachment { - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_ATTACHMENTS, BescheidTestFactory.ATTACHMENT).build(); - - @Test - void shouldCallGetStringAsList() { - service.getAttachments(bescheidItem); - - verify(service).getStringAsList(BescheidTestFactory.ATTACHMENT); - } - - @Test - void shouldReturnBescheidFileIdList() { - var expectedResult = List.of(BescheidTestFactory.ATTACHMENT); - doReturn(expectedResult).when(service).getStringAsList(any()); - - var result = service.getAttachments(bescheidItem); - - assertThat(result).isSameAs(expectedResult); - } - } - } - - @Nested - class TestGetStringAsList { - - @DisplayName("should return empty list when") - @ParameterizedTest(name = "value = \"{0}\"") - @NullSource - @ValueSource(strings = { "", " " }) - void shouldReturnEmptyListOnBlankValue(String value) { - var result = service.getStringAsList(value); - - assertThat(result).isEmpty(); - } - - @Test - void shouldReturnEmptyListOnUnexpectedType() { - var result = service.getStringAsList(0); - - assertThat(result).isEmpty(); - } - } - - @Nested - class TestAddSubCommands { - - @Mock - private OzgCloudCommand subCommand; - @Mock - private OzgCloudCreateSubCommandsRequest createSubCommandsRequest; - - @Test - void shouldCallBuildCreateSubCommandsRequest() { - var subCommands = List.of(subCommand); - - service.addSubCommands(CommandTestFactory.ID, subCommands); - - verify(service).buildCreateSubCommandsRequest(CommandTestFactory.ID, subCommands); - } - - @Test - void shouldCallCommandService() { - doReturn(createSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any()); - - service.addSubCommands(CommandTestFactory.ID, List.of(subCommand)); - - verify(commandService).addSubCommands(createSubCommandsRequest); - } - } - - @Nested - class TestGetBescheidFileId { - - @BeforeEach - void init() { - when(attachedItemService.getItem(anyString())).thenReturn(AttachedItemTestFactory.createDocument()); - } - - @Test - void shouldCallGetItem() { - service.getBescheidFileId(AttachedItemTestFactory.createBescheid()); - - verify(attachedItemService).getItem(DocumentTestFactory.ID); - } - - @Test - void shouldReturnBescheidFileId() { - var result = service.getBescheidFileId(AttachedItemTestFactory.createBescheid()); - - assertThat(result).hasToString(DocumentTestFactory.DOCUMENT_FILE); - } - } - - @Nested - class TestGetNachrichtSubject { - - @Test - void shouldReturnSubject() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_SUBJECT, - BescheidTestFactory.NACHRICHT_SUBJECT)).build(); - - var result = service.getNachrichtSubject(bescheidItem); - - assertThat(result).contains(BescheidTestFactory.NACHRICHT_SUBJECT); - } - } - - @Nested - class TestGetNachrichtText { - - @Test - void shouldReturnText() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_TEXT, - BescheidTestFactory.NACHRICHT_TEXT)).build(); - - var result = service.getNachrichtText(bescheidItem); - - assertThat(result).contains(BescheidTestFactory.NACHRICHT_TEXT); - } - } - - @Nested - class TestGetUserId { - - @Mock - private UserProfile userProfile; - - @BeforeEach - void init() { - when(userProfileService.getUserProfile()).thenReturn(userProfile); - when(userProfile.getId()).thenReturn(UserProfileTestFactory.ID); - - } - - @Test - void shouldCallGetUserProfile() { - service.getUserId(); - - verify(userProfileService).getUserProfile(); - } - - @Test - void shouldReturnUserId() { - var result = service.getUserId(); - - assertThat(result).isEqualTo(UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildSetBescheidSentCommands { - - @Mock - private AttachedItem bescheidItem; - @Mock - private Vorgang vorgang; - @Mock - private OzgCloudCommand vorgangBescheidenCommand; - @Mock - private OzgCloudCommand setBescheidSentStatusCommand; - - @BeforeEach - void inti() { - doReturn(vorgangBescheidenCommand).when(service).buildVorgangBescheidenCommand(any()); - doReturn(setBescheidSentStatusCommand).when(service).buildSetBescheidSentStatusCommand(any(), any()); - } - - @Test - void shouldCallBuildVorgangBescheidenCommand() { - buildSetBescheidSentCommands(); - - verify(service).buildVorgangBescheidenCommand(vorgang); - } - - @Test - void shouldCallBuildSetBescheidSentStatusCommand() { - buildSetBescheidSentCommands(); - - verify(service).buildSetBescheidSentStatusCommand(bescheidItem, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldReturnResult() { - var result = buildSetBescheidSentCommands(); - - assertThat(result).containsExactly(vorgangBescheidenCommand, setBescheidSentStatusCommand); - } - - private List<OzgCloudCommand> buildSetBescheidSentCommands() { - return service.buildSetBescheidSentSubCommands(bescheidItem, vorgang, UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildVorgangBescheidenCommand { - - private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString()); - private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString()); - - @BeforeEach - void init() { - when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(VORGANG_ID); - when(commandMapper.mapRelationId(anyString())).thenReturn(RELATION_ID); - } - - @Test - void shouldCallMapVorgangId() { - buildVorgangBescheidenCommand(); - - verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetVorgangId() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID); - } - - @Test - void shouldCallMapRelationId() { - buildVorgangBescheidenCommand(); - - verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetRelationId() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getRelationId()).isEqualTo(RELATION_ID); - } - - @Test - void shouldSetRelationVersion() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getRelationVersion()).isEqualTo(VorgangTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getOrder()).isEqualTo(BescheidService.VORGANG_BESCHEIDEN_ORDER); - } - - private OzgCloudCommand buildVorgangBescheidenCommand() { - return service.buildVorgangBescheidenCommand(VorgangTestFactory.create()); - } - } - - @Nested - class TestBuildSetBescheidSentStatusCommand { - - private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString()); - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void init() { - when(commandMapper.mapRelationId(any())).thenReturn(RELATION_ID); - } - - @Test - void shouldCallMapRelationId() { - buildSetBescheidSentStatusCommand(); - - verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetRelationId() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getRelationId()).isEqualTo(RELATION_ID); - } - - @Test - void shouldSetRelationVersion() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM); - } - - @Test - void shouldSetPropertyId() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getBodyObject()).containsEntry(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID); - } - - @Test - void shouldCallBuildBescheidSentStatusItem() { - buildSetBescheidSentStatusCommand(); - - verify(service).buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - } - - @Test - void shouldSetPropertyItem() { - var itemMap = Map.of("key", "value"); - doReturn(itemMap).when(service).buildBescheidSentStatusItem(any()); - - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getBodyObject()).containsEntry(AttachedItem.PROPERTY_ITEM, itemMap); - } - - private OzgCloudCommand buildSetBescheidSentStatusCommand() { - return service.buildSetBescheidSentStatusCommand(BESCHEID_ITEM, UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildBescheidSentStatusItem { - - @Test - void shouldSetStatus() { - var result = service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - - assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name()); - } - - @Test - void shouldCallBuildSentInfoMap() { - service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - - verify(service).buildSentInfoMap(UserProfileTestFactory.ID_STR); - } - - @Test - void shouldSetSentInfo() { - var sentInfoMap = Map.of("key", "value"); - doReturn(sentInfoMap).when(service).buildSentInfoMap(any()); - - var result = service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - - assertThat(result).containsEntry(Bescheid.FIELD_SENT_INFO, sentInfoMap); - } - } - - @Nested - class TestBuildSentInfoMap { - - @Test - void shouldSetSentAt() { - var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR); - - assertThat(getSentAt(result)).isCloseTo(ZonedDateTime.now(), within(1, ChronoUnit.SECONDS)); - } - - @Test - void shouldSetSentBy() { - var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR); - - assertThat(result).containsEntry(SentInfo.FIELD_SENT_BY, UserProfileTestFactory.ID_STR); - } - - private ZonedDateTime getSentAt(Map<String, Object> sentInfoMap) { - return ZonedDateTime.parse((String) sentInfoMap.get(SentInfo.FIELD_SENT_AT), DateTimeFormatter.ISO_DATE_TIME); - } - } - - @Nested - class TestBuildSendPostfachNachrichtCommand { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - private static final Vorgang.PostfachAddress POSTFACH_ADDRESS = PostfachAddressTestFactory.create(); - private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.createBuilder().clearPostfachAddresses() - .postfachAddress(POSTFACH_ADDRESS).build(); - private static final OzgCloudUserId OZG_CLOUD_ID = OzgCloudUserId.from(UserProfileTestFactory.ID_STR); - private static final Map<String, Object> OBJECT_MAP = Map.of("key", "value"); - private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString()); - private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString()); - - @BeforeEach - void init() { - when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(VORGANG_ID); - when(commandMapper.mapRelationId(anyString())).thenReturn(RELATION_ID); - when(commandMapper.toOzgCloudUserId(anyString())).thenReturn(OZG_CLOUD_ID); - doReturn(OBJECT_MAP).when(service).buildSendNachrichtCommandBody(any(), any()); - } - - @Test - void shouldCallBuildPostfachAddress() { - buildSendPostfachNachrichtCommand(); - - verify(service).buildPostfachAddress(POSTFACH_ADDRESS, ServiceKontoTestFactory.TYPE); - } - - @Test - void shouldCallBuildSenNachrichtCommandBody() { - var postfachAddressMap = Map.<String, Object>of("key", "value"); - doReturn(postfachAddressMap).when(service).buildPostfachAddress(any(), any()); - - buildSendPostfachNachrichtCommand(); - - verify(service).buildSendNachrichtCommandBody(BESCHEID_ITEM, postfachAddressMap); - } - - @Test - void shouldSetBodyObject() { - var result = buildSendPostfachNachrichtCommand(); - - assertThat(result.getBodyObject()).isSameAs(OBJECT_MAP); - } - - @Test - void shouldCallMapVorgangId() { - buildSendPostfachNachrichtCommand(); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var result = buildSendPostfachNachrichtCommand(); - - assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID); - } - - @Test - void shouldCallMapRelationId() { - buildSendPostfachNachrichtCommand(); - - verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetRelationId() { - var result = buildSendPostfachNachrichtCommand(); - - assertThat(result.getRelationId()).isEqualTo(RELATION_ID); - } - - @Test - void shouldSetOrder() { - var result = buildSendPostfachNachrichtCommand(); - - assertThat(result.getOrder()).isEqualTo(BescheidService.SEND_POSTFACH_NACHRICHT_ORDER); - } - - @Test - void shouldCallMapToOzgCloudUserId() { - buildSendPostfachNachrichtCommand(); - - verify(commandMapper).toOzgCloudUserId(UserProfileTestFactory.ID_STR); - } - - @Test - void shouldSetCreatedBy() { - var result = buildSendPostfachNachrichtCommand(); - - assertThat(result.getCreatedBy()).isEqualTo(OZG_CLOUD_ID); - } - - private OzgCloudCommand buildSendPostfachNachrichtCommand() { - return service.buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildPostfachAddress { - - @Test - void shouldSetType() { - var result = buildPostfachAddress(); - - assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_TYPE, PostfachAddressTestFactory.TYPE); - } - - @Test - void shouldSetVersion() { - var result = buildPostfachAddress(); - - assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_VERSION, PostfachAddressTestFactory.VERSION); - } - - @Test - void shouldSetIdentifier() { - var result = buildPostfachAddress(); - - assertThat(result).extracting(Vorgang.PostfachAddress.FIELD_IDENTIFIER, MAP) - .containsEntry(BescheidService.FIELD_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID); - } - - @Test - void shouldSetServicekontoType() { - var result = buildPostfachAddress(); - - assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, ServiceKontoTestFactory.TYPE); - } - - private Map<String, Object> buildPostfachAddress() { - return service.buildPostfachAddress(PostfachAddressTestFactory.create(), ServiceKontoTestFactory.TYPE); - } - } - - @Nested - class TestBuildSendNachrichtCommandBody { - - private static final Map<String, Object> SERVICE_KONTO_MAP = Map.of("key", "value"); - - @Mock - private AttachedItem bescheidItem; - - private Map<String, Object> buildSendNachrichtCommandBody() { - return service.buildSendNachrichtCommandBody(bescheidItem, SERVICE_KONTO_MAP); - } - - @Nested - class TestWithValuesFromBescheidItem { - - @BeforeEach - void init() { - doReturn(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any()); - doReturn(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any()); - doReturn(List.of(BescheidTestFactory.ATTACHMENT)).when(service).buildAttachments(any()); - } - - @Test - void shouldSetReplyOption() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_REPLY_OPTION, BescheidService.REPLY_OPTION); - } - - @Test - void shouldCallGetNachrichtSubject() { - buildSendNachrichtCommandBody(); - - verify(service).getNachrichtSubject(bescheidItem); - } - - @Test - void shouldSetSubject() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldCallGetNachrichtText() { - buildSendNachrichtCommandBody(); - - verify(service).getNachrichtText(bescheidItem); - } - - @Test - void shouldSetMailBody() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldCallBuildAttachments() { - buildSendNachrichtCommandBody(); - - verify(service).buildAttachments(bescheidItem); - } - - @Test - void shouldSetAttachments() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(BescheidTestFactory.ATTACHMENT); - } - - @Test - void shouldSetPostfachAddress() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, SERVICE_KONTO_MAP); - } - } - - @Nested - class TestWithDefaultValues { - - @BeforeEach - void init() { - doReturn(Optional.empty()).when(service).getNachrichtSubject(any()); - doReturn(Optional.empty()).when(service).getNachrichtText(any()); - doReturn(Collections.emptyList()).when(service).buildAttachments(any()); - } - - @Test - void shouldSetSubject() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidService.SUBJECT); - } - - @Test - void shouldSetMailBody() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, StringUtils.EMPTY); - } - } - } - - @Nested - class TestBuildAttachments { - - private static final String BESCHEID_FILE_ID = "bescheid-file-id"; - private static final String ATTACHMENT_FILE_ID = "attachment-file-id"; - - @Mock - private AttachedItem bescheidItem; - - @BeforeEach - void init() { - doReturn(FileId.from(BESCHEID_FILE_ID)).when(service).getBescheidFileId(any()); - doReturn(List.of(FileId.from(ATTACHMENT_FILE_ID))).when(service).getAttachments(any()); - } - - @Test - void shouldCallGetBescheidFileId() { - buildAttachments(); - - verify(service).getBescheidFileId(bescheidItem); - } - - @Test - void shouldCallGetAttachments() { - buildAttachments(); - - verify(service).getAttachments(bescheidItem); - } - - @Test - void shouldReturnAllAttachments() { - var result = buildAttachments(); - - assertThat(result).containsExactly(BESCHEID_FILE_ID, ATTACHMENT_FILE_ID); - } - - private List<String> buildAttachments() { - return service.buildAttachments(bescheidItem); - } - } - - @Nested - class TestSetAntragResult { - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @Test - void shouldCallGetBewilligt() { - service.setAntragBewilligung(bescheidItem); - - verify(service).getBewilligt(bescheidItem); - } - - @Test - void shouldCallClientAttributeService() { - doReturn(true).when(service).getBewilligt(any()); - - service.setAntragBewilligung(bescheidItem); - - verify(clientAttributeService).setAntragResult(CommandTestFactory.VORGANG_ID, true); - } - - @Test - void shouldCatchException() { - doThrow(new TechnicalException("error")).when(clientAttributeService).setAntragResult(anyString(), anyBoolean()); - - assertDoesNotThrow(() -> service.setAntragBewilligung(bescheidItem)); - } - } - - @Nested - class TestGetBewilligt { - - @Test - void shouldReturnBewilligt() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_BEWILLIGT, true).build(); - - var result = service.getBewilligt(bescheidItem); - - assertThat(result).isTrue(); - } - - @Test - void shouldReturnDefault() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().build(); - - var result = service.getBewilligt(bescheidItem); - - assertThat(result).isFalse(); - } - } - - @Nested - class TestGetConfig { - - @Test - void shouldCallGetVersion() { - service.getConfig(); - - verify(buildProperties).getVersion(); - } - - @Test - void shouldSetBescheidManagerVersion() { - when(buildProperties.getVersion()).thenReturn(BescheidManagerConfigTestFactory.VERSION); - - var result = service.getConfig(); - - assertThat(result.getVersion()).isEqualTo(BescheidManagerConfigTestFactory.VERSION); - } - - @Test - void shouldCallGetJavaVersion() { - service.getConfig(); - - verify(service).getJavaVersion(); - } - - @Test - void shouldSetJavaVersion() { - when(service.getJavaVersion()).thenReturn(BescheidManagerConfigTestFactory.JAVA_VERSION); - - var result = service.getConfig(); - - assertThat(result.getJavaVersion()).isEqualTo(BescheidManagerConfigTestFactory.JAVA_VERSION); - } - - @Test - void shouldCallBuildFeatures() { - service.getConfig(); - - verify(service).buildFeatures(); - } - - @Test - void shouldSetFeatures() { - var features = BescheidManagerConfig.Features.builder().build(); - when(service.buildFeatures()).thenReturn(features); - - var result = service.getConfig(); - - assertThat(result.getFeatures()).isSameAs(features); - } - - } - - @Nested - class TestBuildFeatures { - - @Test - void shouldSetCannotCreateBescheidDocument() { - ReflectionTestUtils.setField(service, "remoteService", Optional.empty()); - - var result = service.buildFeatures(); - - assertThat(result.isCanCreateBescheidDocument()).isFalse(); - } - - @Test - void shouldSetCanCreateBescheidDocument() { - var result = service.buildFeatures(); - - assertThat(result.isCanCreateBescheidDocument()).isTrue(); - } - - } - - @DisplayName("Get bescheid") - @Nested - class TestGetBescheid { - - private final AttachedItem attachedItem = AttachedItemTestFactory.create(); - - @BeforeEach - void mock() { - when(attachedItemService.getItem(any())).thenReturn(attachedItem); - when(mapper.mapFromAttachedItem(any())).thenReturn(BescheidTestFactory.create()); - } - - @Test - void shouldCallVorgangAttachedItemService() { - service.getBescheid(AttachedItemTestFactory.ID); - - verify(attachedItemService).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallMapper() { - service.getBescheid(AttachedItemTestFactory.ID); - - verify(mapper).mapFromAttachedItem(attachedItem); - } - - @Test - void shouldReturnValue() { - var bescheid = service.getBescheid(AttachedItemTestFactory.ID); - - assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create()); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java deleted file mode 100644 index b04cada3828d9fae6a85c5217c97df420972f353..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.bescheid; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.info.BuildProperties; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.cloud.endpoint.RefreshEndpoint; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.security.authentication.AuthenticationTrustResolver; -import org.springframework.security.authentication.AuthenticationTrustResolverImpl; - -@SpringBootApplication -@ComponentScan({ "de.ozgcloud.*" }) -public class BescheidTestApplication { - - @MockBean - private BuildProperties buildProperties; - @MockBean - private RefreshEndpoint refreshEndpoint; - - @Bean - AuthenticationTrustResolver trustResolver() { - return new AuthenticationTrustResolverImpl(); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java index 7b90a2215cbddb56900ea293d7bbfd5cb9f44363..ecfb19190b19c471a553c02f09b6d7abbd6ae7b8 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java @@ -7,13 +7,16 @@ import java.util.UUID; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.Bescheid.Status; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.document.DocumentTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.Bescheid.SendBy; +import de.ozgcloud.document.bescheid.Bescheid.Status; +import de.ozgcloud.document.bescheid.BescheidId; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.common.user.UserProfileTestFactory; public class BescheidTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java index 8361e82f8c1459da781d70b4603f5e673ec77c81..9f37996adcc11a39d9710cd5b14c6ccdffc75d16 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java @@ -26,7 +26,8 @@ package de.ozgcloud.bescheid; import java.time.ZonedDateTime; import java.util.Map; -import de.ozgcloud.bescheid.SentInfo.SentInfoBuilder; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.SentInfo.SentInfoBuilder; public class SentInfoTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java deleted file mode 100644 index 13e64879f85860b95b1e2a71154e56dced290343..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java +++ /dev/null @@ -1,78 +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.bescheid.administration; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.cloud.endpoint.RefreshEndpoint; - -class AdministrationServiceTest { - - @InjectMocks - private AdministrationService service; - - @Mock - private AdministrationProperties properties; - @Mock - private RefreshEndpoint refreshEndpoint; - - @Nested - class GetNachrichtSignature { - - @Test - void shouldCallGetSignature() { - service.getNachrichtSignature(); - - verify(properties).getSignatur(); - } - - @Test - void shouldReturnSignature() { - var signature = "signature"; - when(properties.getSignatur()).thenReturn(Optional.of(signature)); - - var result = service.getNachrichtSignature(); - - assertThat(result).contains(signature); - } - } - - @Nested - class TestRefreshConfig { - - @Test - void shouldCallRefresh() { - service.refreshConfig(); - - verify(refreshEndpoint).refresh(); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java deleted file mode 100644 index cfa18131b58c3ccc123ba07d4848625fcbddfdfb..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java +++ /dev/null @@ -1,161 +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.bescheid.attributes; - -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.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest; - -class ClientAttributeRemoteServiceTest { - - private static final String VORGANG_ID = "vorgangId"; - private static final String ATTRIBUTE_NAME = "attributeName"; - - @Spy - @InjectMocks - private ClientAttributeRemoteService service; - - @Mock - private ClientAttributeServiceBlockingStub serviceBlockingStub; - @Mock - private BescheidCallContextAttachingInterceptor bescheidCallContextInterceptor; - - @Nested - class TestSetBooleanReadOnlyClientAttribute { - - @Captor - private ArgumentCaptor<BescheidCallContextAttachingInterceptor> interceptorCaptor; - - @BeforeEach - void setUp() { - when(serviceBlockingStub.withInterceptors(any())).thenReturn(serviceBlockingStub); - } - - @Test - void shouldSetInterceptors() { - service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true); - - verify(serviceBlockingStub).withInterceptors(interceptorCaptor.capture()); - assertThat(interceptorCaptor.getValue()).isEqualTo(bescheidCallContextInterceptor); - } - - @Test - void shouldCallBuildRequest() { - service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true); - - verify(service).buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true); - } - - @Test - void shouldCallSetMethod() { - var request = GrpcSetClientAttributeRequest.newBuilder().build(); - doReturn(request).when(service).buildRequest(any(), any(), anyBoolean()); - - service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true); - - verify(serviceBlockingStub).set(request); - - } - } - - @Nested - class TestBuildRequest { - - @Mock - private GrpcClientAttribute clientAttribute; - - @Test - void shouldSetVorgangId() { - var result = buildRequest(); - - assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID); - } - - @Test - void shouldCallBuildClientAttribute() { - buildRequest(); - - verify(service).buildClientAttribute(ATTRIBUTE_NAME, true); - } - - @Test - void shouldSetClientAttribute() { - doReturn(clientAttribute).when(service).buildClientAttribute(any(), anyBoolean()); - - var result = buildRequest(); - - assertThat(result.getAttribute()).isEqualTo(clientAttribute); - } - - private GrpcSetClientAttributeRequest buildRequest() { - return service.buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true); - } - } - - @Nested - class TestBuildClientAttribute { - - @Test - void shouldSetClientName() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getClientName()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - @Test - void shouldSetAccess() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getAccess()).isEqualTo(GrpcAccessPermission.READ_ONLY); - } - - @Test - void shouldSetAttributeName() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getAttributeName()).isEqualTo(ATTRIBUTE_NAME); - } - - @Test - void shouldSetValue() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getValue().getBoolValue()).isTrue(); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java deleted file mode 100644 index 03d31e54d9df4e505ac172fff010acf8f94f996a..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java +++ /dev/null @@ -1,48 +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.bescheid.attributes; - -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -class ClientAttributeServiceTest { - - @InjectMocks - private ClientAttributeService service; - - @Mock - private ClientAttributeRemoteService remoteService; - - @Test - void shouldCallRemoteService() { - var vorgangId = "vorgangId"; - - service.setAntragResult(vorgangId, true); - - verify(remoteService).setBooleanReadOnlyClientAttribute(vorgangId, ClientAttributeService.ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, true); - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java deleted file mode 100644 index ec9d3dee4685bb202d88fe617c8235ad2270b717..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java +++ /dev/null @@ -1,104 +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.bescheid.common.callcontext; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.Optional; - -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 de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; - -class BescheidManagerCallContextProviderTest { - - @Spy - @InjectMocks - private BescheidManagerCallContextProvider provider; - - @Mock - private CurrentUserService currentUserService; - @Mock - private CallContextUser contextUser; - @Mock - private OzgCloudUserId userId; - - @Nested - class TestProvideContext { - - @BeforeEach - void init() { - doReturn(Optional.of(userId)).when(provider).getUserId(); - } - - @Test - void shouldCallGetUserId() { - provider.provideContext(); - - verify(provider).getUserId(); - } - - @Test - void shouldSetUserId() { - var result = provider.provideContext(); - - assertThat(result.getUserId()).isSameAs(userId); - } - - @Test - void shouldSetClientName() { - var result = provider.provideContext(); - - assertThat(result.getClientName()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - } - - @Nested - class TestGetUserId { - - private static final String USER_ID = "userId"; - - @BeforeEach - void init() { - when(currentUserService.getUser()).thenReturn(contextUser); - } - - @Test - void shouldReturnUserId() { - when(contextUser.getUserId()).thenReturn(Optional.of(USER_ID)); - - var result = provider.getUserId(); - - assertThat(result).isPresent().get().hasToString(USER_ID); - } - - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java deleted file mode 100644 index 656b191e256f1aef75cd7def1971953b260327aa..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.ozgcloud.bescheid.common.callcontext; - -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.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.security.authentication.AuthenticationTrustResolver; - -import de.ozgcloud.command.CommandTestFactory; - -class CurrentUserServiceTest { - - @InjectMocks - private CurrentUserService service; - @Mock - private AuthenticationTrustResolver trustResolver; - - @DisplayName("Create user") - @Nested - class TestCreateUser { - - // FIXME read client name from command - @Test - void shouldContainsClientName() { - var user = service.createUser(CommandTestFactory.create()); - - assertThat(user.getClientName()).isEqualTo("Alfa"); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java deleted file mode 100644 index eeca8c0c770782be6364a6f9ae130e440a1168d7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java +++ /dev/null @@ -1,74 +0,0 @@ -package de.ozgcloud.bescheid.common.freemarker; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; - -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.BescheidService; -import de.ozgcloud.common.test.ITCase; - -@ITCase -class TemplateHandlerITCase { - - private static final String BESCHEID_TEMPLATE = "dummy.template.txt.ftlh"; - - @Autowired - private TemplateHandler handler; - @MockBean - private OzgCloudCommandService commandService; - @MockBean - private CommandMapper commandMapper; - - @DisplayName("Get raw template") - @Nested - class TestGetRawTemplate { - - @Test - void shouldReturnTemplateAsString() { - var content = handler.getRawTemplate(BESCHEID_TEMPLATE); - - assertThat(content) - .contains("Sehr geehrte/r Antragsteller/in") - .contains("im folgenden wird evtl was ersetzt") - .contains("valueToReplace") - .contains("Mit freundlichen Grüßen"); - } - } - - @DisplayName("Fill template") - @Nested - class TestFillTemplate { - - @Test - void shouldReturnFilledTemplate() { - var signatur = "ganz andere Signatur"; - var content = handler.fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, - Map.of(BescheidService.KEY_TEMPLATE_SIGNATURE, signatur)); - - assertThat(content) - .contains("Sehr geehrte/r Antragsteller/in") - .contains("im Folgenden erhalten Sie Ihren Bescheid.") - .contains(signatur); - } - - @Test - void shouldReturnWithDefaultValue() { - var content = handler.fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, Collections.emptyMap()); - - assertThat(content) - .contains("Sehr geehrte/r Antragsteller/in") - .contains("im Folgenden erhalten Sie Ihren Bescheid.") - .contains("Mit freundlichen Grüßen") - .contains("Ihre Verwaltung"); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java deleted file mode 100644 index 764fc28f4882f0f160b07deef03f080c4c8b975d..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java +++ /dev/null @@ -1,79 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import static org.assertj.core.api.Assertions.*; - -import java.io.File; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -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.test.context.ActiveProfiles; - -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.BescheidRequestTestFactory; -import de.ozgcloud.bescheid.BescheidTestApplication; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.common.test.TestUtils; - -@SpringBootTest(classes = BescheidTestApplication.class) -@ITCase -@ActiveProfiles({ "itcase", "local" }) -class SmartDocumentsBescheidRemoteServiceITCase { - - @Autowired - private SmartDocumentsBescheidRemoteService remoteService; - @MockBean - private OzgCloudCommandService ozgCloudCommandService; - @MockBean - private CommandMapper commandMapper; - - @Disabled("This test request SmartDocuments service") - @Test - void createBescheid() { - var bescheid = remoteService.create(BescheidRequestTestFactory.create(), VorgangTestFactory.create()); - - System.out.println(bescheid.getBescheidFileName()); - System.out.println(bescheid.getBescheidFile().getAbsolutePath()); - assertThat(bescheid.getBescheidFileName()).isNotEmpty(); - } - - @Nested - class TestGetNachrichtenText { - - private static final String NACHRICHTEN_TEXT = "Nachrichtentext"; - private static final String FIELD_TEMPLATE_TEXT = "Nachrichten Field Text"; - - @Test - void shouldGetNachrichtenText() { - var nachrichtenText = remoteService.extractTextFromXmlFile(loadFile("SD_answer.xml")); - - assertThat(nachrichtenText).contains(NACHRICHTEN_TEXT); - } - - @Test - void shouldGetFieldTemplateText() { - var fieldTemplateText = remoteService.extractTextFromXmlFile(loadFile("SD_answer_field_template.xml")); - - assertThat(fieldTemplateText).contains(FIELD_TEMPLATE_TEXT); - } - - @Test - void shouldExpectMissingTextNode() { - File xmlFileWithoutText = TempFileUtils.writeTmpFile(TestUtils.loadFile("SD_answer_without_text.xml")); - - var text = remoteService.extractTextFromXmlFile(xmlFileWithoutText); - - assertThat(text).isEmpty(); - } - - private File loadFile(String fileName) { - return TempFileUtils.writeTmpFile(TestUtils.loadFile(fileName)); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java deleted file mode 100644 index 86bc7f747b0e95edb9f633b95ba93879124f71ca..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java +++ /dev/null @@ -1,248 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.File; -import java.util.Optional; - -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 org.w3c.dom.Document; -import org.w3c.dom.Text; - -import de.ozgcloud.bescheid.BescheidRequestTestFactory; -import de.ozgcloud.bescheid.BescheidResponseTestFactory; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import lombok.SneakyThrows; - -class SmartDocumentsBescheidRemoteServiceTest { - - @Spy - @InjectMocks - private SmartDocumentsBescheidRemoteService service; - - @Mock - private SmartDocumentsProperties properties; - @Mock - private Text xmlText; - @Mock - private File xmlFile; - - @Nested - class TestBuildBescheid { - - @Test - void shouldFillBescheid() { - var bescheid = service.buildBescheid(BescheidRequestTestFactory.create(), SmartDocumentsResponseTestFactory.create()); - - assertThat(bescheid).usingRecursiveComparison().ignoringFields("serviceKonto", "nachrichtSubject", "bescheidFileId", "attachments") - .isEqualTo(BescheidResponseTestFactory.createBuilder().nachrichtText(Optional.empty()).build()); - } - } - - @Nested - class TestCreateRequest { - - @Test - void shouldFillUserData() { - var request = service.createRequest(BescheidRequestTestFactory.create(), VorgangTestFactory.create()); - - assertThat(request.getCustomerData().getUserData()).isNotNull() - .extracting(UserData::getEmail).isEqualTo(UserProfileTestFactory.EMAIL); - } - } - - @Nested - class TestGetNachrichtText { - - @Test - void shouldCallGetXMLFile() { - var response = SmartDocumentsResponseTestFactory.create(); - - service.getNachrichtText(response); - - verify(service).getXMLFile(response); - } - - @Test - void shouldCallExtractText() { - doReturn(Optional.of(xmlFile)).when(service).getXMLFile(any()); - - service.getNachrichtText(SmartDocumentsResponseTestFactory.create()); - - verify(service).extractTextFromXmlFile(xmlFile); - } - } - - @Nested - class TestExtractTextFromXmlFileSuccessfully { - - private static final String NACHRICHT_TEXT = "NachrichtText"; - - @Mock - private Document document; - - @SneakyThrows - @BeforeEach - void init() { - doReturn(Optional.of(document)).when(service).parseXml(any()); - } - - @SneakyThrows - @Test - void shouldCallParseXml() { - service.extractTextFromXmlFile(xmlFile); - - verify(service).parseXml(xmlFile); - } - - @Test - void shouldCallGetNachrichtenText() { - doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any()); - - service.extractTextFromXmlFile(xmlFile); - - verify(service).getNachrichtenText(document); - } - - @Test - void shouldReturnNachrichtenText() { - doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any()); - when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).contains(NACHRICHT_TEXT); - } - - @Test - void shouldNotCallGetFieldTemplateText() { - doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any()); - - service.extractTextFromXmlFile(xmlFile); - - verify(service, never()).getFieldTemplateText(document); - } - - @Test - void shouldCallGetFieldTemplateText() { - doReturn(Optional.empty()).when(service).getNachrichtenText(any()); - doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any()); - - service.extractTextFromXmlFile(xmlFile); - - verify(service).getFieldTemplateText(document); - } - - @Test - void shouldReturnFieldTemplateText() { - doReturn(Optional.empty()).when(service).getNachrichtenText(any()); - doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any()); - when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).contains(NACHRICHT_TEXT); - } - } - - @Nested - class TestExtractTextFormXmlFileFails { - - @Mock - private Document document; - - @SneakyThrows - @Test - void shouldHandleMissingXmlDocument() { - doReturn(Optional.empty()).when(service).parseXml(any()); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).isEmpty(); - } - - @Test - @SneakyThrows - void shouldExpectMissingTextNode() { - doReturn(Optional.of(document)).when(service).parseXml(any()); - doReturn(Optional.empty()).when(service).getFieldTemplateText(any()); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).isEmpty(); - } - } - - @Nested - class TestGetNachrichtenText { - - @Mock - private Text text; - @Mock - private Document document; - - @BeforeEach - void init() { - doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any()); - } - - @Test - void shouldCallEvaluatePath() { - getNachrichtenText(); - - verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.NACHRICHTEN_TEXT_EXPRESSION); - } - - @Test - void shouldReturnText() { - var result = getNachrichtenText(); - - assertThat(result).contains(text); - } - - private Optional<Text> getNachrichtenText() { - return service.getNachrichtenText(document); - } - } - - @Nested - class TestGetFieldTemplateText { - - @Mock - private Text text; - @Mock - private Document document; - - @BeforeEach - void init() { - doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any()); - } - - @Test - void shouldCallEvaluatePath() { - getFieldTemplateText(); - - verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.FIELD_TEMPLATE_EXPRESSION); - } - - @Test - void shouldReturnText() { - var result = getFieldTemplateText(); - - assertThat(result).contains(text); - } - - private Optional<Text> getFieldTemplateText() { - return service.getFieldTemplateText(document); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java deleted file mode 100644 index 32a0b3ac98768e565da86a25437605fa7c37cd60..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import java.util.List; - -import de.ozgcloud.bescheid.BescheidResponseTestFactory; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile; - -public class SmartDocumentsResponseTestFactory { - - static final String OUTPUT_FORMAT = "PDF"; - - static SmartDocumentsResponse create() { - return createBuilder().build(); - } - - static SmartDocumentsResponse.SmartDocumentsResponseBuilder createBuilder() { - return SmartDocumentsResponse.builder() - .file(List.of(SmartDocumentFile.builder() - .filename(BescheidResponseTestFactory.BESCHEID_FILE_NAME) - .outputFormat(OUTPUT_FORMAT) - .document(SmartDocumentDocument.builder() - .data(BescheidResponseTestFactory.BESCHEID_FILE) - .build()) - .build())); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java deleted file mode 100644 index 6f64a48933ed0351295ef3415111f149ca3f6c7d..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -class BescheidVorgangMapperTest { - - @InjectMocks - private BescheidVorgangMapperImpl mapper; - - @Nested - class TestMapVorgang { - - @Test - void shouldMapEingang() { - var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create()); - - assertThat(result.getEingang()).isNotNull(); - } - - @Test - void shouldMapVorgangId() { - var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create()); - - assertThat(result.getId()).isEqualTo(VorgangTestFactory.ID); - } - - @Test - void shouldMapVersion() { - var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create()); - - assertThat(result.getVersion()).isEqualTo(VorgangTestFactory.VERSION); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java deleted file mode 100644 index d647a90200e8c47fd8a08465fa5fa2048ad35de5..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField; -import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm; -import de.ozgcloud.bescheid.vorgang.Vorgang.Eingang; -import lombok.SneakyThrows; - -class FormDataEntrySerializerTest { - - private ObjectMapper mapper = new ObjectMapper(); - - @Test - void schouldSerializeFormDataWithSingleField() throws JsonProcessingException { - var eingang = Eingang.builder() - .formData(FormField.builder().name("name").value("Thea").build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"name\":\"Thea\"}"); - } - - @Test - @SneakyThrows - void sohludSerializeFormDataWithSubForm() { - var eingang = Eingang.builder() - .formData(SubForm.builder().name("address") - .entry(FormField.builder().name("name").value("Thea").build()) - .build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"address\":{\"name\":\"Thea\"}}"); - } - - @Test - @SneakyThrows - void shouldSerializeFormDataWithSubSubForm() { - var eingang = Eingang.builder() - .formData(SubForm.builder().name("address") - .entry(SubForm.builder().name("person") - .entry(FormField.builder().name("name").value("Thea").build()) - .build()) - .build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"address\":{\"person\":{\"name\":\"Thea\"}}}"); - } - - @Test - @SneakyThrows - void shouldSerializeFormWithTwoFields() { - var eingang = Eingang.builder() - .formData(FormField.builder().name("firstname").value("Thea").build()) - .formData(FormField.builder().name("lastname").value("Test").build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"firstname\":\"Thea\",\"lastname\":\"Test\"}"); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java deleted file mode 100644 index 8c9dfc0daf02960be0d45ecb6ddd9a515552353c..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import de.ozgcloud.vorgang.vorgang.GrpcEingang; - -public class GrpcEingangTestFactory { - - static GrpcEingang create() { - return createBuilder().build(); - } - - static GrpcEingang.Builder createBuilder() { - return GrpcEingang.newBuilder(); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java deleted file mode 100644 index 63c8a880f63c6d9ceffc9f2a8a5028cce949ed34..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static de.ozgcloud.bescheid.vorgang.VorgangTestFactory.*; - -import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangResponse; -import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang; - -class GrpcVorgangWithEingangTestFactory { - - static GrpcVorgangWithEingang create() { - return createBuilder().build(); - } - - static GrpcVorgangWithEingang.Builder createBuilder() { - return GrpcVorgangWithEingang.newBuilder() - .setId(ID.toString()) - .setVersion(VERSION) - .setEingang(GrpcEingangTestFactory.create()); - } - - static GrpcFindVorgangWithEingangResponse createResponse() { - return GrpcFindVorgangWithEingangResponse.newBuilder() - .setVorgangWithEingang(create()) - .build(); - } - -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java index 5d01a8b7573c16643a61e602ff06bc94aa0cd155..8543f3cccb05ecdd58bbaf72323f09768ea8487f 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java @@ -26,7 +26,8 @@ package de.ozgcloud.bescheid.vorgang; import java.util.Map; import java.util.UUID; -import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder; +import de.ozgcloud.document.bescheid.vorgang.Vorgang; +import de.ozgcloud.document.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder; public class PostfachAddressTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java index 2a30ada99a63098c255b97822a151a02558fd950..6cbdc9b13cf227ade4565d8445c6644c817335a4 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java @@ -1,6 +1,6 @@ package de.ozgcloud.bescheid.vorgang; -import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto; +import de.ozgcloud.document.bescheid.vorgang.Vorgang.ServiceKonto; public class ServiceKontoTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java deleted file mode 100644 index 823dc761a8c5efcab9930fafde166d518d79b9ef..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -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.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; - -class VorgangRemoteServiceTest { - - @Spy - @InjectMocks - private VorgangRemoteService service; - - @Mock - private VorgangServiceBlockingStub serviceStub; - @Mock - private BescheidVorgangMapper mapper; - - @Nested - class TestGetById { - @Captor - private ArgumentCaptor<GrpcFindVorgangWithEingangRequest> requestCaptor; - - @BeforeEach - void prepareGrpc() { - when(serviceStub.withInterceptors(any())).thenReturn(serviceStub); - when(serviceStub.findVorgangWithEingang(any())).thenReturn(GrpcVorgangWithEingangTestFactory.createResponse()); - - } - - @BeforeEach - void init() { - when(mapper.mapVorgang(any())).thenReturn(VorgangTestFactory.create()); - } - - @Test - void shouldCallStubWithId() { - service.getById(VorgangTestFactory.ID); - - verify(serviceStub).findVorgangWithEingang(requestCaptor.capture()); - assertThat(requestCaptor.getValue()).extracting(GrpcFindVorgangWithEingangRequest::getId).isEqualTo(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldCallMapper() { - service.getById(VorgangTestFactory.ID); - - verify(mapper).mapVorgang(any()); - } - - @Test - void shouldReturnVorgang() { - var vorgang = service.getById(VorgangTestFactory.ID); - - assertThat(vorgang).usingRecursiveComparison().isEqualTo(VorgangTestFactory.create()); - } - - } - -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java deleted file mode 100644 index cc93692c7831628dd87ada5bf0cf21f2250b5bb4..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -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; - -class VorgangServiceTest { - - @Spy - @InjectMocks - private VorgangService service; - - @Mock - private VorgangRemoteService remoteService; - - @Nested - class TestGetById { - - private final Vorgang vorgang = VorgangTestFactory.create(); - - @BeforeEach - void init() { - when(remoteService.getById(any())).thenReturn(vorgang); - } - - @Test - void shouldCallRemoteService() { - service.getById(VorgangTestFactory.ID); - - verify(remoteService).getById(VorgangTestFactory.ID); - } - - @Test - void shouldReturnResult() { - var result = service.getById(VorgangTestFactory.ID); - - assertThat(result).isEqualTo(vorgang); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java index 000bc28d0aea983e85485a76638fbb0e33727ba2..bcef17e937da2ba1ef8ce848448a2658ff549d8a 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java @@ -2,6 +2,9 @@ package de.ozgcloud.bescheid.vorgang; import java.util.UUID; +import de.ozgcloud.document.bescheid.vorgang.Vorgang; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; + public class VorgangTestFactory { public static final String ID_STR = UUID.randomUUID().toString(); diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java deleted file mode 100644 index 25998524cc118900d7f705f2ff8c7268e2007b7b..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java +++ /dev/null @@ -1,108 +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.common.attached_item; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -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.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.bescheid.SentInfoMapper; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.document.DocumentService; -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; - -class AttachedItemMapperTest { - - @Spy - @InjectMocks - private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class); - - @Mock - private GrpcObjectMapper grpcObjectMapper; - @Mock - private SentInfoMapper sentInfoMapper; - - @Nested - class TestMapFromVorgangAttachedItem { - - @BeforeEach - void init() { - when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem()); - } - - @Test - void shouldMapFromVorgangAttachedItem() { - var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME).build(); - - var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem); - - assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument()); - } - } - - @Nested - class TestAsMap { - - @Test - void shouldSetVorgangId() { - var result = mapper.toMap(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetClient() { - var result = mapper.toMap(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_CLIENT, AttachedItemTestFactory.CLIENT); - } - - @Test - void shouldSetItemName() { - var result = mapper.toMap(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, AttachedItemService.BESCHEID_ITEM_NAME); - } - - @Test - void shouldSetItem() { - var item = Map.<String, Object>of("key", "value"); - var attachedItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().item(item).build(); - - var result = mapper.toMap(attachedItem); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM, item); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java deleted file mode 100644 index aaa9b15a805e2c989b97f0d77577c2499ec18a56..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java +++ /dev/null @@ -1,928 +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.common.attached_item; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -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 de.ozgcloud.apilib.common.command.OzgCloudCommand; -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -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.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidMapper; -import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.Document; -import de.ozgcloud.document.DocumentTestFactory; -import io.grpc.StatusRuntimeException; - -class AttachedItemServiceTest { - - @Spy - @InjectMocks - private AttachedItemService service; - @Mock - private AttachedItemMapper mapper; - @Mock - private VorgangAttachedItemRemoteService remoteService; - - @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; - @Mock - private BescheidMapper bescheidMapper; - - @Nested - class TestFindBescheidItem { - - @Test - void shouldCallGetBescheidDraft() { - service.findBescheidItem(VorgangTestFactory.ID); - - verify(remoteService).findBescheidDraft(VorgangTestFactory.ID); - } - - @Test - void shouldReturnBescheidItem() { - var expected = AttachedItemTestFactory.createBescheid(); - when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(expected)); - - var actual = service.findBescheidItem(VorgangTestFactory.ID); - - assertThat(actual).contains(expected); - } - } - - @Nested - class TestCreateBescheidDraft { - - private static final String CREATED_ATTACHED_ITEM_ID = "attached-item-id"; - private static final Bescheid BESCHEID = BescheidTestFactory.create(); - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @Mock - private AttachedItem updatedBescheidItem; - - @Test - void shouldCallGetBescheidDraft() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createAttachedItem(any()); - - service.createBescheidDraft(BESCHEID); - - verify(remoteService).findBescheidDraft(VorgangTestFactory.ID); - } - - @Test - void shouldCallMergeBescheidDrafts() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).overrideAttachedItem(any()); - when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(bescheidItem)); - - service.createBescheidDraft(BESCHEID); - - verify(service).mergeBescheidDrafts(bescheidItem, BESCHEID); - } - - @Test - void shouldCallOverrideAttachedItem() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).overrideAttachedItem(any()); - when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(bescheidItem)); - doReturn(updatedBescheidItem).when(service).mergeBescheidDrafts(any(), any()); - - service.createBescheidDraft(BESCHEID); - - verify(service).overrideAttachedItem(updatedBescheidItem); - } - - @Test - void shouldCallCreateBescheidDraft() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createAttachedItem(any()); - - service.createBescheidDraft(BESCHEID); - - verify(service).createBescheidDraft(BESCHEID); - } - - } - - @Nested - class TestCreateAttachedItem { - - private static final Bescheid BESCHEID = BescheidTestFactory.create(); - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private OzgCloudCommand createAttachedItemCommand; - @Mock - private OzgCloudCommand finishedOzgCloudCommand; - - @BeforeEach - void init() { - when(commandService.createAndWaitUntilDone(any())).thenReturn(finishedOzgCloudCommand); - when(finishedOzgCloudCommand.getCreatedResource()).thenReturn(AttachedItemTestFactory.ID); - when(bescheidMapper.mapFromBescheid(any())).thenReturn(BESCHEID_ITEM); - } - - @Test - void shouldCallMapFromBescheid() { - createAttachedItem(); - - verify(bescheidMapper).mapFromBescheid(BESCHEID); - } - - @Test - void shouldCallBuildCreateAttachedItemCommand() { - doReturn(createAttachedItemCommand).when(service).buildCreateAttachedItemCommand(any()); - - createAttachedItem(); - - verify(service).buildCreateAttachedItemCommand(BESCHEID_ITEM); - } - - @Test - void shouldCallCommandService() { - doReturn(createAttachedItemCommand).when(service).buildCreateAttachedItemCommand(any()); - - createAttachedItem(); - - verify(commandService).createAndWaitUntilDone(createAttachedItemCommand); - } - - @Test - void shouldReturnCreatedResource() { - var result = createAttachedItem(); - - assertThat(result).isEqualTo(AttachedItemTestFactory.ID); - } - - private String createAttachedItem() { - return service.createAttachedItem(BESCHEID); - } - } - - @Nested - class TestBuildCreateAttachedItemCommand { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Test - void shouldCallVorgangIdMapper() { - service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallRelationIdMapper() { - service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetRelationId() { - var expectedRelationId = "relationId"; - when(commandMapper.mapRelationId(any())).thenReturn(GenericId.from(expectedRelationId)); - - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getRelationId()).hasToString(expectedRelationId); - } - - @Test - void shouldSetOrder() { - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getOrder()).isEqualTo(AttachedItemService.CREATE_ATTACHED_ITEM_ORDER); - } - - @Test - void shouldCallAttachedItemMapper() { - service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - verify(mapper).toMap(BESCHEID_ITEM); - } - - @Test - void shouldSetBodyObject() { - var itemMap = Map.<String, Object>of("key", "value"); - when(mapper.toMap(any())).thenReturn(itemMap); - - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getBodyObject()).containsAllEntriesOf(itemMap); - } - } - - @Nested - class TestUpdateBescheidDraft { - - @Mock - private OzgCloudCommand updateAttachedItemCommand; - - private final Command command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build(); - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - private final Optional<Document> document = Optional.of(DocumentTestFactory.create()); - - @BeforeEach - void init() { - when(remoteService.getItem(any())).thenReturn(bescheidItem); - } - - @Test - void shouldCallGetBescheid() { - doUpdateBescheidDraft(); - - verify(remoteService, times(2)).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallValidateBescheidStatus() { - doUpdateBescheidDraft(); - - verify(service).validateBescheidStatus(bescheidItem); - } - - @Test - void shouldCallBuildUpdateBescheidItemMap() { - doUpdateBescheidDraft(); - - verify(service).buildBescheidItemAsMap(command, document); - } - - @Test - void shouldCallBuildAttachedItemAsMap() { - var itemMap = Map.<String, Object>of("key", "value"); - doReturn(itemMap).when(service).buildBescheidItemAsMap(any(), any()); - - doUpdateBescheidDraft(); - - verify(service).buildAttachedItemAsMap(command, itemMap); - } - - @Test - void shouldCallBuildUpdateAttachedItemCommand() { - var expectedBodyObject = Map.<String, Object>of("key", "value"); - doReturn(expectedBodyObject).when(service).buildAttachedItemAsMap(any(), any()); - - doUpdateBescheidDraft(); - - verify(service).buildPatchAttachedItemCommand(bescheidItem, expectedBodyObject); - } - - @Test - void shouldCallCommandService() { - doReturn(updateAttachedItemCommand).when(service).buildPatchAttachedItemCommand(any(), any()); - - doUpdateBescheidDraft(); - - verify(commandService).createAndWaitUntilDone(updateAttachedItemCommand); - } - - @Test - void shouldThrowExceptionWhenNotFound() { - when(remoteService.getItem(any())).thenThrow(StatusRuntimeException.class); - - assertThrows(StatusRuntimeException.class, this::doUpdateBescheidDraft); - } - - private void doUpdateBescheidDraft() { - service.updateBescheidDraft(command, document); - } - } - - @DisplayName("Build bescheid item") - @Nested - class TestBuildBescheidItemAsMap { - - private final Optional<Document> document = Optional.of(DocumentTestFactory.create()); - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - private final AttachedItem bescheidAttachedItem = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void mock() { - doReturn(bescheidAttachedItem).when(service).getItem(any()); - } - - @Test - void shouldBuildItemMapWithExistingBescheidFields() { - service.buildBescheidItemAsMap(command, document); - - verify(service).buildItemMapWithExistingBescheidFields(command); - } - - @Test - void shouldGetItem() { - service.buildBescheidItemAsMap(command, document); - - verify(service).getItem(CommandTestFactory.RELATION_ID); - } - - @Test - void shouldCallGetNewNachrichtText() { - service.buildBescheidItemAsMap(command, document); - - verify(service).getNewNachrichtText(bescheidAttachedItem, document); - } - - @Test - void shouldOverrideIfNewNachrichtText() { - doReturn(Optional.of(DocumentTestFactory.NACHRICHT_TEXT)).when(service).getNewNachrichtText(any(), any()); - - var bescheidItem = service.buildBescheidItemAsMap(command, document); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, DocumentTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldKeepNachrichtTextIfNotNew() { - doReturn(Optional.empty()).when(service).getNewNachrichtText(any(), any()); - - var bescheidItem = service.buildBescheidItemAsMap(command, document); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - } - - @DisplayName("Get new nachrichtText") - @Nested - class TestGetNewNachrichtText { - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @DisplayName("with filled new document") - @Nested - class TestFilledDocument { - - private final Document document = DocumentTestFactory.create(); - private final Optional<Document> documentOpt = Optional.of(document); - - @Test - void shouldCheckIfIsDifferentDocument() { - service.getNewNachrichtText(bescheidItem, documentOpt); - - verify(service).isDifferentDocument(document, bescheidItem); - } - - @DisplayName("and different documentId") - @Nested - class TestAndDifferentDocumentId { - - @BeforeEach - void mock() { - doReturn(true).when(service).isDifferentDocument(any(), any()); - } - - @Test - void shouldReturnNachrichtTextFromDocument() { - var nachrichtText = service.getNewNachrichtText(bescheidItem, documentOpt); - - assertThat(nachrichtText).hasValue(DocumentTestFactory.NACHRICHT_TEXT); - } - } - - @DisplayName("and same documentId") - @Nested - class TestAndSameDocumentId { - - @BeforeEach - void mock() { - doReturn(false).when(service).isDifferentDocument(any(), any()); - } - - @Test - void shouldReturnNachrichtTextFromDocument() { - var nachrichtText = service.getNewNachrichtText(bescheidItem, documentOpt); - - assertThat(nachrichtText).isEmpty(); - } - } - } - - @DisplayName("with empty document") - @Nested - class TestWithEmptyDocument { - - @Test - void shouldReturnEmpty() { - var nachrichtText = service.getNewNachrichtText(bescheidItem, Optional.empty()); - - assertThat(nachrichtText).isEmpty(); - } - } - } - - @Nested - class TestBuildAttachedItemAsMap { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldSetVorgangId() { - var map = service.buildAttachedItemAsMap(command, Map.of()); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId()); - } - - @Test - void shouldSetClient() { - var map = service.buildAttachedItemAsMap(command, Map.of()); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - @Test - void shouldSetItemName() { - var map = service.buildAttachedItemAsMap(command, Map.of()); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, AttachedItemService.BESCHEID_ITEM_NAME); - } - - @Test - void shouldSetItem() { - var expectedMap = Map.<String, Object>of("key", "value"); - - var map = service.buildAttachedItemAsMap(command, expectedMap); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_ITEM, expectedMap); - } - } - - @Nested - class TestOverrideAttachedItem { - - private static final String CREATED_RESOURCE = "created-resource"; - - @Mock - private OzgCloudCommand updateItemCommand; - - @BeforeEach - void init() { - when(commandService.createAndWaitUntilDone(any())).thenReturn(updateItemCommand); - when(updateItemCommand.getCreatedResource()).thenReturn(CREATED_RESOURCE); - } - - @Test - void shouldCallBuildUpdateAttachedItemCommand() { - var bodyObject = Map.<String, Object>of("key", "value"); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().item(bodyObject).build(); - - service.overrideAttachedItem(bescheidItem); - - verify(service).buildPatchAttachedItemCommand(bescheidItem, bodyObject); - } - - @Test - void shouldCallCommandService() { - doReturn(updateItemCommand).when(service).buildPatchAttachedItemCommand(any(), any()); - - service.overrideAttachedItem(AttachedItemTestFactory.createBescheid()); - - verify(commandService).createAndWaitUntilDone(updateItemCommand); - } - - @Test - void shouldReturnCreatedResource() { - var result = service.overrideAttachedItem(AttachedItemTestFactory.createBescheid()); - - assertThat(result).isEqualTo(CREATED_RESOURCE); - } - } - - @DisplayName("Build map with all bescheid fields") - @Nested - class TestBuildMapWithAllBescheidFields { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldHaveSetBescheidenAm() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR); - } - - @Test - void shouldHaveSetBewilligt() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT); - } - - @Test - void shouldHaveSetBescheidDocument() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID); - } - - @Test - void shouldHaveSetSendBy() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); - } - - @Test - void shouldHaveSetNachrichtText() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldHaveSetNachrichtSubject() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldHaveSetAttachments() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_ATTACHMENTS, - List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR)); - } - } - - @Nested - class TestAddValueFromMapIfExists { - - private static final String KEY = "key"; - - @Test - void shouldAddValue() { - var targetMap = new HashMap<String, Object>(); - var expectedValue = "value"; - Map<String, Object> sourceMap = Map.of(KEY, expectedValue); - - service.addValueFromMapIfExists(sourceMap, KEY, targetMap); - - assertThat(targetMap).containsEntry(KEY, expectedValue); - } - - @Test - void shouldNotAddValueIfKeyNotExists() { - var targetMap = new HashMap<String, Object>(); - var expectedValue = "value"; - Map<String, Object> sourceMap = Map.of(KEY, expectedValue); - - service.addValueFromMapIfExists(sourceMap, "notExists", targetMap); - - assertThat(targetMap).isEmpty(); - } - - @Test - void shouldAddNullValues() { - var targetMap = new HashMap<String, Object>(); - Map<String, Object> sourceMap = Collections.singletonMap(KEY, null); - - service.addValueFromMapIfExists(sourceMap, KEY, targetMap); - - assertThat(targetMap).containsEntry(KEY, null); - } - } - - @Nested - class TestBuildBescheidMap { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldSetStatus() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()); - } - - @Test - void shouldSetBeschiedenAm() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR); - } - - @Test - void shouldSetBewilligt() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BEWILLIGT, true); - } - - @Test - void shouldSetBescheidDocument() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID); - } - - @Test - void shouldSetSendBy() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); - } - - @Test - void shouldSetNachrichtText() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldSetNachrichtSubject() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldSetAttachments() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_ATTACHMENTS, - List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR)); - } - } - - @Nested - class TestBuildUpdateAttachedItemCommand { - - @Test - void shouldCallVorgangIdMapper() { - service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallRelationIdMapper() { - service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetRelationId() { - var expectedId = GenericId.from("relationId"); - when(commandMapper.mapRelationId(any())).thenReturn(expectedId); - - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getRelationId()).isEqualTo(expectedId); - } - - @Test - void shouldSetRelationVersion() { - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM); - } - - @Test - void shouldSetBodyObject() { - var bodyObject = Map.<String, Object>of("key", "value"); - - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), bodyObject); - - assertThat(result.getBodyObject()).containsAllEntriesOf(bodyObject); - } - - } - - @Nested - class TestDeleteBescheidDraft { - - @Mock - private OzgCloudCommand deleteItemOzgCloudCommand; - - private final Command command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build(); - - @Test - void shouldCallGetBescheid() { - when(remoteService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - deleteBescheidDraft(); - - verify(remoteService).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallCommandService() { - doReturn(deleteItemOzgCloudCommand).when(service).buildDeleteItemCommand(any(), any()); - when(remoteService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - deleteBescheidDraft(); - - verify(commandService).createAndWaitUntilDone(deleteItemOzgCloudCommand); - } - - @Test - void shouldThrowExceptionIfBescheidNotFound() { - when(remoteService.getItem(any())).thenThrow(StatusRuntimeException.class); - - assertThrows(StatusRuntimeException.class, this::deleteBescheidDraft); - } - - private void deleteBescheidDraft() { - service.deleteBescheidDraft(command); - } - - @Nested - class TestBuildDeleteItemCommand { - - @Test - void shouldCallCommandMapperWithVorgangId() { - service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallCommandMapperWithRelationId() { - service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetRelationId() { - var expectedId = GenericId.from(AttachedItemTestFactory.ID); - when(commandMapper.mapRelationId(any())).thenReturn(expectedId); - - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getRelationId()).isEqualTo(expectedId); - } - - @Test - void shouldSetRelationVersion() { - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getOrder()).isEqualTo(AttachedItemService.DELETE_ATTACHED_ITEM); - } - } - } - - @Nested - class TestValidateBescheid { - - @Test - void shouldFilterDraftStatus() { - assertDoesNotThrow(() -> service.validateBescheidStatus(AttachedItemTestFactory.createBescheid())); - } - - @Test - void shouldThrowExceptionIfBescheidIsNotDraft() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "otherStatus") - .build(); - - assertThrows(TechnicalException.class, () -> service.validateBescheidStatus(bescheidItem)); - } - - } - - @Nested - class TestGetItem { - - @Test - void shouldCallRemoteService() { - service.getItem(AttachedItemTestFactory.ID); - - verify(service).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldReturnValue() { - var expectedItem = AttachedItemTestFactory.createDocument(); - doReturn(expectedItem).when(remoteService).getItem(any()); - - var result = service.getItem(AttachedItemTestFactory.ID); - - assertThat(result).isEqualTo(expectedItem); - } - } - - @Nested - class TestBuildItemMap { - - @Test - void shouldSetStatus() { - var result = service.buildItemMap(Bescheid.Status.DRAFT); - - assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()); - } - } - - @Nested - class TestFindAllBescheid { - - @Test - void shouldCallRemoteService() { - service.findAllBescheid(VorgangTestFactory.ID); - - verify(remoteService).findAllBescheid(VorgangTestFactory.ID); - } - - @Test - void shouldReturnResult() { - var expectedBescheidItem = AttachedItemTestFactory.createBescheid(); - when(remoteService.findAllBescheid(any(VorgangId.class))).thenReturn(Collections.singletonList(expectedBescheidItem)); - - var result = service.findAllBescheid(VorgangTestFactory.ID); - - assertThat(result).containsExactly(expectedBescheidItem); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java index 9b3ac12ebfa3c1f1385bedaab9d8383c25c750a8..1af82ad13421912cc88260d356d24a5eb3e1acbb 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java @@ -30,18 +30,20 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.SentInfo; import de.ozgcloud.bescheid.SentInfoTestFactory; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem.AttachedItemBuilder; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.document.Document; import de.ozgcloud.document.DocumentService; import de.ozgcloud.document.DocumentTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.common.user.UserProfileTestFactory; +import de.ozgcloud.document.common.attached_item.AttachedItem; +import de.ozgcloud.document.common.attached_item.AttachedItem.AttachedItemBuilder; +import de.ozgcloud.document.common.attached_item.AttachedItemService; public class AttachedItemTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java deleted file mode 100644 index 6a1ebaafcff9eb040990d3d2809fd1cc7ba8194a..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java +++ /dev/null @@ -1,38 +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.common.attached_item; - -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse; - -public class GrpcFindVorgangAttachedItemResponseTestFactory { - - public static GrpcFindVorgangAttachedItemResponse create() { - return createBuilder().build(); - } - - public static GrpcFindVorgangAttachedItemResponse.Builder createBuilder() { - return GrpcFindVorgangAttachedItemResponse.newBuilder() - .addVorgangAttachedItems(GrpcVorgangAttachedItemTestFactory.create()); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java deleted file mode 100644 index daa37d39f9417cb153ae0d83361be572634698e2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java +++ /dev/null @@ -1,51 +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. - */ -package de.ozgcloud.common.attached_item; - -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.vorgang.common.GrpcObject; -import de.ozgcloud.vorgang.common.GrpcProperty; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; - -public class GrpcVorgangAttachedItemTestFactory { - - public static final String PROPERTY_NAME = "propertyName"; - public static final String PROPERTY_NAME_VALUE = "propertyNameValue"; - public static final GrpcObject OBJECT = GrpcObject.newBuilder() - .addProperty(GrpcProperty.newBuilder().setName(PROPERTY_NAME).addValue(PROPERTY_NAME_VALUE)).build(); - - static GrpcVorgangAttachedItem create() { - return createBuilder().build(); - } - - static GrpcVorgangAttachedItem.Builder createBuilder() { - return GrpcVorgangAttachedItem.newBuilder() - .setId(AttachedItemTestFactory.ID) - .setVersion(AttachedItemTestFactory.VERSION) - .setVorgangId(CommandTestFactory.VORGANG_ID) - .setClient(AttachedItemTestFactory.CLIENT) - .setItemName(AttachedItemService.BESCHEID_ITEM_NAME) - .setItem(OBJECT); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java deleted file mode 100644 index 104ace168b6b7486c39adf39df9657a825b8d577..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java +++ /dev/null @@ -1,490 +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.common.attached_item; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -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 de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.vorgang.common.GrpcObject; -import de.ozgcloud.vorgang.common.GrpcProperty; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemResponse; -import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub; -import io.grpc.ClientInterceptor; - -class VorgangAttachedItemRemoteServiceTest { - - @Spy - @InjectMocks - private VorgangAttachedItemRemoteService service; - - @Mock - private VorgangAttachedItemServiceBlockingStub serviceStub; - @Mock - private ClientInterceptor bescheidCallContextInterceptor; - @Mock - private AttachedItemMapper attachedItemMapper; - - @Nested - class TestFindBescheidDraft { - - @Mock - private GrpcFindVorgangAttachedItemRequest request; - - @Nested - class TestFindByVorgangId { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void init() { - doReturn(request).when(service).buildFindRequest(any()); - doReturn(Optional.of(BESCHEID_ITEM)).when(service).findBescheidDraft(any(GrpcFindVorgangAttachedItemRequest.class)); - } - - @Test - void shouldCallCreateFindRequestBuilder() { - service.findBescheidDraft(VorgangTestFactory.ID); - - verify(service).buildFindRequest(VorgangTestFactory.ID_STR); - } - - @Test - void shouldCallGetBescheidDraft() { - service.findBescheidDraft(VorgangTestFactory.ID); - - verify(service).findBescheidDraft(request); - } - - @Test - void shouldReturnResult() { - var result = service.findBescheidDraft(VorgangTestFactory.ID); - - assertThat(result).contains(BESCHEID_ITEM); - } - } - - @Nested - @DisplayName("by grpc request") - class TestByGrpcRequest { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private GrpcFindVorgangAttachedItemResponse response; - - @BeforeEach - void init() { - } - - @Test - void shouldCallFindAllBescheid() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - - service.findBescheidDraft(request); - - verify(service).findAllBescheid(request); - } - - @Test - void shouldCallHasStatusDraft() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - - service.findBescheidDraft(request); - - verify(service).hasStatusDraft(BESCHEID_ITEM); - } - - @Test - void shouldFilterDraftItems() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - doReturn(true).when(service).hasStatusDraft(any()); - - var result = service.findBescheidDraft(request); - - assertThat(result).contains(BESCHEID_ITEM); - } - - @Test - void shouldReturnEmptyWhenNotFound() { - doReturn(Stream.empty()).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - - var result = service.findBescheidDraft(request); - - assertThat(result).isEmpty(); - } - - @Test - void shouldReturnEmptyWhenNotDraft() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - doReturn(false).when(service).hasStatusDraft(any()); - - var result = service.findBescheidDraft(request); - - assertThat(result).isEmpty(); - } - - } - - } - - @Nested - class TestFindAllBescheid { - - private static final AttachedItem RESULT_BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private GrpcFindVorgangAttachedItemRequest request; - - @BeforeEach - void init() { - doReturn(Stream.of(RESULT_BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - } - - @Test - void shouldCallBuildFindRequest() { - service.findAllBescheid(VorgangTestFactory.ID); - - verify(service).buildFindRequest(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldCallFindAllBescheid() { - doReturn(request).when(service).buildFindRequest(any()); - - service.findAllBescheid(VorgangTestFactory.ID); - - verify(service).findAllBescheid(request); - } - - @Test - void shouldReturnResult() { - var result = service.findAllBescheid(VorgangTestFactory.ID); - - assertThat(result).containsExactly(RESULT_BESCHEID_ITEM); - } - } - - @Nested - class TestBuildFindRequest { - - @Test - void shouldBuildRequest() { - var request = buildFindRequest(); - - assertThat(request.getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetItemName() { - var request = buildFindRequest(); - - assertThat(request.getItemName()).isEqualTo(AttachedItemService.BESCHEID_ITEM_NAME); - } - - @Test - void shouldSetClient() { - var request = buildFindRequest(); - - assertThat(request.getClient()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - private GrpcFindVorgangAttachedItemRequest buildFindRequest() { - return service.buildFindRequest(CommandTestFactory.VORGANG_ID); - } - } - - @Nested - class TestFindAllBescheidWithGrpcRequest { - - @Mock - private GrpcFindVorgangAttachedItemRequest request; - @Mock - private GrpcFindVorgangAttachedItemResponse response; - @Mock - private GrpcVorgangAttachedItem grpcVorgangAttachedItem; - - @BeforeEach - void init() { - doReturn(serviceStub).when(service).getServiceStub(); - when(serviceStub.find(any())).thenReturn(response); - } - - @Test - void shouldCallGetServiceStub() { - service.findAllBescheid(request); - - verify(service).getServiceStub(); - } - - @Test - void shouldCallMapper() { - when(response.getVorgangAttachedItemsList()).thenReturn(Collections.singletonList(grpcVorgangAttachedItem)); - - service.findAllBescheid(request).toList(); - - verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem); - } - - @Test - void shouldReturnSortedResult() { - var beschiedenAmFirst = "2021-01-01"; - var beschiedenAmLast = "2024-01-01"; - createItems(beschiedenAmFirst, beschiedenAmLast); - - var result = service.findAllBescheid(request).toList(); - - assertThat(result).hasSize(2); - assertThat(result.get(0).getItem()).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAmLast); - assertThat(result.get(1).getItem()).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAmFirst); - } - - private void createItems(String beschiedenAmFirst, String beschiedenAmLast) { - var itemBeschiedenFirst = createGrpcAttachedItem(beschiedenAmLast); - when(attachedItemMapper.mapFromVorgangAttachedItem(itemBeschiedenFirst)).thenReturn(createAttachedItem(beschiedenAmLast)); - var itemBeschiedenLast = createGrpcAttachedItem(beschiedenAmFirst); - when(attachedItemMapper.mapFromVorgangAttachedItem(itemBeschiedenLast)).thenReturn(createAttachedItem(beschiedenAmFirst)); - when(response.getVorgangAttachedItemsList()).thenReturn(List.of(itemBeschiedenFirst, itemBeschiedenLast)); - } - - private GrpcVorgangAttachedItem createGrpcAttachedItem(String beschiedenAm) { - return GrpcVorgangAttachedItemTestFactory.createBuilder().clearItem().setItem(GrpcObject.newBuilder().addProperty( - GrpcProperty.newBuilder().setName(Bescheid.FIELD_BESCHIEDEN_AM).addValue(beschiedenAm))).build(); - } - - private AttachedItem createAttachedItem(String beschiedenAm) { - return AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm) - .build(); - } - } - - @Nested - class TestHasStatusDraft { - - @Test - void shouldReturnTrueIfDraft() { - var item = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()) - .build(); - - var result = service.hasStatusDraft(item); - - assertThat(result).isTrue(); - } - - @Test - void shouldReturnFalseIfNotDraft() { - var item = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name()) - .build(); - - var result = service.hasStatusDraft(item); - - assertThat(result).isFalse(); - } - } - - @Nested - class TestGetBescheid { - - @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 shouldCallGetServiceStab() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(service).getServiceStub(); - } - - @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 expectedBescheid = AttachedItemTestFactory.createBescheid(); - when(attachedItemMapper.mapFromVorgangAttachedItem(any())).thenReturn(expectedBescheid); - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - var result = getItem(); - - assertThat(result).isEqualTo(expectedBescheid); - } - - private AttachedItem getItem() { - return service.getItem(AttachedItemTestFactory.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 shouldCallGetServiceStab() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(service).getServiceStub(); - } - - @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(AttachedItemTestFactory.ID); - } - } - - @Nested - class TestBuildGetByIdRequest { - - @Test - void shouldSetBescheidId() { - var request = service.buildGetByIdRequest(AttachedItemTestFactory.ID); - - assertThat(request.getId()).isEqualTo(AttachedItemTestFactory.ID); - } - } - - @Nested - class TestGetServiceStub { - - @Test - void shouldCallWithInterceptors() { - service.getServiceStub(); - - verify(serviceStub).withInterceptors(bescheidCallContextInterceptor); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java deleted file mode 100644 index b95890c8ea0e39afabade13339e3790d947137f1..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java +++ /dev/null @@ -1,166 +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.ArgumentMatchers.*; -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.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.security.core.context.SecurityContext; - -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEventTestFactory; -import de.ozgcloud.command.CommandFailedEvent; -import de.ozgcloud.command.CommandTestFactory; - -class DocumentEventListenerTest { - - @Spy - @InjectMocks - private DocumentEventListener listener; - - @Mock - private DocumentService documentService; - @Mock - private ApplicationEventPublisher eventPublisher; - @Mock - private CurrentUserService userService; - - @Nested - class TestOnCreateBescheidDocumentFromFile { - - @Captor - private ArgumentCaptor<BescheidDocumentCreatedEvent> documentCreatedEventCaptor; - private Command command = CommandTestFactory.create(); - - @Test - void shouldCallDocumentService() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(documentService).createBescheidDocument(command); - } - - @Test - void shouldPublishCommandFinishedEvent() { - var createdResourceId = "createdResourceId"; - when(documentService.createBescheidDocument(any())).thenReturn(createdResourceId); - - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher).publishEvent(documentCreatedEventCaptor.capture()); - assertThat(documentCreatedEventCaptor.getValue().getCreatedResource()).isEqualTo(createdResourceId); - assertThat(documentCreatedEventCaptor.getValue().getCommand()).isEqualTo(command); - } - - @Test - void shouldNotPublishCommandFailedEvent() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher, never()).publishEvent(any(CommandFailedEvent.class)); - } - - @Nested - class TestHandleException { - - @Captor - private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor; - - @BeforeEach - void init() { - doThrow(new RuntimeException("ups")).when(documentService).createBescheidDocument(any()); - } - - @Test - void shouldCallBuildErrorMessage() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).buildErrorMessage(any()); - } - - @Test - void shouldPublishCommandFailedEvent() { - var expectedErrorMessage = "expected error message"; - doReturn(expectedErrorMessage).when(listener).buildErrorMessage(any()); - - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture()); - assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId()); - assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isEqualTo(expectedErrorMessage); - } - - @Test - void shouldNotPublishFinishedEvent() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher, never()).publishEvent(any(BescheidDocumentCreatedEvent.class)); - } - } - - @Nested - class HandleSecurityContext { - - @Mock - private SecurityContext secContext; - - @BeforeEach - void init() { - when(userService.startSecurityContext(any())).thenReturn(secContext); - } - - @Test - void shouldStartSecurityContext() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(userService).startSecurityContext(command); - } - - @Test - void shouldResetSecurityContext() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(userService).resetSecurityContext(secContext); - } - - @Test - void shouldResetSecurityContextAfterException() { - doThrow(new RuntimeException("ups")).when(documentService).createBescheidDocument(any()); - - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(userService).resetSecurityContext(secContext); - } - } - } -} \ 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 deleted file mode 100644 index e2157ed90a4161e3e67bfd1dcc30f0010c5ca390..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java +++ /dev/null @@ -1,120 +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 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 deleted file mode 100644 index 50405df503f49f1a8ef42d20921d9cb0dbc62e99..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java +++ /dev/null @@ -1,107 +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 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.common.attached_item.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 deleted file mode 100644 index 9a059e860e5fd527fdc18b6e236f5363ce7311e4..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java +++ /dev/null @@ -1,452 +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.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; -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 org.springframework.web.server.ResponseStatusException; - -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.apilib.common.datatypes.GenericId; -import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.bescheid.BescheidResponseTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItemTestFactory; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.errorhandling.TechnicalException; - -class DocumentServiceTest { - - private static final String FILE_ID = "file-id"; - private static final String RELATION_ID = "relation-id"; - - @Spy - @InjectMocks - private DocumentService service; - - @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; - @Mock - private AttachedItemService attachedItemService; - @Mock - private DocumentMapper documentMapper; - - private final Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID).build(); - - @Nested - class TestCreateBescheidDocument { - - private static final String CREATED_ATTACHED_ITEM_ID = "document-id"; - - @Mock - private OzgCloudCommand ozgCommand; - - @Nested - class TestWithCommand { - - private final Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID) - .bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID)).build(); - - @BeforeEach - void init() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createBescheidDocument(any(), anyMap()); - } - - @Test - void shouldCallBuildItemMap() { - service.createBescheidDocument(command); - - verify(service).buildItemMap(command); - } - - @Test - void shouldCallCreateBescheidDocument() { - var itemMap = Map.of("key", (Object) "value"); - doReturn(itemMap).when(service).buildItemMap(any(Command.class)); - - service.createBescheidDocument(command); - - verify(service).createBescheidDocument(command, itemMap); - } - - @Test - void shouldReturnDocumentId() { - String result = service.createBescheidDocument(command); - - assertThat(result).isEqualTo(CREATED_ATTACHED_ITEM_ID); - } - } - - @Nested - class TestWithBescheid { - - private final BescheidResponse bescheid = BescheidResponseTestFactory.create() - .withBescheidFileId(FileId.from(DocumentTestFactory.ID)); - - @BeforeEach - void init() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createBescheidDocument(any(), anyMap()); - } - - @Test - void shouldCallBuildItemMap() { - service.createBescheidDocument(command, bescheid); - - verify(service).buildItemMap(bescheid); - } - - @Test - void shouldCallCreateBescheidDocument() { - var itemMap = Map.of("key", (Object) "value"); - doReturn(itemMap).when(service).buildItemMap(any(BescheidResponse.class)); - - service.createBescheidDocument(command, bescheid); - - verify(service).createBescheidDocument(command, itemMap); - } - - @Test - void shouldReturnDocumentId() { - String result = service.createBescheidDocument(command, bescheid); - - assertThat(result).isEqualTo(CREATED_ATTACHED_ITEM_ID); - } - } - - @Nested - class TestWithCommandAndItemMap { - - private static final Map<String, Object> BODY_OBJECT = Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID); - - @BeforeEach - void init() { - when(commandService.createAndWaitUntilDone(any())).thenReturn(ozgCommand); - doNothing().when(service).validateBescheidItem(any()); - } - - @Test - void shouldCallValidateBescheidItem() { - service.createBescheidDocument(command, BODY_OBJECT); - - verify(service).validateBescheidItem(RELATION_ID); - } - - @Test - void shouldCallCommandService() { - doReturn(ozgCommand).when(service).buildCreateDocumentOzgCommand(any(), anyMap()); - - service.createBescheidDocument(command, BODY_OBJECT); - - verify(commandService).createAndWaitUntilDone(ozgCommand); - } - - @Test - void shouldReturnDocumentId() { - when(ozgCommand.getCreatedResource()).thenReturn(CREATED_ATTACHED_ITEM_ID); - - String documentId = service.createBescheidDocument(command, BODY_OBJECT); - - assertThat(documentId).isEqualTo(CREATED_ATTACHED_ITEM_ID); - } - } - } - - @Nested - class TestValidateBescheidItem { - - @Test - void shouldCallGetBescheidItem() { - when(attachedItemService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - validateBescheidItem(); - - verify(attachedItemService).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldThrowExceptionWhenNoBescheidDraft() { - when(attachedItemService.getItem(any())).thenThrow(ResponseStatusException.class); - - assertThrows(ResponseStatusException.class, this::validateBescheidItem); - } - - @Test - void shouldNotThrowExceptionIfNotDraft() { - when(attachedItemService.getItem(any())).thenReturn( - AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "not-draft").build()); - - assertThrows(TechnicalException.class, this::validateBescheidItem); - } - - @Test - void shouldValidateBescheidItem() { - when(attachedItemService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - assertDoesNotThrow(this::validateBescheidItem); - } - - void validateBescheidItem() { - service.validateBescheidItem(AttachedItemTestFactory.ID); - } - } - - @Nested - class TestBuildCreateDocumentOzgCommand { - - private static final Map<String, Object> BODY_OBJECT = Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID); - - @Test - void shouldSetOrder() { - var ozgCommand = service.buildCreateDocumentOzgCommand(command, BODY_OBJECT); - - assertThat(ozgCommand.getOrder()).isEqualTo(DocumentService.CREATE_ATTACHED_ITEM_ORDER); - } - - @Test - void shouldCallVorgangIdMapper() { - service.buildCreateDocumentOzgCommand(command, BODY_OBJECT); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from("vorgang-id"); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var ozgCommand = buildCreateDocumentOzgCommand(); - - assertThat(ozgCommand.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallRelationIdMapper() { - buildCreateDocumentOzgCommand(); - - verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetRelationId() { - var expectedRelationId = GenericId.from("relation-id"); - when(commandMapper.mapRelationId(any())).thenReturn(expectedRelationId); - - var ozgCommand = buildCreateDocumentOzgCommand(); - - assertThat(ozgCommand.getRelationId()).isEqualTo(expectedRelationId); - } - - @Test - void shouldSetBodyObject() { - var ozgCommand = buildCreateDocumentOzgCommand(); - - assertThat(ozgCommand.getBodyObject()).isEqualTo(BODY_OBJECT); - } - - private OzgCloudCommand buildCreateDocumentOzgCommand() { - return service.buildCreateDocumentOzgCommand(command, BODY_OBJECT); - } - } - - @Nested - class TestBuildAttachedItem { - - private static final Map<String, Object> ITEM_MAP = Map.of("key", "value"); - - @Test - void shouldSetVorgangId() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetClient() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_CLIENT, - BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - @Test - void shouldSetItemName() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, DocumentService.DOCUMENT_ITEM_NAME); - } - - @Test - void shouldSetItem() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_ITEM, ITEM_MAP); - } - - private Map<String, Object> buildAttachedItem() { - return service.buildAttachedItem(command, ITEM_MAP); - } - } - - @Nested - class TestBuildItemMap { - - @Nested - class TestBuildFromCommand { - - private Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID) - .bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID)).build(); - - @Test - void shouldDetDocumentType() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE); - } - - @Test - void shouldSetDocumentFile() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID); - } - - @Test - void shouldThrowExceptionIfDocumentFileIsMissing() { - command = CommandTestFactory.createBuilder().bodyObject(Map.of()).build(); - - assertThrows(TechnicalException.class, () -> service.buildItemMap(command)); - } - - private Map<String, Object> buildItemMap() { - return service.buildItemMap(command); - } - } - - @Nested - class TestBuildFromBescheid { - - private BescheidResponse bescheid = BescheidResponseTestFactory.create() - .withBescheidFileId(FileId.from(DocumentTestFactory.ID)); - - @Test - void shouldDetDocumentType() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE); - } - - @Test - void shouldSetDocumentFile() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, DocumentTestFactory.ID); - } - - @Test - void shouldSetNachrichtText() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldSetEmptyNachrichtText() { - bescheid = BescheidResponseTestFactory.createBuilder() - .bescheidFileId(FileId.from(DocumentTestFactory.ID)) - .nachrichtText(Optional.empty()).build(); - - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_NACHRICHT_TEXT, StringUtils.EMPTY); - } - - @Test - void shouldThrowExceptionIfFileIdMissing() { - bescheid = BescheidResponseTestFactory.createBuilder().bescheidFileId(null).build(); - - assertThrows(TechnicalException.class, () -> service.buildItemMap(bescheid)); - - } - - private Map<String, Object> buildItemMap() { - return service.buildItemMap(bescheid); - } - } - } - - @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/DocumentTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestApplication.java deleted file mode 100644 index 17cd3a9c6e7af0044f5417041e992cc3e38adb0e..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestApplication.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.ozgcloud.document; - -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DocumentTestApplication { - -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java deleted file mode 100644 index 5c56530f7b13a986c3cd6fd0914bfc9201d152b7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java +++ /dev/null @@ -1,40 +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; - -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/pom.xml b/pom.xml index f27c49331eda7a4c8073d28ce417fb5b8ad22162..c97114c1769e782e6a83e7f6f66ea68009d73a48 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager</artifactId> - <version>2.15.0-SNAPSHOT</version> + <version>2.17.0-SNAPSHOT</version> <name>OZG-Cloud Vorgang Manager</name> <packaging>pom</packaging> diff --git a/run_helm_test.sh b/run_helm_test.sh index 2bae426e6327e0d169891a6cd4eec42cd5377d87..06fd77ba50697dea2885a278ba44350ac3ab6bef 100755 --- a/run_helm_test.sh +++ b/run_helm_test.sh @@ -5,4 +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' . \ No newline at end of file +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 d3319d470a404cdc82ea1f46d66de742c7b4662b..fe0cc4a15bb047e47330a3fc52f17f187e45d67c 100644 --- a/src/main/helm/templates/_helpers.tpl +++ b/src/main/helm/templates/_helpers.tpl @@ -50,7 +50,7 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{- end -}} {{- define "app.ozgcloudEnvironment" -}} -{{- required "ozgcloud.environment muss angegeben sein" (.Values.ozgcloud).environment -}} +{{- required "ozgcloud.environment must be set" (.Values.ozgcloud).environment -}} {{- end -}} {{- define "app.vorgangManagerDatabase" -}} @@ -77,6 +77,22 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{ printf "http://%s.%s:8080" .Values.administrationName .Release.Namespace }} {{- end -}} +{{- define "app.getApplicationAddress" -}} +{{- if .Values.applicationAddress -}} +{{ .Values.applicationAddress }} +{{- else -}} +{{ printf "dns:///%s.%s:9090" .Values.vorgangmanagerName .Release.Namespace }} +{{- end -}} +{{- end -}} + +{{- define "app.getNachrichtenManagerAddress" -}} +{{- if .Values.nachrichtenManagerAddress -}} +{{ .Values.nachrichtenManagerAddress }} +{{- else -}} +{{ printf "%s.%s:9090" .Values.vorgangmanagerName .Release.Namespace }} +{{- end -}} +{{- end -}} + {{- define "app.databaseSecretName" -}} {{- if (.Values.database).secretName -}} {{ .Values.database.secretName }} @@ -130,4 +146,20 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{- define "app.elsterTransferOperatorNamespace" -}} {{- required "elsterTransferOperator.namespace must be set" (.Values.elsterTransferOperator).namespace -}} -{{- end -}} \ No newline at end of file +{{- end -}} + +{{- define "app.ozgcloudBezeichner" -}} +{{- required "ozgcloud.bezeichner must be set" (.Values.ozgcloud).bezeichner -}} +{{- end -}} + +{{- define "app.baseUrl" -}} +{{- required "baseUrl must be set" .Values.baseUrl }} +{{- end -}} + +{{- define "app.alfaHost" -}} +{{- if .Values.alfaHost -}} +{{ .Values.alfaHost | quote }} +{{- else -}} +{{ printf "https://%s.%s" (include "app.ozgcloudBezeichner" .) (include "app.baseUrl" .) }} +{{- end -}} +{{- end -}} diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index ba379a93e17e623cf46bbc3f6e05aa8750eacff8..52451fef26129625132235fbbe47dae80958b930 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -64,9 +64,9 @@ spec: - name: spring_profiles_active value: {{ include "app.envSpringProfiles" . }} - name: ozgcloud_application_address - value: {{ include "app.ozgcloud_vorgangmanager_address" . }} + value: {{ include "app.getApplicationAddress" . }} - name: ozgcloud_nachrichten-manager_address - value: {{ include "app.ozgcloud_vorgangmanager_address" . }} + value: {{ include "app.getNachrichtenManagerAddress" . }} {{- if .Values.env.ozgcloudAktenzeichen.enabled }} - name: ozgcloud_aktenzeichen value: {{ .Values.env.ozgcloudAktenzeichen.value | default "de.ozgcloud.vorgang.vorgang.AktenzeichenProviderEA" }} @@ -263,6 +263,11 @@ spec: value: "false" {{- end }} + - name: ozgcloud_alfa_host + value: {{ include "app.alfaHost" . }} + - name: ozgcloud_vorgangManager_serviceAddress + value: {{ include "app.ozgcloud_vorgangmanager_address" . }} + {{- if or (.Values.database).useExternal (.Values.ozgcloudProxyApi).apikey }} envFrom: {{- if (.Values.database).useExternal }} diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml index e5b2c533cc56546800a78f562d1d17fefe4403f9..b49c282354091844db32a2ab99d7e25d93ccba78 100644 --- a/src/main/helm/templates/network_policy.yaml +++ b/src/main/helm/templates/network_policy.yaml @@ -59,10 +59,10 @@ spec: - from: - namespaceSelector: matchLabels: - kubernetes.io/metadata.name: {{((.Values.ozgcloud).antragraum).antragsraumProxyNamespace | default "antragsraum-proxy"}} + kubernetes.io/metadata.name: {{((.Values.ozgcloud).antragraum).antragraumProxyNamespace | default "antragraum-proxy"}} podSelector: matchLabels: - component: antragsraum-proxy + component: antragraum-proxy {{- end }} - from: diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml index 6a380e033dcf8986792b1e8b8ca9f92a4ab81a0c..e5d0d6e271c3ad94a4be75ee045b192fe42e2a3a 100644 --- a/src/main/helm/values.yaml +++ b/src/main/helm/values.yaml @@ -24,8 +24,6 @@ cluster_env: "" -baseUrl: test.sh.ozg-cloud.de - replicaCount: 2 # ozgcloud: diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml index 4ee02232ecd2a9c111ed1a6f0eaf7295f075700c..391e123d4eb232ee6dc4b036130c02bdb5a7bc8e 100644 --- a/src/test/helm-linter-values.yaml +++ b/src/test/helm-linter-values.yaml @@ -22,8 +22,12 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # + +baseUrl: test.sh.ozg-cloud.de + ozgcloud: environment: test + bezeichner: helm infoManager: address: https://info-manager.my-wonderful-domain.local:9000 diff --git a/src/test/helm/deployment_63_chars_test.yaml b/src/test/helm/deployment_63_chars_test.yaml index a84ec6d6698acc0c874b72e9d5c76f425de07b7e..4ce95b672dfe95bd63951cdc2cca52f2e7d17c45 100644 --- a/src/test/helm/deployment_63_chars_test.yaml +++ b/src/test/helm/deployment_63_chars_test.yaml @@ -33,8 +33,10 @@ chart: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: diff --git a/src/test/helm/deployment_actuator_test.yaml b/src/test/helm/deployment_actuator_test.yaml index b01fbbe154949e3b3198fc648fab4b1ce605c87a..25cad19b0f2237aa8a42b93cc675dfac12c0b65a 100644 --- a/src/test/helm/deployment_actuator_test.yaml +++ b/src/test/helm/deployment_actuator_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check readiness and startup probe diff --git a/src/test/helm/deployment_administration_address_env_test.yaml b/src/test/helm/deployment_administration_address_env_test.yaml index b2bf2db3eed725512711a2f11cf87727c94e78bd..e146aebc75545a2111517f1d96f1d01c195f3521 100644 --- a/src/test/helm/deployment_administration_address_env_test.yaml +++ b/src/test/helm/deployment_administration_address_env_test.yaml @@ -29,9 +29,11 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev - imagePullSecret: image-pull-secret + bezeichner: helm + imagePullSecret: test-image-pull-secret tests: - it: should have set administration server address set: diff --git a/src/test/helm/deployment_alfa_host_test.yaml b/src/test/helm/deployment_alfa_host_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2a17d3aafa95c7a6ed3bfad0b884ada19d0c4421 --- /dev/null +++ b/src/test/helm/deployment_alfa_host_test.yaml @@ -0,0 +1,71 @@ +# +# 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 alfa host +release: + name: vorgang-manager + namespace: sh-helm-test +templates: + - templates/deployment.yaml +set: + ozgcloud: + environment: dev + imagePullSecret: test-image-pull-secret +tests: + - it: should set the alfa host + set: + baseUrl: test.sh.ozg-cloud.de + ozgcloud: + bezeichner: helm + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_alfa_host + value: https://helm.test.sh.ozg-cloud.de + - it: should use alfa host from values + set: + baseUrl: test.sh.ozg-cloud.de + ozgcloud: + bezeichner: helm + alfaHost: https://hamburg.mein-kreis.de + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_alfa_host + value: https://hamburg.mein-kreis.de + - it: should fail if bezeichner is not set + set: + baseUrl: test.sh.ozg-cloud.de + asserts: + - failedTemplate: + errorMessage: "ozgcloud.bezeichner must be set" + - it: should fail if base url is not set + set: + ozgcloud: + bezeichner: helm + asserts: + - failedTemplate: + errorMessage: "baseUrl must be set" diff --git a/src/test/helm/deployment_antragraum_test.yaml b/src/test/helm/deployment_antragraum_test.yaml index 0def5958d58429a5889774f8dc0c3cd49daff8cd..4502b67d7001df5d768cb105168a6681f2c8917c 100644 --- a/src/test/helm/deployment_antragraum_test.yaml +++ b/src/test/helm/deployment_antragraum_test.yaml @@ -29,11 +29,13 @@ release: templates: - templates/deployment.yaml set: - imagePullSecret: image-pull-secret + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm + imagePullSecret: test-image-pull-secret tests: - - it: should set antragsraum values + - it: should set antragraum values set: ozgcloud: antragraum: @@ -67,7 +69,7 @@ tests: name: ozgcloud_antragraum_decryptionCertificate value: "file:/keystore/bayernid/bayern-id.crt" - - it: should not generate antragsraum config if disabled + - it: should not generate antragraum config if disabled set: ozgcloud.antragraum.enabled: false asserts: @@ -112,7 +114,7 @@ tests: name: bayernid-certificate mountPath: "/keystore/bayernid" readOnly: true - - it: should not set volumeMounts if antragsraum is disabled + - it: should not set volumeMounts if antragraum is disabled set: ozgcloud.antragraum.enabled: false asserts: @@ -138,7 +140,7 @@ tests: secret: secretName: bayernid-certificate optional: false - - it: should not have volumes if antragsraum is disabled + - it: should not have volumes if antragraum is disabled set: ozgcloud.antragraum.enabled: false asserts: diff --git a/src/test/helm/deployment_bayernid_test.yaml b/src/test/helm/deployment_bayernid_test.yaml index 5b4837870b547f1c80384011bbf8dce8305eacc4..c11412aa8d089a95339f877ec6ee9b886dca25a9 100644 --- a/src/test/helm/deployment_bayernid_test.yaml +++ b/src/test/helm/deployment_bayernid_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should set bayernid values diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml index d4fa53ca7d43e4998315ec2cfb4f42bc5bd5e3de..51add5e564c008fd62e45d1837f0980bbf415edc 100644 --- a/src/test/helm/deployment_bindings_test.yaml +++ b/src/test/helm/deployment_bindings_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should have volumes diff --git a/src/test/helm/deployment_container_basic_test.yaml b/src/test/helm/deployment_container_basic_test.yaml index 876b4714aafe538e7c080057c54abd65bfac478d..2a36ac446ce27bebc8cf263c8cae80f677ed92cf 100644 --- a/src/test/helm/deployment_container_basic_test.yaml +++ b/src/test/helm/deployment_container_basic_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should have correct values for container image, name, imagePullPolicy diff --git a/src/test/helm/deployment_container_security_context_test.yaml b/src/test/helm/deployment_container_security_context_test.yaml index 11aef905bd2c4cbfe7fbcdd88ddaab437f0d4d4a..314103487abfd694e2d7b0bfd926cc3406da219e 100644 --- a/src/test/helm/deployment_container_security_context_test.yaml +++ b/src/test/helm/deployment_container_security_context_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check default values diff --git a/src/test/helm/deployment_defaults_labels_test.yaml b/src/test/helm/deployment_defaults_labels_test.yaml index 2cf86a63ea9c342d7c5f6553cbba061eb8e367af..7f7b80734a19b8d42384b5514cce435d853c2049 100644 --- a/src/test/helm/deployment_defaults_labels_test.yaml +++ b/src/test/helm/deployment_defaults_labels_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check default labels diff --git a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml index b5e90a80698041766edbf65b61e54943b2a8f032..1a0ee0a3471584e577346c80cddc64b8417ab010 100644 --- a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml +++ b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml @@ -28,9 +28,11 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml -set: +set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: - environment: test + environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: diff --git a/src/test/helm/deployment_dummy_bescheid_document_test.yaml b/src/test/helm/deployment_dummy_bescheid_document_test.yaml index 8863f522e03eb89a1967528f116e5195ac42a473..74adfb830793a2a526fd820fee686f5334e2fab6 100644 --- a/src/test/helm/deployment_dummy_bescheid_document_test.yaml +++ b/src/test/helm/deployment_dummy_bescheid_document_test.yaml @@ -29,12 +29,14 @@ release: templates: - templates/deployment.yaml set: - imagePullSecret: image-pull-secret + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm feature: bescheid: enableDummyDocumentProcessor: true + imagePullSecret: image-pull-secret tests: - it: should enable dummy bescheid document processor asserts: diff --git a/src/test/helm/deployment_elasticsearch_test.yaml b/src/test/helm/deployment_elasticsearch_test.yaml index 2da7a513b36639efde128078b9fd5c0d0876c30e..453e2cc5ab01355042dd25ea6a3c8417023a563d 100644 --- a/src/test/helm/deployment_elasticsearch_test.yaml +++ b/src/test/helm/deployment_elasticsearch_test.yaml @@ -26,8 +26,10 @@ suite: elasticsearch tests templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check if elastic credentials are disabled by default diff --git a/src/test/helm/deployment_env_test.yaml b/src/test/helm/deployment_env_test.yaml index 4d71e36a71fcb5da19e5c6b55afd44ad528bcbd8..2a98ced7a604f37a24d566fc1de958738e3feef7 100644 --- a/src/test/helm/deployment_env_test.yaml +++ b/src/test/helm/deployment_env_test.yaml @@ -26,8 +26,10 @@ suite: test environments templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check customList as list 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 763578ba556ba1c456cdfa7f9d5969b818d13119..81185b9711dc253c84c8bdd895cea61418fc8a77 100644 --- a/src/test/helm/deployment_grpc_info_manager_address_test.yaml +++ b/src/test/helm/deployment_grpc_info_manager_address_test.yaml @@ -28,14 +28,18 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml +set: + baseUrl: test.sh.ozg-cloud.de + ozgcloud: + environment: dev + bezeichner: helm + imagePullSecret: test-image-pull-secret tests: - it: should set the grpc info-manager client address set: ozgcloud: - environment: dev - infoManager: + 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_tls_test.yaml b/src/test/helm/deployment_grpc_tls_test.yaml index 120c32436acb99bf04891c2911f0804077b7b862..fdcbab138b368b6ca8fbf56cc1aaa72a2ebec1bb 100644 --- a/src/test/helm/deployment_grpc_tls_test.yaml +++ b/src/test/helm/deployment_grpc_tls_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: - environment: test + environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should have volume for grpc-tls-cert 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 a26e7cb0ceed7622dd361937c32f5074b6e60567..12938cc05dd26ac4ec1112d1558469378329ed64 100644 --- a/src/test/helm/deployment_grpc_user_manager_address_test.yaml +++ b/src/test/helm/deployment_grpc_user_manager_address_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should set the grpc user-manager client address diff --git a/src/test/helm/deployment_host_aliases_test.yaml b/src/test/helm/deployment_host_aliases_test.yaml index 549c387c725ba385235a1a6389da8d67a4e22520..89fa7000ad445c84548af1eda4dde6442cd67e6a 100644 --- a/src/test/helm/deployment_host_aliases_test.yaml +++ b/src/test/helm/deployment_host_aliases_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should not set hostAliases diff --git a/src/test/helm/deployment_imagepull_secret_test.yaml b/src/test/helm/deployment_imagepull_secret_test.yaml index a509da8e68281789a9454d33c4c5e018a63698b4..bb794eb01101266269021e9624eed213be892544 100644 --- a/src/test/helm/deployment_imagepull_secret_test.yaml +++ b/src/test/helm/deployment_imagepull_secret_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm tests: - it: should set the imagePull secret set: diff --git a/src/test/helm/deployment_kiel_hackathon_route_test.yaml b/src/test/helm/deployment_kiel_hackathon_route_test.yaml index f7879e4739ff4b8a6c67770701492f7210790ce7..1c896feef4e68b7990b6356956f5c060163a6f3a 100644 --- a/src/test/helm/deployment_kiel_hackathon_route_test.yaml +++ b/src/test/helm/deployment_kiel_hackathon_route_test.yaml @@ -29,12 +29,14 @@ release: templates: - templates/deployment.yaml set: - imagePullSecret: image-pull-secret + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm feature: bescheid: kielHackathonRoute: true + imagePullSecret: test-image-pull-secret tests: - it: should enable kiel hackathon toggle asserts: diff --git a/src/test/helm/deployment_liveness_probe_test.yaml b/src/test/helm/deployment_liveness_probe_test.yaml index 6eb925f2db9adf6854a03cded85538fccb066d1f..9a5dddc4594e187c4d3f79bde205a828cee1f5d5 100644 --- a/src/test/helm/deployment_liveness_probe_test.yaml +++ b/src/test/helm/deployment_liveness_probe_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: livenessProbe should be disabled by default diff --git a/src/test/helm/deployment_mongodb_test.yaml b/src/test/helm/deployment_mongodb_test.yaml index ad8a4cb17c47cdca0b5cc89daf2055ec9a24109e..5fa9fa8f938cba2b8372a3921dbd294de98d7519 100644 --- a/src/test/helm/deployment_mongodb_test.yaml +++ b/src/test/helm/deployment_mongodb_test.yaml @@ -26,8 +26,10 @@ suite: deployment test mongodb environments templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check mongodb default env diff --git a/src/test/helm/deployment_muk_test.yaml b/src/test/helm/deployment_muk_test.yaml index aeb0cd59e88df0196712fb836088d1faa2b468ff..bcc31dc748cb40fd1cbce571313b0439371222aa 100644 --- a/src/test/helm/deployment_muk_test.yaml +++ b/src/test/helm/deployment_muk_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should set muk values diff --git a/src/test/helm/deployment_nachrichten_manager_address_test.yaml b/src/test/helm/deployment_nachrichten_manager_address_test.yaml index 67887800a93d5637f079a8aaed0ffa08e588a8af..38907692a6e2e70500eb9ca3f9d2d2717bc2cef8 100644 --- a/src/test/helm/deployment_nachrichten_manager_address_test.yaml +++ b/src/test/helm/deployment_nachrichten_manager_address_test.yaml @@ -22,21 +22,34 @@ # unter der Lizenz sind dem Lizenztext zu entnehmen. # -suite: test environments nachrichten-manager_url +suite: deployment nachrichten-manager_url release: name: vorgang-manager - namespace: sh-helm-test + namespace: by-helm-test templates: - templates/deployment.yaml set: + baseUrl: test.by.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - - it: check if nachrichten-manager address is correct + - it: should generate nachrichten-manager address if not exists asserts: - contains: path: spec.template.spec.containers[0].env content: name: ozgcloud_nachrichten-manager_address - value: dns:///vorgang-manager.sh-helm-test:9090 + value: vorgang-manager.by-helm-test:9090 + + - it: should have set nachrichten-manager address + set: + nachrichtenManagerAddress: localSettedAddress + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_nachrichten-manager_address + value: localSettedAddress + \ No newline at end of file diff --git a/src/test/helm/deployment_pod_default_spec_values_test.yaml b/src/test/helm/deployment_pod_default_spec_values_test.yaml index 42f5e0771bff080656d567edd16939ab9a99c79a..8e541d2fadf893072a380985246cd306c344aed0 100644 --- a/src/test/helm/deployment_pod_default_spec_values_test.yaml +++ b/src/test/helm/deployment_pod_default_spec_values_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should have correct pod template values diff --git a/src/test/helm/deployment_rabbitmq_env_test.yaml b/src/test/helm/deployment_rabbitmq_env_test.yaml index 3adaadfd0c5356fca70a79477c7dfd801751512b..c1e4acfee0ffff9bf5994ae1fde5e8113698d027 100644 --- a/src/test/helm/deployment_rabbitmq_env_test.yaml +++ b/src/test/helm/deployment_rabbitmq_env_test.yaml @@ -26,8 +26,10 @@ suite: deployment test rabbitmq environments templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check rabbitmq spring env diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml index 7a545c8e7563e05cf5b7853bc87718f4b90c2240..9f42d2ff6aaf4f2f30852ee60323d95ad9ab125c 100644 --- a/src/test/helm/deployment_resources_test.yaml +++ b/src/test/helm/deployment_resources_test.yaml @@ -28,8 +28,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: test resources diff --git a/src/test/helm/deployment_service_account_test.yaml b/src/test/helm/deployment_service_account_test.yaml index ad44c8d08f82196b65ff240d7db8bde467185be6..8a9de29bc8720fc291bc9a30b00f96415dd41f75 100644 --- a/src/test/helm/deployment_service_account_test.yaml +++ b/src/test/helm/deployment_service_account_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should use service account with default name diff --git a/src/test/helm/deployment_springProfile_env_test.yaml b/src/test/helm/deployment_springProfile_env_test.yaml index 7b24e13faf86d6f0adb38838aac3f548522724f3..f4cc5923d387f4a32d70c987b177a4eeca8f3fc4 100644 --- a/src/test/helm/deployment_springProfile_env_test.yaml +++ b/src/test/helm/deployment_springProfile_env_test.yaml @@ -28,8 +28,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: should override spring profiles 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 e39659efbe0ffbbcfca957884cca18d73810f6e4..1b1e5f48bfd4a6d2d614387823f8cfee010bc7e7 100644 --- a/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml +++ b/src/test/helm/deployment_test_ozgcloud_base_values_test.yaml @@ -28,14 +28,17 @@ release: namespace: sh-helm-test templates: - templates/deployment.yaml - +set: + baseUrl: test.sh.ozg-cloud.de + ozgcloud: + bezeichner: helm tests: - it: should fail on missing environment - set: + set: imagePullSecret: test-image-pull-secret asserts: - failedTemplate: - errorMessage: ozgcloud.environment muss angegeben sein + errorMessage: ozgcloud.environment must be set - it: should not fail on not missing environment and not missing imagepullsecret set: ozgcloud: diff --git a/src/test/helm/deployment_usermanager_url_env_test.yaml b/src/test/helm/deployment_usermanager_url_env_test.yaml index 5a2ac4d9af36586647ccaa20b863a38a735ff3d5..c0bcda1089f313b2ef38d9b4b443496b1ae5ffc6 100644 --- a/src/test/helm/deployment_usermanager_url_env_test.yaml +++ b/src/test/helm/deployment_usermanager_url_env_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check if user-manager url is correct diff --git a/src/test/helm/deployment_vorgang_manager_env_test.yaml b/src/test/helm/deployment_vorgang_manager_env_test.yaml index 4626fa9296378d85086ac3e15513241aa785e23d..88948502dad997927c922bc115460bfff741dfc4 100644 --- a/src/test/helm/deployment_vorgang_manager_env_test.yaml +++ b/src/test/helm/deployment_vorgang_manager_env_test.yaml @@ -29,14 +29,26 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - - it: check if application address is set + - it: should generate application address if its not set asserts: - contains: path: spec.template.spec.containers[0].env content: name: ozgcloud_application_address - value: dns:///vorgang-manager.by-helm-test:9090 \ No newline at end of file + value: dns:///vorgang-manager.by-helm-test:9090 + + - it: should keep application address if its set + set: + applicationAddress: localSettedAddress + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_application_address + value: localSettedAddress \ No newline at end of file diff --git a/src/test/helm/deployment_vorgang_manager_service_address_env_test.yaml b/src/test/helm/deployment_vorgang_manager_service_address_env_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..394dd179f926357fd825f8f16a08c0c252c6b658 --- /dev/null +++ b/src/test/helm/deployment_vorgang_manager_service_address_env_test.yaml @@ -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. +# + +suite: deployment vorgang manager service address environment +release: + name: vorgang-manager + namespace: by-helm-test +templates: + - templates/deployment.yaml +set: + baseUrl: test.sh.ozg-cloud.de + ozgcloud: + environment: dev + bezeichner: helm + imagePullSecret: test-image-pull-secret +tests: + - it: check if service address of vorgang manager is set + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_vorgangManager_serviceAddress + value: dns:///vorgang-manager.by-helm-test:9090 \ No newline at end of file diff --git a/src/test/helm/deployment_zufimanager_address_env_test.yaml b/src/test/helm/deployment_zufimanager_address_env_test.yaml index d73c2e5b39e192cfe0f30908ccaa4c2d5d22fe1c..103ab80b241453c69e9cda99337afe387c36b898 100644 --- a/src/test/helm/deployment_zufimanager_address_env_test.yaml +++ b/src/test/helm/deployment_zufimanager_address_env_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: - it: check default zufi-manager address 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 index 76331e120081a0f27ce4b20a88ecb4d007ce3635..0a3a2db660c001fd8fe29ad37ae06310466f41bb 100644 --- a/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml +++ b/src/test/helm/deyploment_basic_value_and_default_spec_test.yaml @@ -29,8 +29,10 @@ release: templates: - templates/deployment.yaml set: + baseUrl: test.sh.ozg-cloud.de ozgcloud: environment: dev + bezeichner: helm imagePullSecret: test-image-pull-secret tests: diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml index 8c72186be1545a2ce6c85d8df72f4d8d1e73838a..618dba7961d5776726e0c51387ae466a5036a409 100644 --- a/src/test/helm/network_policy_test.yaml +++ b/src/test/helm/network_policy_test.yaml @@ -154,10 +154,10 @@ tests: from: - namespaceSelector: matchLabels: - kubernetes.io/metadata.name: antragsraum-proxy + kubernetes.io/metadata.name: antragraum-proxy podSelector: matchLabels: - component: antragsraum-proxy + component: antragraum-proxy - it: should set ingress rule for antragraum-proxy if antragraum is enabled set: @@ -166,7 +166,7 @@ tests: ozgcloud: antragraum: enabled: true - antragsraumProxyNamespace: antragsraum-proxy + antragraumProxyNamespace: antragraum-proxy asserts: - contains: path: spec.ingress @@ -174,10 +174,10 @@ tests: from: - namespaceSelector: matchLabels: - kubernetes.io/metadata.name: antragsraum-proxy + kubernetes.io/metadata.name: antragraum-proxy podSelector: matchLabels: - component: antragsraum-proxy + component: antragraum-proxy - it: should not add ingress rule for antragraum if antragraum is disabled diff --git a/vorgang-manager-base/pom.xml b/vorgang-manager-base/pom.xml index 331f7056cbc8068b819e5b811b36fa514f045329..db152d8923a1de637292afad1c0b259fd35685a4 100644 --- a/vorgang-manager-base/pom.xml +++ b/vorgang-manager-base/pom.xml @@ -12,7 +12,7 @@ <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-base</artifactId> - <version>2.15.0-SNAPSHOT</version> + <version>2.17.0-SNAPSHOT</version> <name>OZG-Cloud Vorgang Manager Base</name> diff --git a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java index 56e9cdb76596b9f4132f18412dd9e15ee981161c..b1d1284370c5c43bc3d8430634efd86acd627238 100644 --- a/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java +++ b/vorgang-manager-base/src/main/java/de/ozgcloud/vorgang/callcontext/CallContextHandleInterceptor.java @@ -95,7 +95,7 @@ class CallContextHandleInterceptor implements ServerInterceptor { } void doSurroundOn(Runnable runnable) { - try (CloseableThreadContext.Instance ctc = CloseableThreadContext.put(REQUEST_ID_KEY, requestId)) { + try (var ctc = CloseableThreadContext.put(REQUEST_ID_KEY, requestId)) { startSecurityContext(); runnable.run(); } finally { diff --git a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java index a51e03e3c90e2a91f798d3afd15c06c0a35739ca..416274956e461d0d905b68ee9064b60cf072cd76 100644 --- a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java +++ b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/CallContextTestFactory.java @@ -26,8 +26,6 @@ package de.ozgcloud.vorgang.callcontext; import static de.ozgcloud.vorgang.callcontext.CallContextHandleInterceptor.*; import static de.ozgcloud.vorgang.callcontext.UserTestFactory.*; -import java.util.Map; -import java.util.Set; import java.util.UUID; import de.ozgcloud.common.grpc.GrpcUtil; @@ -51,16 +49,6 @@ public class CallContextTestFactory { .client(CLIENT); } - // TODO Pruefen, ob die Methode noch gebraucht wird - public static Map<String, Object> createContextMap() { - return Map.of( - KEY_USER_ID, UserTestFactory.ID, - KEY_USER_NAME, UserTestFactory.NAME, - KEY_CLIENT_NAME, CLIENT, - KEY_ACCESS_LIMITED_ORGAID, Set.of(UserTestFactory.ORGANISATORISCHE_EINHEITEN_ID), - KEY_REQUEST_ID, REQUEST_ID); - } - public static Metadata createMetadata() { var result = new Metadata(); result.put(GrpcUtil.HEADER_KEY_USER_ID, ID.getBytes()); diff --git a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java index 518fc07f0a7a81f2a930d357184230ead2c04d43..33bb5dda35074ead65218e2891ba93b5c8e49cde 100644 --- a/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java +++ b/vorgang-manager-base/src/test/java/de/ozgcloud/vorgang/callcontext/TestCallContextAttachingInterceptor.java @@ -47,7 +47,7 @@ public class TestCallContextAttachingInterceptor implements ClientInterceptor { final class TestCallContextAttachingClientCall<ReqT, RespT> extends SimpleForwardingClientCall<ReqT, RespT> { - protected TestCallContextAttachingClientCall(ClientCall<ReqT, RespT> delegate) { + private TestCallContextAttachingClientCall(ClientCall<ReqT, RespT> delegate) { super(delegate); } diff --git a/vorgang-manager-command/pom.xml b/vorgang-manager-command/pom.xml index 0356ef538d644aa231f87c7a724eff3cadde1f3e..cccafe587a84f6e9c367e1e6c7099b95a1fc8159 100644 --- a/vorgang-manager-command/pom.xml +++ b/vorgang-manager-command/pom.xml @@ -10,7 +10,7 @@ <groupId>de.ozgcloud.command</groupId> <artifactId>command-manager</artifactId> - <version>2.15.0-SNAPSHOT</version> + <version>2.17.0-SNAPSHOT</version> <name>OZG-Cloud Command Manager</name> <properties> diff --git a/vorgang-manager-interface/pom.xml b/vorgang-manager-interface/pom.xml index e5008b91fd7e905b73a74f1419421e22b373597a..bd9fbd52d6c465fd7fb59d62c5a320d96cfadbef 100644 --- a/vorgang-manager-interface/pom.xml +++ b/vorgang-manager-interface/pom.xml @@ -36,7 +36,7 @@ <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-interface</artifactId> - <version>2.15.0-SNAPSHOT</version> + <version>2.17.0-SNAPSHOT</version> <name>OZG-Cloud Vorgang Manager gRPC Interface</name> <description>Interface (gRPC) for Vorgang Manager Server</description> diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto index 3c6990c88bbc2b9194a1927b3347dc12902fe867..5cccab4c813af190aaf8f3429704c9a4e0c189d4 100644 --- a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto +++ b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto @@ -30,22 +30,27 @@ option java_package = "de.ozgcloud.bescheid"; option java_outer_classname = "BescheidModelProto"; message GrpcGetBescheidDraftRequest { + option deprecated = true; string vorgangId = 1; } message GrpcGetBescheidDraftResponse { + option deprecated = true; GrpcBescheid bescheid = 1; } message GrpcGetAllBescheidRequest { + option deprecated = true; string vorgangId = 1; } message GrpcGetAllBescheidResponse { + option deprecated = true; repeated GrpcBescheid bescheid = 1; } message GrpcBescheid { + option deprecated = true; string beschiedenAm = 1; bool bewilligt = 2; string bescheidDocument = 3; @@ -60,26 +65,33 @@ message GrpcBescheid { } message GrpcSentInfo { + option deprecated = true; string sentBy = 1; string sentAt = 2; } -message GrpcBescheidManagerConfigRequest {} +message GrpcBescheidManagerConfigRequest { + option deprecated = true; +} message GrpcBescheidManagerConfigResponse { + option deprecated = true; string version = 1; string javaVersion = 2; GrpcBescheidManagerFeatures features = 3; } message GrpcBescheidManagerFeatures { + option deprecated = true; bool canCreateBescheidDocument = 1; } message GrpcGetBescheidRequest { + option deprecated = true; string id = 1; -} +} message GrpcGetBescheidResponse { + option deprecated = true; GrpcBescheid bescheid = 1; } \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.proto index e99d06390e5aab694b512cac8cd4edd8b5a72f2f..db6ad30aa7723cba7d43d2981399c8119f31a033 100644 --- a/vorgang-manager-interface/src/main/protobuf/bescheid.proto +++ b/vorgang-manager-interface/src/main/protobuf/bescheid.proto @@ -32,6 +32,7 @@ option java_package = "de.ozgcloud.bescheid"; option java_outer_classname = "BescheidProto"; service BescheidService { + option deprecated = true; rpc getBescheidDraft(GrpcGetBescheidDraftRequest) returns (GrpcGetBescheidDraftResponse) { } @@ -40,7 +41,7 @@ service BescheidService { rpc getConfig(GrpcBescheidManagerConfigRequest) returns (GrpcBescheidManagerConfigResponse) { } - + rpc getBescheid(GrpcGetBescheidRequest) returns (GrpcGetBescheidResponse) { } } \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/document.model.proto b/vorgang-manager-interface/src/main/protobuf/document.model.proto deleted file mode 100644 index ff0025a2197b3ba328547cd595f741ea95852310..0000000000000000000000000000000000000000 --- a/vorgang-manager-interface/src/main/protobuf/document.model.proto +++ /dev/null @@ -1,46 +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. - */ - 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 deleted file mode 100644 index c2a903373b229e3461932fa15e50706a9e5b41af..0000000000000000000000000000000000000000 --- a/vorgang-manager-interface/src/main/protobuf/document.proto +++ /dev/null @@ -1,36 +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. - */ -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 76157a12e40b638a00ca020bfde221706b1cc3ef..b1c4bad8c989562a34bd0f821ed472b28a0cebcf 100644 --- a/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto +++ b/vorgang-manager-interface/src/main/protobuf/vorgang.model.proto @@ -199,11 +199,11 @@ message GrpcVorgangQueryExpression { message GrpcCreateCollaborationVorgangRequest { oneof request { - GrpcCollaborationRequest collaborationRequest = 1; + GrpcCreateCollaborationRequestData requestData = 1; } } -message GrpcCollaborationRequest { +message GrpcCreateCollaborationRequestData { string vorgangId = 1; int32 collaborationLevel = 2; string zustaendigeStelle = 3; diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 96349c52987bc512a68274fb7cf72536b0451cc2..30f47b69d40c30e0f50a78b1818d1991618319eb 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -32,13 +32,13 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.4.0-SNAPSHOT</version> + <version>4.5.0-SNAPSHOT</version> <relativePath /> </parent> <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-server</artifactId> - <version>2.15.0-SNAPSHOT</version> + <version>2.17.0-SNAPSHOT</version> <name>OZG-Cloud Vorgang Manager Server</name> <description>Server Implementierung des VorgangManagers</description> @@ -50,15 +50,15 @@ <spring-boot.build-image.imageName>docker.ozg-sh.de/vorgang-manager:build-latest</spring-boot.build-image.imageName> <ozgcloud.license.version>1.3.0</ozgcloud.license.version> - <zufi-manager-interface.version>1.4.0-SNAPSHOT</zufi-manager-interface.version> + <zufi-manager-interface.version>1.4.0</zufi-manager-interface.version> - <user-manager-interface.version>2.1.0</user-manager-interface.version> - <bescheid-manager.version>1.18.0-SNAPSHOT</bescheid-manager.version> + <user-manager-interface.version>2.9.0</user-manager-interface.version> + <bescheid-manager.version>1.20.0-SNAPSHOT</bescheid-manager.version> <processor-manager.version>0.5.0-PR-14-SNAPSHOT</processor-manager.version> - <nachrichten-manager.version>2.12.0-PR-31-SNAPSHOT</nachrichten-manager.version> + <nachrichten-manager.version>2.14.0-PR-31-SNAPSHOT</nachrichten-manager.version> <ozgcloud-starter.version>0.13.0-PR-31-SNAPSHOT</ozgcloud-starter.version> - <notification-manager.version>2.11.0-PR-7-SNAPSHOT</notification-manager.version> - <collaboration-manager.version>0.3.0-PR-6-SNAPSHOT</collaboration-manager.version> + <notification-manager.version>2.12.0-PR-7-SNAPSHOT</notification-manager.version> + <collaboration-manager.version>0.4.0-PR-6-SNAPSHOT</collaboration-manager.version> <zip.version>2.11.1</zip.version> <jsoup.version>1.15.3</jsoup.version> diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java index ce8c2dfd120901ce2e599a0c66c0f2d1ac108d5f..ef0d12da9202197c9c16570fe7005f8052f7a178 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemService.java @@ -187,7 +187,7 @@ public class VorgangAttachedItemService { } public void revokeCreate(Command command) { - handleRevoke(command, () -> delete(command.getRelationId(), command.getRelationVersion())); + handleRevoke(command, () -> delete(command.getCreatedResource(), command.getRelationVersion() + 1)); } void delete(String id, long version) { diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java index 28c23c3d257a9bc371fcd54dd1eaed57cd2166a7..e7d98214f47767f8e504319062e735e1f1542162 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapper.java @@ -27,11 +27,11 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; -import de.ozgcloud.vorgang.vorgang.GrpcCollaborationRequest; +import de.ozgcloud.vorgang.vorgang.GrpcCreateCollaborationRequestData; @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN) public interface CreateCollaborationVorgangRequestMapper { @Mapping(target = "vorgang", ignore = true) - CreateCollaborationVorgangRequest mapFrom(GrpcCollaborationRequest grpcCollaborationRequest); + CreateCollaborationVorgangRequest mapFrom(GrpcCreateCollaborationRequestData grpcCollaborationRequest); } diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java index a9f57bac1d65ca9aba3af9671ab6d2efb2948558..dce3ec92f0c506bcabce138f6104003737adff39 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandRepository.java @@ -36,11 +36,13 @@ import java.util.stream.Stream; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.FindAndModifyOptions; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq; +import org.springframework.data.mongodb.core.aggregation.ConditionalOperators; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch; import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch.CaseOperator; import org.springframework.data.mongodb.core.aggregation.SetOperation; @@ -261,17 +263,30 @@ class CommandRepository { return query; } - public Command setRevokeStatus(String id) { - return mongoOperations.findAndModify(queryById(id), buildUpdateStatusRevoke(), FindAndModifyOptions.options().returnNew(true), Command.class); + public Command setRevokeStatus(String id, String createdResource) { + return mongoOperations.findAndModify(queryById(id), buildUpdateStatusRevoke(createdResource), FindAndModifyOptions.options().returnNew(true), + Command.class); } - private UpdateDefinition buildUpdateStatusRevoke() { - var switchOperation = Switch.switchCases( - CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.NEW)).then(CommandStatus.CANCELED), - CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(CommandStatus.REVOKE_PENDING), - CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.FINISHED)).then(CommandStatus.REVOKE_PENDING)) + private UpdateDefinition buildUpdateStatusRevoke(String createdResource) { + var setOperation = SetOperation.set(MONGODB_STATUS).toValue(buildSetStatusCondition()); + if (StringUtils.isNotBlank(createdResource)) { + setOperation = setOperation.and().set(MONGODB_CREATED_RESOURCE).toValue(buildSetCreatedResourceCondition(createdResource)); + } + return Aggregation.newUpdate(setOperation); + } + + private Switch buildSetStatusCondition() { + return Switch.switchCases( + CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.NEW)).then(CommandStatus.CANCELED), + CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(CommandStatus.REVOKE_PENDING), + CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.FINISHED)).then(CommandStatus.REVOKE_PENDING)) .defaultTo(MONGODB_REFERENCE_STATUS); - return Aggregation.newUpdate(SetOperation.set(MONGODB_STATUS).toValue(switchOperation)); + } + + private ConditionalOperators.Cond buildSetCreatedResourceCondition(String createdResource) { + return ConditionalOperators.Cond.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(createdResource) + .otherwiseValueOf(MONGODB_CREATED_RESOURCE); } public Optional<Command> setRevokeStatusIfNotPending(String id) { diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java index 2f661a37b47f0da8143fdd5332e8385da4ecb1e5..ff7653e640230c195b26595b3b50c0589f305303 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/CommandService.java @@ -117,7 +117,7 @@ public class CommandService { public void setCommandFinished(String commandId, String createdResource) { var command = getById(commandId); if (shouldRevoke(command)) { - repository.setRevokeStatus(commandId); + command = repository.setRevokeStatus(commandId, createdResource); publishRevokeCommandEvent(command); return; } diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java index 11318a0cf33d16cc95296cef55b61c1f08a878b8..bb28f0f25b66a1cc2d6065009c4df9b259270fa4 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java @@ -33,6 +33,7 @@ import io.grpc.Metadata; import io.grpc.Metadata.Key; import io.grpc.Status; import io.grpc.StatusException; +import io.grpc.StatusRuntimeException; import lombok.extern.log4j.Log4j2; import net.devh.boot.grpc.server.advice.GrpcAdvice; import net.devh.boot.grpc.server.advice.GrpcExceptionHandler; @@ -89,6 +90,11 @@ public class ExceptionHandler { return Status.INTERNAL.withDescription(e.getMessage()).withCause(e.getCause()); } + @GrpcExceptionHandler + public StatusRuntimeException passThroughStatusRuntimeException(StatusRuntimeException e) { + return e; + } + @GrpcExceptionHandler public StatusException handleRuntimeException(RuntimeException e) { var exceptionId = createExceptionId(); @@ -102,6 +108,16 @@ public class ExceptionHandler { return Status.INTERNAL.withDescription(message).withCause(e.getCause()); } + @GrpcExceptionHandler + public StatusException handleNotFoundException(de.ozgcloud.apilib.common.errorhandling.NotFoundException e) { + var exceptionId = createExceptionId(); + var messageWithExceptionId = ExceptionUtil.formatMessageWithExceptionId(e.getMessage(), exceptionId); + LOG.error("Grpc internal server error: {}", messageWithExceptionId, e); + + var status = Status.NOT_FOUND.withDescription(messageWithExceptionId).withCause(e.getCause()); + return createStatusException(status, buildMetadata(exceptionId)); + } + private Metadata buildMetadata(String exceptionId) { var metadata = new Metadata(); addExceptionId(metadata, exceptionId); diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java index 3adf3dcf4bf4b7d352039c64292abffdfe1068dc..986a7ce668c786d3612d7bdbe1267013bc24aadc 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java @@ -116,8 +116,8 @@ class VorgangGrpcService extends VorgangServiceGrpc.VorgangServiceImplBase { public void createCollaborationVorgang(GrpcCreateCollaborationVorgangRequest request, StreamObserver<GrpcCreateCollaborationVorgangResponse> responseObserver) { GrpcCreateCollaborationVorgangResponse response; - if (request.hasCollaborationRequest()) { - response = createCollaborationVorgang(request.getCollaborationRequest()); + if (request.hasRequestData()) { + response = createCollaborationVorgang(request.getRequestData()); } else { throw new CreateCollaborationVorgangBadRequestException("Cannot create collaboration vorgang. Collaboration request is empty."); } @@ -125,12 +125,12 @@ class VorgangGrpcService extends VorgangServiceGrpc.VorgangServiceImplBase { responseObserver.onCompleted(); } - GrpcCreateCollaborationVorgangResponse createCollaborationVorgang(GrpcCollaborationRequest request) { + GrpcCreateCollaborationVorgangResponse createCollaborationVorgang(GrpcCreateCollaborationRequestData request) { var collaborationVorgang = collaborationService.createCollaborationVorgang(buildCreateCollaborationVorgangRequest(request)); return buildCreateCollaborationVorgangResponse(collaborationVorgang); } - CreateCollaborationVorgangRequest buildCreateCollaborationVorgangRequest(GrpcCollaborationRequest request) { + CreateCollaborationVorgangRequest buildCreateCollaborationVorgangRequest(GrpcCreateCollaborationRequestData request) { var vorgang = vorgangService.getById(request.getVorgangId()); return createCollaborationVorgangRequestMapper.mapFrom(request).toBuilder().vorgang(vorgang).build(); } diff --git a/vorgang-manager-server/src/main/resources/application.yml b/vorgang-manager-server/src/main/resources/application.yml index 14efedc146c86e36e8dff4ebdf7c3f66ea544275..7bf48c56cfe7b1d089dd2dc367d1b6bcdd25d09c 100644 --- a/vorgang-manager-server/src/main/resources/application.yml +++ b/vorgang-manager-server/src/main/resources/application.yml @@ -5,7 +5,7 @@ logging: mongock: runner-type: initializingbean - migration-scan-package: + migration-scan-package: - de.ozgcloud.vorgang.common.migration enabled: true transactionEnabled: false @@ -30,7 +30,7 @@ grpc: address: self:self negotiationType: TLS user-manager: - negotiationType: TLS + negotiationType: TLS email: address: self:self negotiationType: TLS @@ -91,6 +91,8 @@ ozgcloud: mail-from: EA-Poststelle@itvsh.de notification: mail-from: hilfe@ozgcloud.support + wiedervorlageDueToday: + cron: "0 15 0 * * *" nachrichten-manager: address: self:self negotiation-type: plaintext @@ -107,4 +109,4 @@ ozgcloud: user-manager: address: ${grpc.client.user-manager.address:false} negotiation-type: ${grpc.client.user-manager.negotiationType} - + diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedBescheidGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedBescheidGrpcServiceITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..8344f50af2c30364a65462793f2532152c1f2a85 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedBescheidGrpcServiceITCase.java @@ -0,0 +1,163 @@ +/* + * 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; + +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.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.BescheidServiceGrpc.BescheidServiceBlockingStub; +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.common.callcontext.CallContextUser; +import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService; +import de.ozgcloud.document.bescheid.common.user.UserProfile; +import de.ozgcloud.document.bescheid.common.user.UserProfileService; +import de.ozgcloud.document.common.attached_item.AttachedItemService; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; +import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory; +import de.ozgcloud.vorgang.vorgang.Vorgang; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = { + "grpc.server.inProcessName=test", + "grpc.server.port=-1", + "grpc.client.inProzess.address=in-process:test", + "grpc.client.vorgang-manager.address=in-process:test", +}) +@DataITCase +@DirtiesContext +@Deprecated +class DeprecatedBescheidGrpcServiceITCase { + + @GrpcClient("inProzess") + private BescheidServiceBlockingStub bescheidServiceBlockingStub; + + @Autowired + private MongoOperations mongoOperations; + + @MockBean + private CurrentUserService currentUserService; + @MockBean + private UserProfileService userProfileService; + @Mock + private CallContextUser callContextUser; + @Mock + private UserProfile userProfile; + + @Nested + class TestFindAll { + + @BeforeEach + void init() { + mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); + mongoOperations.dropCollection(Vorgang.COLLECTION_NAME); + when(currentUserService.getUser()).thenReturn(callContextUser); + when(userProfileService.getUserProfile()).thenReturn(userProfile); + } + + @Test + void shouldReturnSortedResult() { + var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId(); + var bescheidItemFirstId = mongoOperations.save(createBescheidAttachedItem(vorgangId, "2022-10-01")).getId(); + var bescheidItemLastId = mongoOperations.save(createBescheidAttachedItem(vorgangId, "2024-01-01")).getId(); + + var response = bescheidServiceBlockingStub.getAll(GrpcGetAllBescheidRequest.newBuilder().setVorgangId(vorgangId).build()); + + assertThat(response.getBescheidList()).hasSize(2); + assertThat(response.getBescheidList().get(0).getId()).isEqualTo(bescheidItemLastId); + assertThat(response.getBescheidList().get(1).getId()).isEqualTo(bescheidItemFirstId); + } + + @Test + void shouldReturnSentInfo() { + var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId(); + var itemMap = createItemWithSentInfo(); + mongoOperations.save(createBescheidAttachedItem(vorgangId, itemMap)); + + var response = bescheidServiceBlockingStub.getAll(GrpcGetAllBescheidRequest.newBuilder().setVorgangId(vorgangId).build()); + + assertThat(response.getBescheidList()).hasSize(1).first().extracting(GrpcBescheid::getSentInfo) + .isEqualTo(DeprecatedGrpcSentInfoTestFactory.create()); + } + + private Map<String, Object> createItemWithSentInfo() { + return Map.of( + Bescheid.FIELD_BEWILLIGT, "true", + Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(), + Bescheid.FIELD_BESCHIEDEN_AM, "2022-10-01", + Bescheid.FIELD_SENT_INFO, Map.of( + SentInfo.FIELD_SENT_AT, DeprecatedGrpcSentInfoTestFactory.SENT_AT_STR, + SentInfo.FIELD_SENT_BY, CallContextUserTestFactory.ID)); + } + + private VorgangAttachedItem createBescheidAttachedItem(String vorgangId, String beschiedenAm) { + var itemMap = Map.<String, Object>of( + Bescheid.FIELD_BEWILLIGT, "true", + Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name(), + Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm); + return createBescheidAttachedItem(vorgangId, itemMap); + } + + private VorgangAttachedItem createBescheidAttachedItem(String vorgangId, Map<String, Object> itemMap) { + return VorgangAttachedItemTestFactory.createBuilder() + .id(null) + .version(0L) + .vorgangId(vorgangId) + .itemName(AttachedItemService.BESCHEID_ITEM_NAME) + .client(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME) + .item(itemMap) + .build(); + } + } + + @Nested + class TestGetConfig { + + @Test + void shouldReturnBescheidManagerConfig() { + var config = bescheidServiceBlockingStub.getConfig(GrpcBescheidManagerConfigRequest.newBuilder().build()); + + assertThat(config.getVersion()).isNotEmpty(); + assertThat(config.getJavaVersion()).isEqualTo(System.getProperty("java.version")); + assertThat(config.getFeatures().getCanCreateBescheidDocument()).isFalse(); + } + } +} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedGrpcSentInfoTestFactory.java similarity index 66% rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedGrpcSentInfoTestFactory.java index a3e1fb0389b3612d212fa0678aedfd11ecf950e4..74dee37110b10e19d0dd9b0617f5b5e2c5c4dd3e 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/DeprecatedGrpcSentInfoTestFactory.java @@ -25,17 +25,21 @@ package de.ozgcloud.bescheid; import java.time.ZonedDateTime; -import lombok.Builder; -import lombok.Getter; +import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory; -@Builder -@Getter -public class SentInfo { +@Deprecated +public class DeprecatedGrpcSentInfoTestFactory { - public static final String FIELD_SENT_BY = "sentBy"; - public static final String FIELD_SENT_AT = "sentAt"; + public static final String SENT_AT_STR = "2024-01-01T00:00:00Z"; + public static final ZonedDateTime SENT_AT = ZonedDateTime.parse(SENT_AT_STR); - private String sentBy; - private ZonedDateTime sentAt; + public static GrpcSentInfo create() { + return createBuilder().build(); + } + private static GrpcSentInfo.Builder createBuilder() { + return GrpcSentInfo.newBuilder() + .setSentAt(SENT_AT_STR) + .setSentBy(CallContextUserTestFactory.ID); + } } 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 index 95720de7ca399b35508f54d47da2550cb858dadd..b3d2b041d8f6141127c1902600cf3d0c4c47ed65 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/DocumentGrpcServiceITCase.java @@ -39,10 +39,10 @@ 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.document.bescheid.common.callcontext.CallContextUser; +import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.vorgang.VorgangManagerServerApplication; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; @@ -95,15 +95,15 @@ class DocumentGrpcServiceITCase { } private String saveDocument() { - var document = VorgangAttachedItemTestFactory.createBuilder() + 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")) + 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/bescheid/BescheidDocumentITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidDocumentITCase.java similarity index 94% rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidDocumentITCase.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidDocumentITCase.java index 9a57cb6a5f7b082ba783569f1daf7c765b183d5c..cea527a2cb90329c75ba95f9d1a36affc7ff662f 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidDocumentITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidDocumentITCase.java @@ -21,9 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid; +package de.ozgcloud.document.bescheid; -import static de.ozgcloud.bescheid.BescheidEventListener.*; +import static de.ozgcloud.document.bescheid.BescheidEventListener.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -42,11 +42,11 @@ import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.annotation.DirtiesContext; -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.ITCase; +import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.vorgang.VorgangManagerServerApplication; import de.ozgcloud.vorgang.command.CommandTestFactory; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidGrpcServiceITCase.java similarity index 92% rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidGrpcServiceITCase.java index b0526dd894a7583fd5c89e06e8fd05af4941d872..272675aedf6da371f91674d548adefbb3df7176c 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidGrpcServiceITCase.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid; +package de.ozgcloud.document.bescheid; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -38,13 +38,13 @@ 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.BescheidServiceGrpc.BescheidServiceBlockingStub; -import de.ozgcloud.bescheid.common.callcontext.CallContextUser; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.document.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub; +import de.ozgcloud.document.bescheid.common.callcontext.CallContextUser; +import de.ozgcloud.document.bescheid.common.callcontext.CurrentUserService; +import de.ozgcloud.document.bescheid.common.user.UserProfile; +import de.ozgcloud.document.bescheid.common.user.UserProfileService; +import de.ozgcloud.document.common.attached_item.AttachedItemService; import de.ozgcloud.vorgang.VorgangManagerServerApplication; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidITCase.java similarity index 97% rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidITCase.java index 87fe08890aa9295fbda6a51d5a63f054845f907b..a376c15ff6b445389fec85a2e0c42e058d136174 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/BescheidITCase.java @@ -21,9 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid; +package de.ozgcloud.document.bescheid; -import static de.ozgcloud.bescheid.BescheidEventListener.*; +import static de.ozgcloud.document.bescheid.BescheidEventListener.*; import static org.assertj.core.api.Assertions.*; import static org.awaitility.Awaitility.*; import static org.mockito.ArgumentMatchers.*; @@ -59,11 +59,11 @@ import de.ozgcloud.apilib.user.OzgCloudUserProfile; import de.ozgcloud.apilib.user.OzgCloudUserProfileService; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandStatus; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.document.BescheidDocumentCreatedEvent; import de.ozgcloud.document.Document; import de.ozgcloud.document.DocumentService; +import de.ozgcloud.document.common.attached_item.AttachedItemService; import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory; import de.ozgcloud.nachrichten.postfach.PostfachNachricht; import de.ozgcloud.nachrichten.postfach.PostfachRemoteService; @@ -87,6 +87,7 @@ import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; "grpc.client.vorgang-manager.address=in-process:test", "grpc.client.nachrichten-manager.address=in-process:test", "grpc.client.command-manager.address=in-process:test", + "grpc.client.pluto.address=in-process:test", "ozgcloud.feature.bescheid.enable-dummy-document-processor=true", }) @DataITCase @@ -118,7 +119,7 @@ class BescheidITCase { void init() { mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); mongoOperations.dropCollection(Vorgang.COLLECTION_NAME); - when(postfachRemoteService.getPostfachType()).thenReturn("dummy"); + when(postfachRemoteService.getPostfachType()).thenReturn(ServiceKontoTestFactory.TYPE); when(userProfileService.getById(any())).thenReturn(OzgCloudUserProfile.builder().id(OzgCloudUserId.from(USER_ID)).build()); } @@ -191,7 +192,7 @@ class BescheidITCase { @Captor private ArgumentCaptor<StatusChangedEvent> statusChangedEventCaptor; - private VorgangAttachedItem bescheidItem;; + private VorgangAttachedItem bescheidItem; private String vorgangId; @BeforeEach diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/GrpcSentInfoTestFactory.java similarity index 97% rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/GrpcSentInfoTestFactory.java index e18330fe1fde5e1c0cff7d461ef3452e96054f27..626a3482f2b467872d5238d851582f91b4d70879 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/GrpcSentInfoTestFactory.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid; +package de.ozgcloud.document.bescheid; import java.time.ZonedDateTime; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/TestEventListener.java b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/TestEventListener.java similarity index 97% rename from vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/TestEventListener.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/TestEventListener.java index 1968b51b907dede97a4580038ac49b352729283d..9267814b32ebf1dda948e57989fb958f3f5a00db 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/TestEventListener.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/document/bescheid/TestEventListener.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid; +package de.ozgcloud.document.bescheid; import org.springframework.context.event.EventListener; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java index 1488e8f8dd4f1baef4b2831081ccd6a078a6ef36..3424a6f908f5386f5c98f0fab87a926b5a6bf3d4 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java @@ -24,6 +24,7 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.annotation.DirtiesContext; +import de.ozgcloud.apilib.common.errorhandling.NotFoundException; import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.nachrichten.postfach.PostfachAddress; @@ -186,6 +187,58 @@ class AntragraumITCase { } } + @DisplayName("Ger rueckfrage") + @Nested + class TestGetRueckfrage { + + @Mock + private StreamObserver<GrpcGetRueckfrageResponse> responseObserver; + + @Captor + private ArgumentCaptor<GrpcGetRueckfrageResponse> captor; + + private Vorgang savedVorgang; + private VorgangAttachedItem vorgangAttachedItem; + + @BeforeEach + void prepareDatabase() { + savedVorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build(), Vorgang.COLLECTION_NAME); + vorgangAttachedItem = mongoOperations.save(createPostfachNachrichtVorgangAttachedItem(savedVorgang.getId()), + VorgangAttachedItem.COLLECTION_NAME); + + when(verifier.verify(any())).thenReturn(Collections.emptyList()); + when(decrypter.decryptTrustLevel(any())).thenReturn("STORK-QAA-Level-1"); + } + + @Test + void shouldReturnOnMatchingPostfachId() { + when(decrypter.decryptPostfachId(any())).thenReturn(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + var request = GrpcGetRueckfrageRequestTestFactory.createBuilder() + .setId(vorgangAttachedItem.getId()) + .setSamlToken(TestUtils.loadTextFile("SamlResponse.xml")) + .build(); + + grpcService.getRueckfrage(request, responseObserver); + + verify(responseObserver, timeout(30000)).onNext(captor.capture()); + assertThat(captor.getValue().getRueckfrage()).isNotNull(); + } + + @Test + void shouldThrowExceptionOnMismatchingPostfachId() { + when(decrypter.decryptPostfachId(any())).thenReturn("not-match-postfach-id"); + + var request = GrpcGetRueckfrageRequestTestFactory.createBuilder() + .setId(vorgangAttachedItem.getId()) + .setSamlToken(TestUtils.loadTextFile("SamlResponse.xml")) + .build(); + assertThatThrownBy(() -> grpcService.getRueckfrage(request, responseObserver)) + .isInstanceOf(NotFoundException.class) + .hasMessageContaining("PostfachNachricht") + .hasMessageContaining(vorgangAttachedItem.getId()); + } + } + private Vorgang createVorgang(TrustLevel trustLevel) { return VorgangTestFactory.createBuilder() .id(null) @@ -214,12 +267,11 @@ class AntragraumITCase { nachrichtItem.put(PostfachNachricht.FIELD_DIRECTION, DIRECTION.OUT.name()); nachrichtItem.put(PostfachNachricht.FIELD_REPLY_OPTION, ReplyOption.POSSIBLE); nachrichtItem.put(PostfachNachricht.FIELD_VORGANG_ID, vorgangId); - nachrichtItem.put(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); nachrichtItem.put(PostfachNachricht.POSTFACH_ADDRESS_FIELD, Map.of( PostfachAddress.TYPE_FIELD, 0, PostfachAddress.VERSION_FIELD, 1, PostfachAddress.IDENTIFIER_FIELD, - Map.of(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE), + Map.of(PostfachAddress.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE), PostfachAddress.SERVICEKONTO_TYPE_FIELD, "BAYERN_ID")); return nachrichtItem; } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java index 566a427a59914c63bce1077851710e205be84baa..c609c9f7e9df3ea1e1ff757b819d6dcce45169a7 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerITCase.java @@ -48,6 +48,7 @@ import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.VorgangAttachedItemCreatedEvent; import de.ozgcloud.common.test.ITCase; +import de.ozgcloud.notification.user.UserNotificationEventListener; import de.ozgcloud.vorgang.VorgangManagerServerApplication; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; import de.ozgcloud.vorgang.command.CommandService; @@ -74,6 +75,9 @@ class PostfachEventListenerITCase { @MockBean private CommandService commandService; + @MockBean + private UserNotificationEventListener userNotificationEventListener; + @Nested class TestSendPostfachNachricht { 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 8c657211a40fd0c72b8e13aeff1de606304a4601..45c4d3a7ddba762f9f86c7571ed3755b29848c86 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 @@ -56,29 +56,32 @@ import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestTemplate; import de.ozgcloud.common.test.DataITCase; -import de.ozgcloud.nachrichten.attributes.ClientAttributeService; +import de.ozgcloud.nachrichten.common.grpc.NachrichtenCallContextAttachingInterceptor; import de.ozgcloud.nachrichten.postfach.osi.MessageAttachmentTestFactory; import de.ozgcloud.nachrichten.postfach.osi.MessageJsonReplyTestFactory; -import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory; import de.ozgcloud.nachrichten.postfach.osi.OsiPostfachProperties; import de.ozgcloud.vorgang.VorgangManagerServerApplication; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.clientattribute.ClientAttribute; +import de.ozgcloud.vorgang.clientattribute.ClientAttributeMap; import de.ozgcloud.vorgang.command.CommandService; import de.ozgcloud.vorgang.common.security.PolicyService; import de.ozgcloud.vorgang.files.FileId; import de.ozgcloud.vorgang.files.FileService; import de.ozgcloud.vorgang.files.OzgFile; +import de.ozgcloud.vorgang.vorgang.Vorgang; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import io.grpc.stub.StreamObserver; @SpringBootTest(classes = { VorgangManagerServerApplication.class, OsiPostfachProperties.class }, properties = { "grpc.server.in-process-name=postfachitcase", + "grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase", + "grpc.client.command-manager.address=in-process:postfachitcase", + "grpc.client.pluto.address=in-process:postfachitcase", "ozgcloud.osi.postfach.proxyapi.url=http://localhost/ApiProxy/V1/Message", "ozgcloud.osi.postfach.proxyapi.key=1234", "ozgcloud.osi.postfach.proxyapi.realm=test-realm", "ozgcloud.osi.postfach.notification.mail-from=test@local.host", - "grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase", - "grpc.client.command-manager.address=in-process:postfachitcase", - }) @WithMockUser @DataITCase @@ -94,6 +97,9 @@ class PostfachMailITCase { private MongoOperations mongoOperations; @Autowired private RestTemplate restTemplate; + @Autowired + private FileService fileService; + @MockBean private PolicyService policyService; @@ -102,17 +108,19 @@ class PostfachMailITCase { @Captor private ArgumentCaptor<GrpcFindPostfachMailsResponse> responseCaptor; - @MockBean - private ClientAttributeService clientAttributeService; - @SpyBean private CommandService commandService; private MockRestServiceServer mockServer; + private Vorgang vorgang; + @BeforeEach void prepareDatabase() { + mongoOperations.dropCollection(Vorgang.COLLECTION_NAME); mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); + vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build()); + doNothing().when(policyService).checkPermission(anySet()); when(policyService.hasOrganisationEinheitenId(any())).thenReturn(true); when(policyService.hasOrganisationEinheitenIdByVorgangAttachedItem(any())).thenReturn(true); } @@ -122,6 +130,14 @@ class PostfachMailITCase { mockServer = MockRestServiceServer.createServer(restTemplate); } + private List<GrpcPostfachMail> callGrpcListEndpoint() { + grpcService.findPostfachMails(GrpcFindPostfachMailsRequest.newBuilder().setVorgangId(vorgang.getId()).build(), + responseObserver); + + verify(responseObserver, atLeastOnce()).onNext(responseCaptor.capture()); + return responseCaptor.getValue().getMailsList(); + } + @Nested class TestSendingMail { @@ -151,14 +167,66 @@ class PostfachMailITCase { var mails = await().atMost(60, TimeUnit.SECONDS) .until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement); - assertThat(mails.get(0).getCreatedAt()).isNotNull(); - assertThat(mails.get(0).getDirection()).isEqualTo(GrpcDirection.OUT); - assertThat(mails.get(0).getSentAt()).isNotNull(); - assertThat(ZonedDateTime.parse(mails.get(0).getSentAt())).isCloseTo(ZonedDateTime.now(), within(61, ChronoUnit.SECONDS)); - assertThat(mails.get(0).getSentSuccessful()).isTrue(); + assertThat(mails).hasSize(1).first().satisfies(mail -> { + assertThat(mail.getCreatedAt()).isNotNull(); + assertThat(mail.getDirection()).isEqualTo(GrpcDirection.OUT); + assertThat(mail.getSentAt()).isNotNull(); + assertThat(ZonedDateTime.parse(mail.getSentAt())).isCloseTo(ZonedDateTime.now(), within(61, ChronoUnit.SECONDS)); + assertThat(mail.getSentSuccessful()).isTrue(); + + }); } } + @Test + void shouldSetHasNachrichtAttribute() { + mockServerSendSuccess(); + + callGrpcEndpoint(); + await().atMost(60, TimeUnit.SECONDS) + .until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement); + + assertThat(getHasNachrichtAttribute().getBoolValue()).hasValue(true); + } + + private void mockServerSendFailed() { + mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI)) + .andExpect(method(HttpMethod.POST)) + .andRespond(withSuccess("false", MediaType.APPLICATION_JSON)); + } + + private void mockServerSendSuccess() { + mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI)) + .andExpect(method(HttpMethod.POST)) + .andRespond(withSuccess()); + } + + private void callGrpcEndpoint() { + callGrpcEndpoint("OSI"); + } + + private void callResendGrpcEndpoint(String mailId) { + grpcService.resendPostfachMail(GrpcResendPostfachMailRequestTestFactory.createBuilder().setPostfachMailId(mailId).build(), + resendResponseObserver); + } + + private void callGrpcEndpoint(String postfachType) { + grpcService.sendPostfachMail(buildSendPostfachMailRequestWithoutAttachments(postfachType), responseObserver); + } + + private GrpcSendPostfachMailRequest buildSendPostfachMailRequestWithoutAttachments(String postfachType) { + var grpcPostfachMail = GrpcPostfachMailTestFactory.createBuilder().clearId().clearAttachment().clearCreatedAt().clearDirection() + .setPostfachAddress(GrpcPostfachAddressTestFactory.createBuilder().setServiceKontoType(postfachType).build()) + .setVorgangId(vorgang.getId()).build(); + return GrpcSendPostfachMailRequestTestFactory.createBuilder().setMail(grpcPostfachMail).build(); + } + + private ClientAttribute getHasNachrichtAttribute() { + return mongoOperations.findById(vorgang.getId(), Vorgang.class).getClientAttributes() + .getOrDefault(NachrichtenCallContextAttachingInterceptor.NACHRICHTEN_MANAGER_CLIENT_NAME, new ClientAttributeMap()) + .getOrDefault("hasPostfachNachricht", ClientAttribute.builder().build()); + } + @Nested class TestSendingFailed { @@ -174,13 +242,14 @@ class PostfachMailITCase { callGrpcEndpoint(); - await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> { - assertThat(callGrpcListEndpoint()).hasSize(1).first().satisfies(mail -> { - assertThat(mail.getSentAt()).isNotNull(); - assertThat(ZonedDateTime.parse(mail.getSentAt())).isCloseTo(ZonedDateTime.now(), within(61, ChronoUnit.SECONDS)); - assertThat(mail.getSentSuccessful()).isFalse(); - }); - }); + await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> + assertThat(callGrpcListEndpoint()).hasSize(1).first().satisfies(postfachNachricht -> { + assertThat(postfachNachricht.getSentAt()).isNotNull(); + assertThat(ZonedDateTime.parse(postfachNachricht.getSentAt())).isCloseTo(ZonedDateTime.now(), + within(61, ChronoUnit.SECONDS)); + assertThat(postfachNachricht.getSentSuccessful()).isFalse(); + }) + ); } @Test @@ -191,9 +260,8 @@ class PostfachMailITCase { var mails = await().atMost(60, TimeUnit.SECONDS) .until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement); - var mailId = mails.get(0).getId(); - callResendGrpcEndpoint(mailId); + callResendGrpcEndpoint(mails.getFirst().getId()); await().atMost(60, TimeUnit.SECONDS).untilAsserted( () -> assertThat(callGrpcListEndpoint()).hasSize(1).first().extracting(GrpcPostfachMail::getSentSuccessful).isEqualTo(true)); } @@ -206,42 +274,18 @@ class PostfachMailITCase { callGrpcEndpoint(); var mails = await().atMost(60, TimeUnit.SECONDS) .until(PostfachMailITCase.this::callGrpcListEndpoint, PostfachMailITCase.this::hasAtLeastOneElement); - var mailId = mails.get(0).getId(); + assertThat(mails).hasSize(1); - callResendGrpcEndpoint(mailId); + callResendGrpcEndpoint(mails.getFirst().getId()); mails = callGrpcListEndpoint(); - assertThat(mails.get(0).getSentSuccessful()).isFalse(); - assertThat(mails.get(0).getMessageCode()).isEqualTo(PostfachMessageCode.PROCESS_FAILED_MESSAGE_CODE.getMessageCode()); + assertThat(mails).hasSize(1).first().satisfies(mail -> { + assertThat(mail.getSentSuccessful()).isFalse(); + assertThat(mail.getMessageCode()).isEqualTo(PostfachMessageCode.PROCESS_FAILED_MESSAGE_CODE.getMessageCode()); + }); } } - private void mockServerSendFailed() { - mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI)) - .andExpect(method(HttpMethod.POST)) - .andRespond(withSuccess("false", MediaType.APPLICATION_JSON)); - } - - private void mockServerSendSuccess() { - mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI)) - .andExpect(method(HttpMethod.POST)) - .andRespond(withSuccess()); - } - - private void callGrpcEndpoint() { - grpcService.sendPostfachMail(buildSendPostfachMailRequestWithoutAttachments(), responseObserver); - } - - private GrpcSendPostfachMailRequest buildSendPostfachMailRequestWithoutAttachments() { - var grpcPostfachMail = GrpcPostfachMailTestFactory.createBuilder().clearId().clearAttachment().clearCreatedAt().clearDirection() - .setVorgangId(MessageTestFactory.VORGANG_ID).build(); - return GrpcSendPostfachMailRequestTestFactory.createBuilder().setMail(grpcPostfachMail).build(); - } - - private void callResendGrpcEndpoint(String mailId) { - grpcService.resendPostfachMail(GrpcResendPostfachMailRequestTestFactory.createBuilder().setPostfachMailId(mailId).build(), - resendResponseObserver); - } } @Nested @@ -250,37 +294,26 @@ class PostfachMailITCase { @Autowired private PostfachService service; - private void mockServerReceiveReply(String replyJson) { - mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI)) - .andExpect(method(HttpMethod.GET)) - .andRespond(withSuccess(replyJson, MediaType.APPLICATION_JSON)); - - mockServer.expect(ExpectedCount.once(), method(HttpMethod.DELETE)).andRespond(withSuccess()); - } - @Nested class TestFetchAndListReply { - @Autowired - private FileService fileService; - @Test void shouldListNachrichten() { - mockServerReceiveReply(MessageJsonReplyTestFactory.buildReplyJson()); + mockServerReceiveReply(); fetchAndPersistReplies(); var mails = callGrpcListEndpoint(); - assertThat(mails).hasSize(1); - assertThat(mails.get(0).getCreatedAt()).isNotNull(); - assertThat(mails.get(0).getDirection()).isEqualTo(GrpcDirection.IN); - + assertThat(mails).hasSize(1).first().satisfies(mail -> { + assertThat(mail.getCreatedAt()).isNotNull(); + assertThat(mail.getDirection()).isEqualTo(GrpcDirection.IN); + }); mockServer.verify(); } @Test void shouldContainAttachment() { - mockServerReceiveReply(MessageJsonReplyTestFactory.buildReplyJson()); + mockServerReceiveReply(); fetchAndPersistReplies(); @@ -291,16 +324,39 @@ class PostfachMailITCase { @Test void shouldHaveContentTypeDOCX() { - var attachment = MessageAttachmentTestFactory.createBuilder().fileName("wort-datei.docx").build(); - mockServerReceiveReply(MessageJsonReplyTestFactory.buildReplyJson(MessageTestFactory.create(), attachment)); + var messageJsonReply = MessageJsonReplyTestFactory.createBuilder().vorgangId(vorgang.getId()).clearAttachments() + .attachment(MessageAttachmentTestFactory.createBuilder().fileName("wort-datei.docx").build()) + .build(); + mockServerReceiveReply(messageJsonReply); fetchAndPersistReplies(); var mails = callGrpcListEndpoint(); assertThat(mails).hasSize(1); - var binaryFile = fileService.findFilesMetaData(List.of(FileId.from(mails.get(0).getAttachmentList().get(0)))).findFirst() - .orElse(OzgFile.builder().build()); - assertThat(binaryFile.getContentType()).isEqualTo("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + var binaryFiles = loadAttachments(mails.getFirst()); + assertThat(binaryFiles).hasSize(1).first().extracting(OzgFile::getContentType) + .isEqualTo("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + } + + @Test + void shouldSetHasNewPostfachNachricht() { + mockServerReceiveReply(); + + fetchAndPersistReplies(); + + assertThat(getHasNewNachrichtAttribute().getBoolValue()).hasValue(true); + } + + private void mockServerReceiveReply() { + mockServerReceiveReply(MessageJsonReplyTestFactory.createBuilder().vorgangId(vorgang.getId()).build()); + } + + private void mockServerReceiveReply(String replyJson) { + mockServer.expect(ExpectedCount.once(), requestTo(TEST_OSI_POSTFACH_URI)) + .andExpect(method(HttpMethod.GET)) + .andRespond(withSuccess(replyJson, MediaType.APPLICATION_JSON)); + + mockServer.expect(ExpectedCount.once(), method(HttpMethod.DELETE)).andRespond(withSuccess()); } private void fetchAndPersistReplies() { @@ -308,16 +364,19 @@ class PostfachMailITCase { verify(commandService, timeout(60000)).setCommandFinished(any(), any()); } - } - } + private List<OzgFile> loadAttachments(GrpcPostfachMail mail) { + assertThat(mail.getAttachmentList()).hasSize(1); + return fileService.findFilesMetaData((mail.getAttachmentList().stream().map(FileId::from).toList())).toList(); + } - private List<GrpcPostfachMail> callGrpcListEndpoint() { - grpcService.findPostfachMails(GrpcFindPostfachMailsRequest.newBuilder().setVorgangId(MessageTestFactory.VORGANG_ID).build(), - responseObserver); + private ClientAttribute getHasNewNachrichtAttribute() { + return mongoOperations.findById(vorgang.getId(), Vorgang.class).getClientAttributes() + .get(NachrichtenCallContextAttachingInterceptor.NACHRICHTEN_MANAGER_CLIENT_NAME) + .get("hasNewPostfachNachricht"); + } + } - verify(responseObserver, atLeastOnce()).onNext(responseCaptor.capture()); - return responseCaptor.getValue().getMailsList(); } private boolean hasAtLeastOneElement(Collection<GrpcPostfachMail> mails) { diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachApiTestCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachITCase.java similarity index 81% rename from vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachApiTestCase.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachITCase.java index 6a6c7dacd4c1b5dae5e83912b382e5155d2b603d..7e63f3d048e74019c36a4c49b2f546462979c077 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachApiTestCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachITCase.java @@ -34,8 +34,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import de.ozgcloud.common.test.ITCase; +import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory; import de.ozgcloud.nachrichten.postfach.PostfachNachricht; import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory; +import de.ozgcloud.nachrichten.postfach.StringBasedIdentifier; import de.ozgcloud.vorgang.VorgangManagerServerApplication; @Disabled("Echter Test für OSI Postfach mit echtem Zugriff. Unbedingt defaultmäßig deaktivieren!!") @@ -48,13 +50,13 @@ import de.ozgcloud.vorgang.VorgangManagerServerApplication; "ozgcloud.osi.postfach.scheduler.enabled=false" }) @ITCase -class OsiPostfachApiTestCase { +class OsiPostfachITCase { @Autowired private OsiPostfachRemoteService service; @Test - void testGetAllMessages() { + void shouldGetAllMessages() { Stream<PostfachNachricht> messages = service.getAllMessages(); assertThat(messages).hasSizeGreaterThan(0); @@ -62,13 +64,16 @@ class OsiPostfachApiTestCase { @Test @Disabled("Echter Test für OSI Postfach mit echtem Zugriff. Unbedingt defaultmäßig deaktivieren!!") - void testSendMessage() { + void shouldSendMessage() { PostfachNachricht nachricht = PostfachNachrichtTestFactory.createBuilder() - .postfachId("2f5c78f8-4891-456f-269b-08d937ab9a72").vorgangId("98877665544").build(); + .postfachAddress(PostfachAddressTestFactory.createBuilder() + .serviceKontoType(OsiPostfachRemoteService.POSTFACH_TYPE) + .identifier(StringBasedIdentifier.builder().postfachId("2f5c78f8-4891-456f-269b-08d937ab9a72").build()) + .build() + ) + .vorgangId("98877665544").build(); - assertDoesNotThrow(() -> { - service.sendMessage(nachricht); - }); + assertDoesNotThrow(() -> service.sendMessage(nachricht)); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java index cfaf9ff74c00daa0d1405a656fb898ce181a0256..ef465103f6ad9e81c6a4741bd581d40179b1d6aa 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemITCase.java @@ -289,7 +289,8 @@ class VorgangAttachedItemITCase { private Command createRevokeCommand() { return CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM.name()) .relationId(persistedItem.getId()) - .relationVersion(persistedItem.getVersion()) + .relationVersion(persistedItem.getVersion() - 1) + .createdResource(persistedItem.getId()) .bodyObject(VorgangAttachedItemTestFactory.asMap()).build(); } } @@ -298,11 +299,11 @@ class VorgangAttachedItemITCase { @Nested class TestRevokeUpdateItem { - private final Map<String, Object> createItem = Map.<String, Object>of("EntryToRecoverByRevokeKey", "EntryToRecoverByRevokeValue", + private final Map<String, Object> createItem = Map.of("EntryToRecoverByRevokeKey", "EntryToRecoverByRevokeValue", VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE); private VorgangAttachedItem persistedItem; - private final Map<String, Object> updateItem = Map.<String, Object>of( + private final Map<String, Object> updateItem = Map.of( VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "RevertByRevokeValue", "NewToRemoveByRevokeKey", "NewToRemoveByRevokeValue"); private Command updatedCommand; @@ -391,11 +392,11 @@ class VorgangAttachedItemITCase { @Nested class TestRevokePatchItem { - private final Map<String, Object> createItem = Map.<String, Object>of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, + private final Map<String, Object> createItem = Map.of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, VorgangAttachedItemTestFactory.ITEM_FIELD_STRING_VALUE); private VorgangAttachedItem persistedItem; - private final Map<String, Object> patchItem = Map.<String, Object>of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "UpdatedStringValue"); + private final Map<String, Object> patchItem = Map.of(VorgangAttachedItemTestFactory.ITEM_FIELD_NAME, "UpdatedStringValue"); private Command patchedCommand; private String vorgangId; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java index fcb9657c560845ce3a0b4e61cf3a7d003585db08..7447aa18488ebd0ed7406989214afbda377580da 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/VorgangAttachedItemServiceTest.java @@ -516,7 +516,7 @@ class VorgangAttachedItemServiceTest { @Nested class TestRevokeCreate { - private final Command command = CommandTestFactory.create(); + private final Command command = CommandTestFactory.createBuilder().createdResource(CommandTestFactory.CREATED_RESOURCE).build(); @Test void shouldCallHandleRevoke() { @@ -529,7 +529,7 @@ class VorgangAttachedItemServiceTest { void shouldCallDelete() { service.revokeCreate(command); - verify(service).delete(CommandTestFactory.RELATION_ID, CommandTestFactory.RELATION_VERSION); + verify(service).delete(CommandTestFactory.CREATED_RESOURCE, CommandTestFactory.RELATION_VERSION + 1); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java index 32db2a67bebf61625a2e5eea835a61eaa5c87665..2a9d8659032b1ea7aa719ebab32e5f1570c3d361 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java @@ -34,13 +34,17 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.concurrent.TimeUnit; import org.bson.types.ObjectId; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -52,16 +56,27 @@ import org.springframework.data.mongodb.gridfs.GridFsTemplate; import org.springframework.test.annotation.DirtiesContext; import com.google.protobuf.ByteString; +import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.apilib.user.OzgCloudUserId; import de.ozgcloud.apilib.user.OzgCloudUserProfile; import de.ozgcloud.apilib.user.OzgCloudUserProfileService; +import de.ozgcloud.collaboration.CollaborationRequest; import de.ozgcloud.collaboration.CollaborationServiceGrpc.CollaborationServiceBlockingStub; import de.ozgcloud.collaboration.GrpcGetFileContentRequest; +import de.ozgcloud.collaboration.request.CollaborationRequestId; +import de.ozgcloud.collaboration.request.CollaborationRequestServiceGrpc.CollaborationRequestServiceBlockingStub; +import de.ozgcloud.collaboration.request.GrpcFindRequestsRequest; +import de.ozgcloud.collaboration.request.GrpcGetRequestRequest; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandStatus; +import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.nachrichten.postfach.PostfachAddress; +import de.ozgcloud.nachrichten.postfach.PostfachNachricht; +import de.ozgcloud.nachrichten.postfach.PostfachRemoteService; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; import de.ozgcloud.vorgang.callcontext.CallContext; import de.ozgcloud.vorgang.callcontext.TestCallContextAttachingInterceptor; import de.ozgcloud.vorgang.callcontext.WithMockCustomUser; @@ -71,10 +86,15 @@ import de.ozgcloud.vorgang.command.CreateCommandRequest; import de.ozgcloud.vorgang.files.FileService; import de.ozgcloud.vorgang.files.GridFsTestFactory; import de.ozgcloud.vorgang.files.OzgFileTestFactory; +import de.ozgcloud.vorgang.servicekonto.PostfachAddressTestFactory; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; +import de.ozgcloud.vorgang.vorgang.EingangTestFactory; import de.ozgcloud.vorgang.vorgang.Vorgang; import de.ozgcloud.vorgang.vorgang.VorgangHead; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.ZustaendigeStelleTestFactory; +import io.grpc.Status; +import io.grpc.StatusRuntimeException; import net.devh.boot.grpc.client.inject.GrpcClient; @SpringBootTest(properties = { @@ -82,13 +102,19 @@ import net.devh.boot.grpc.client.inject.GrpcClient; "grpc.client.vorgang-manager.address=in-process:test", "grpc.client.ozgcloud-command-manager.address=in-process:test", "grpc.client.file-manager.address=in-process:test", - "grpc.client.inProcess.address=in-process:test" + "grpc.client.vorgang-attached-item.address=in-process:test", + "grpc.client.inProcess.address=in-process:test", + "grpc.client.pluto.address=in-process:test" }) @DataITCase @WithMockCustomUser @DirtiesContext class CollaborationITCase { + private static final String FIELD_COLLABORATION_VORGANG_ID = "collaborationVorgangId"; + private static final String TITEL = "Collaboration Vorgang"; + private static final String BESCHREIBUNG = "Beschreibung der Anfrage"; + @Autowired private CommandService commandService; @@ -97,85 +123,22 @@ class CollaborationITCase { @MockBean private OzgCloudUserProfileService ozgCloudUserProfileService; + @MockBean + private PostfachRemoteService postfachRemoteService; @Mock private OzgCloudUserProfile ozgCloudUserProfile; - @Nested - class TestCreateCollaborationVorgang { - - @BeforeEach - void init() { - mongoOperations.dropCollection(Command.class); - mongoOperations.dropCollection(Vorgang.class); - mongoOperations.dropCollection(VorgangAttachedItem.class); - when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY)); - when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile); + private String vorgangId; - vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId(); - } - - private static final String FIELD_COLLABORATION_VORGANG_ID = "collaborationVorgangId"; - private static final String TITEL = "Collaboration Vorgang"; - private static final String ANFRAGE = "Anfrage"; - - private String vorgangId; - - @Test - void shouldSetCollaborationVorgangId() { - var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId)); - - waitUntilCommandFinished(command.getId()); - - var collaborationRequests = loadCollaborationRequest(vorgangId); - assertThat(collaborationRequests).hasSize(1).first().extracting(VorgangAttachedItem::getItem, MAP) - .containsKey(FIELD_COLLABORATION_VORGANG_ID); - } - - @Test - void shouldCreateCollaborationVorgang() { - var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId)); - - waitUntilCommandFinished(command.getId()); - - var collaborationVorgang = loadCollaborationVorgang(vorgangId); - assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getCollaborationLevel) - .isEqualTo(CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL); - assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getOrganisationsEinheitId) - .isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - assertThat(collaborationVorgang.getClientAttributes()).isEmpty(); - } - - private CreateCommandRequest buildCreateCollaborationVorgangCommand(String vorgangId) { - return CreateCommandRequest.builder() - .callContext(CallContext.builder().client("test").build()) - .vorgangId(vorgangId) - .relationId(vorgangId) - .order("CREATE_COLLABORATION_REQUEST") - .bodyObject(Map.of( - "titel", TITEL, - "anfrage", ANFRAGE, - "zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)) - .build(); - } - - private void waitUntilCommandFinished(String commandId) { - await().atMost(60, TimeUnit.SECONDS).until( - () -> mongoOperations.findById(commandId, Command.class), - command -> command.getStatus() == CommandStatus.FINISHED); - } + @BeforeEach + void init() { + when(postfachRemoteService.getPostfachType()).thenReturn(ServiceKontoTestFactory.TYPE); + mongoOperations.dropCollection(Command.class); + mongoOperations.dropCollection(Vorgang.class); + mongoOperations.dropCollection(VorgangAttachedItem.class); - private Vorgang loadCollaborationVorgang(String sourceVorgangId) { - var collaborationVorgangId = loadCollaborationRequest(sourceVorgangId).getFirst().getItem().get(FIELD_COLLABORATION_VORGANG_ID); - return mongoOperations.findById(collaborationVorgangId, Vorgang.class); - } - - private List<VorgangAttachedItem> loadCollaborationRequest(String vorgangId) { - var query = new Query(new Criteria().andOperator( - Criteria.where(VorgangAttachedItem.FIELDNAME_VORGANG_ID).is(vorgangId), - Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest"))); - return mongoOperations.find(query, VorgangAttachedItem.class); - } + vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId(); } @DisplayName("Get file content") @@ -226,7 +189,7 @@ class CollaborationITCase { private byte[] downloadBinaryFile(ObjectId fileId) { var request = GrpcGetFileContentRequest.newBuilder() .setId(fileId.toHexString()).build(); - var it = prepareBinaryFileServiceBlockingStub().getFileContent(request); + var it = getServiceStub().getFileContent(request); var content = new ByteArrayOutputStream(); while (it.hasNext()) { ByteString chunkContent = it.next().getFileContent(); @@ -240,8 +203,247 @@ class CollaborationITCase { return content.toByteArray(); } - private CollaborationServiceBlockingStub prepareBinaryFileServiceBlockingStub() { + private CollaborationServiceBlockingStub getServiceStub() { return collaborationStub.withInterceptors(new TestCallContextAttachingInterceptor()); } } + + private CreateCommandRequest buildCreateCollaborationVorgangCommand(String vorgangId, int collaborationLevel) { + return CreateCommandRequest.builder() + .callContext(CallContext.builder().client("test").build()) + .vorgangId(vorgangId) + .relationId(vorgangId) + .order("CREATE_COLLABORATION_REQUEST") + .bodyObject(Map.of( + "titel", TITEL, + "beschreibung", BESCHREIBUNG, + "collaborationLevel", collaborationLevel, + "zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)) + .build(); + } + + private List<VorgangAttachedItem> loadCollaborationRequest(String vorgangId) { + var query = new Query(new Criteria().andOperator( + Criteria.where(VorgangAttachedItem.FIELDNAME_VORGANG_ID).is(vorgangId), + Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest"))); + return mongoOperations.find(query, VorgangAttachedItem.class); + } + + private void waitUntilCommandHasStatus(String commandId, CommandStatus status) { + await().atMost(600, TimeUnit.SECONDS).until( + () -> mongoOperations.findById(commandId, Command.class), + command -> command.getStatus() == status); + } + + @Nested + class TestCreateCollaborationVorgang { + + @BeforeEach + void init() { + when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY)); + when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile); + } + + @Test + void shouldSetCollaborationVorgangId() { + var command = commandService.createCommand( + buildCreateCollaborationVorgangCommand(vorgangId, CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL)); + + waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED); + + var collaborationRequests = loadCollaborationRequest(vorgangId); + assertThat(collaborationRequests).hasSize(1).first().extracting(VorgangAttachedItem::getItem, MAP) + .containsKey(FIELD_COLLABORATION_VORGANG_ID); + } + + @Test + void shouldCreateCollaborationVorgang() { + var command = commandService.createCommand( + buildCreateCollaborationVorgangCommand(vorgangId, CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL)); + + waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED); + + var collaborationVorgang = loadCollaborationVorgang(vorgangId); + assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getCollaborationLevel) + .isEqualTo(CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL); + assertThat(collaborationVorgang.getHeader()).extracting(VorgangHead::getOrganisationsEinheitId) + .isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); + assertThat(collaborationVorgang.getClientAttributes()).isEmpty(); + } + + private Vorgang loadCollaborationVorgang(String sourceVorgangId) { + var collaborationVorgangId = loadCollaborationRequest(sourceVorgangId).getFirst().getItem().get(FIELD_COLLABORATION_VORGANG_ID); + return mongoOperations.findById(collaborationVorgangId, Vorgang.class); + } + + } + + @Nested + class TestCreateFachstellenBeteiligungRequest { + + private static final int COLLABORATION_LEVEL = 4; + + @Captor + private ArgumentCaptor<PostfachNachricht> postfachNachrichtCaptor; + + @BeforeEach + void init() { + when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY)); + when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile); + } + + @Test + void shouldCreateCollaborationRequest() { + var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId, COLLABORATION_LEVEL)); + + waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED); + + var collaborationRequests = loadCollaborationRequest(vorgangId); + assertThat(collaborationRequests).hasSize(1).first().extracting(VorgangAttachedItem::getItem, MAP) + .containsEntry(FIELD_COLLABORATION_VORGANG_ID, vorgangId); + } + + @Test + void shouldSendPostfachNachricht() { + var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId, COLLABORATION_LEVEL)); + + waitUntilCommandHasStatus(command.getId(), CommandStatus.FINISHED); + + verify(postfachRemoteService).sendMessage(postfachNachrichtCaptor.capture()); + assertThat(postfachNachrichtCaptor.getValue().getPostfachAddress()).extracting(PostfachAddress::getIdentifier) + .hasToString(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + } + + @Test + void shouldDeleteCollaborationRequest() { + doThrow(TechnicalException.class).when(postfachRemoteService).sendMessage(any()); + var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId, COLLABORATION_LEVEL)); + + waitUntilCommandHasStatus(command.getId(), CommandStatus.ERROR); + + assertThat(loadCollaborationRequest(vorgangId)).isEmpty(); + } + } + + @DisplayName("Collaboration requests") + @Nested + class TestCollaborationRequests { + + @GrpcClient("inProcess") + private CollaborationRequestServiceBlockingStub collaborationRequestStub; + + public static final String ID_STR = UUID.randomUUID().toString(); + public static final CollaborationRequestId ID = CollaborationRequestId.from(ID_STR); + + public static final String TITEL = LoremIpsum.getInstance().getWords(5); + public static final String BESCHREIBUNG = LoremIpsum.getInstance().getWords(10); + public static final String ZUSTAENDIGE_STELLE = UUID.randomUUID().toString(); + public static final String COLLABORATION_VORGANG_ID = UUID.randomUUID().toString(); + public static final int COLLABORATION_lEVEL = 1; + + private final Vorgang vorgang = VorgangTestFactory.create(); + + private final Map<String, Object> collaborationRequestItem = Map.of(CollaborationRequest.PROPERTY_ID, ID_STR, + CollaborationRequest.PROPERTY_COMMAND_ID, CommandTestFactory.ID, + CollaborationRequest.PROPERTY_VORGANG_ID, VorgangTestFactory.ID, + CollaborationRequest.PROPERTY_COLLABORATION_VORGANG_ID, COLLABORATION_VORGANG_ID, + CollaborationRequest.PROPERTY_COLLABORATION_LEVEL, String.valueOf(COLLABORATION_lEVEL), + CollaborationRequest.PROPERTY_CREATED_BY, CommandTestFactory.CREATED_BY, + CollaborationRequest.PROPERTY_TITEL, TITEL, + CollaborationRequest.PROPERTY_BESCHREIBUNG, BESCHREIBUNG, + CollaborationRequest.PROPERTY_ZUSTAENDIGE_STELLE, ZUSTAENDIGE_STELLE); + + private final VorgangAttachedItem vorgangAttachedItem = VorgangAttachedItemTestFactory.createBuilder() + .id(null) + .vorgangId(VorgangTestFactory.ID) + .version(0) + .client("AlfaTestClient") + .itemName("CollaborationRequest") + .deleted(false) + .item(collaborationRequestItem) + .build(); + + private VorgangAttachedItem savedCollaborationRequest; + + @BeforeEach + void init() { + mongoOperations.save(vorgang); + savedCollaborationRequest = mongoOperations.save(vorgangAttachedItem); + } + + @DisplayName("Get Request") + @Nested + class TestGetRequest { + + @Test + void shouldReturnNotFoundExceptionOnNonExisting() { + var id = UUID.randomUUID().toString(); + var request = GrpcGetRequestRequest.newBuilder().setId(id).build(); + var serviceStub = getServiceStub(); + + assertThatThrownBy(() -> serviceStub.getRequest(request)) + .isInstanceOf(StatusRuntimeException.class) + .hasMessageContaining("NOT_FOUND") + .hasMessageContaining(id); + } + + @Test + void shouldReturnExistingCollaborationRequest() { + var response = getServiceStub().getRequest(GrpcGetRequestRequest.newBuilder().setId(savedCollaborationRequest.getId()).build()); + + assertThat(response.getRequest()).satisfies(grpcCollaborationRequest -> { + assertThat(grpcCollaborationRequest.getId()).isEqualTo(savedCollaborationRequest.getId()); + assertThat(grpcCollaborationRequest.getTitel()).isEqualTo(TITEL); + assertThat(grpcCollaborationRequest.getBeschreibung()).isEqualTo(BESCHREIBUNG); + assertThat(grpcCollaborationRequest.getZustaendigeStelle()).isEqualTo(ZUSTAENDIGE_STELLE); + assertThat(grpcCollaborationRequest.getCollaborationLevel()).isEqualTo(COLLABORATION_lEVEL); + assertThat(grpcCollaborationRequest.getCreatedBy()).isEqualTo(CommandTestFactory.CREATED_BY); + }); + } + + @DisplayName("Should throw access denied exception on non matching organisationsEinheitId") + @Test + void shouldThrowAccessDeniedException() { + var vorgangId = mongoOperations.save(buildVorgang()).getId(); + savedCollaborationRequest = mongoOperations.save(vorgangAttachedItem.toBuilder().vorgangId(vorgangId).build()); + var request = GrpcGetRequestRequest.newBuilder().setId(savedCollaborationRequest.getId()).build(); + var serviceStub = getServiceStub(); + + var exception = Assertions.assertThrows(StatusRuntimeException.class, () -> serviceStub.getRequest(request)); + assertThat(exception.getStatus().getCode()).isEqualTo(Status.Code.PERMISSION_DENIED); + } + + private Vorgang buildVorgang() { + return VorgangTestFactory.createBuilder().id(null).version(0).clearEingangs() + .eingang(EingangTestFactory.createBuilder() + .zustaendigeStelle(ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId("other").build()) + .build()) + .build(); + } + } + + @DisplayName("Find requests") + @Nested + class TestFindRequests { + + @Test + void shouldReturnExistingCollaborationRequests() { + var response = getServiceStub().findRequests(GrpcFindRequestsRequest.newBuilder().setVorgangId(VorgangTestFactory.ID).build()); + + assertThat(response.getRequestsList()).hasSize(1); + assertThat(response.getRequestsList().getFirst().getId()).isEqualTo(savedCollaborationRequest.getId()); + } + + @Test + void shouldReturnEmptyListOnNotMatchingVorgangId() { + var response = getServiceStub().findRequests(GrpcFindRequestsRequest.newBuilder().setVorgangId(vorgangId).build()); + + assertThat(response.getRequestsList()).isEmpty(); + } + } + + private CollaborationRequestServiceBlockingStub getServiceStub() { + return collaborationRequestStub.withInterceptors(new TestCallContextAttachingInterceptor()); + } + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java index 45e76253f7a9e06bd7c221d1a7e4c0a56e46ae32..813820f57598e988451867b6f263cf84da1c5d45 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CreateCollaborationVorgangRequestMapperTest.java @@ -34,7 +34,7 @@ class CreateCollaborationVorgangRequestMapperTest { @Test void shouldMapFromGrpc() { - var result = mapper.mapFrom(GrpcCollaborationRequestTestFactory.create()); + var result = mapper.mapFrom(GrpcCreateCollaborationRequestDataTestFactory.create()); assertThat(result).usingRecursiveComparison().ignoringFields("vorgang").isEqualTo(CreateCollaborationVorgangRequestTestFactory.create()); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCollaborationRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCreateCollaborationRequestDataTestFactory.java similarity index 80% rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCollaborationRequestTestFactory.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCreateCollaborationRequestDataTestFactory.java index e46337e88b4364406238abb4ae3bfa0cece7ecae..139b28a5ce95adaf82e99e464cc31c36bb67424f 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCollaborationRequestTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/GrpcCreateCollaborationRequestDataTestFactory.java @@ -23,18 +23,18 @@ */ package de.ozgcloud.vorgang.collaboration; -import de.ozgcloud.vorgang.vorgang.GrpcCollaborationRequest; +import de.ozgcloud.vorgang.vorgang.GrpcCreateCollaborationRequestData; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.ZustaendigeStelleTestFactory; -public class GrpcCollaborationRequestTestFactory { +public class GrpcCreateCollaborationRequestDataTestFactory { - public static GrpcCollaborationRequest create() { + public static GrpcCreateCollaborationRequestData create() { return createBuilder().build(); } - public static GrpcCollaborationRequest.Builder createBuilder() { - return GrpcCollaborationRequest.newBuilder() + public static GrpcCreateCollaborationRequestData.Builder createBuilder() { + return GrpcCreateCollaborationRequestData.newBuilder() .setVorgangId(VorgangTestFactory.ID) .setZustaendigeStelle(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID) .setCollaborationLevel(CreateCollaborationVorgangRequestTestFactory.COLLABORATION_LEVEL); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java index 6f99e9b91bef7f1664e80194b2755173a0c1da37..106c571385c18760a91d1198d34993944a08704d 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandRepositoryITCase.java @@ -92,21 +92,20 @@ class CommandRepositoryITCase { @Nested class TestFinishCommand { - @BeforeEach - void init() { - mongoOperations.dropCollection(PersistedCommand.COLLECTION_NAME); - } - @DisplayName("should update status to finished") @ParameterizedTest(name = "with status {0}") @EnumSource(value = CommandStatus.class, names = { "PENDING", "REVOKE_PENDING" }) void shouldUpdateStatusToFinished(CommandStatus commandStatus) { - var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(commandStatus).build()); + var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(commandStatus) + .createdResource(CommandTestFactory.CREATED_RESOURCE).build()); repository.finishCommand(command.getId()); var result = repository.findById(command.getId()); - assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.FINISHED); + assertThat(result).isPresent().get().satisfies(cmd -> { + assertThat(cmd.getStatus()).isEqualTo(CommandStatus.FINISHED); + assertThat(cmd.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE); + }); } @DisplayName("should update status to finished") @@ -322,7 +321,7 @@ class CommandRepositoryITCase { } @Test - // TODO schreibe ein Testcase für Order, Status und Zeit + // TODO schreibe ein Testcase für Order, Status und Zeit void shouldFindCommand() { var command = repository.save(createCommandBuilder() .status(CommandStatus.FINISHED) @@ -483,7 +482,7 @@ class CommandRepositoryITCase { @Test void shouldReturnParentId() { var commandId = mongoOperations.save( - CommandTestFactory.createBuilder().id(null).bodyObject(Map.of(PersistedCommand.PROPERTY_PARENT_ID, PARENT_ID)).build()) + CommandTestFactory.createBuilder().id(null).bodyObject(Map.of(PersistedCommand.PROPERTY_PARENT_ID, PARENT_ID)).build()) .getId(); var parentId = repository.getParentId(commandId); @@ -615,30 +614,39 @@ class CommandRepositoryITCase { void shouldSetCanceled() { var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(CommandStatus.NEW).build()); - repository.setRevokeStatus(command.getId()); + setRevokeStatus(command.getId()); var result = repository.findById(command.getId()); - assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.CANCELED); + assertThat(result).isPresent().get().satisfies(cmd -> { + assertThat(cmd.getStatus()).isEqualTo(CommandStatus.CANCELED); + assertThat(cmd.getCreatedResource()).isBlank(); + }); } @Test void shouldSetRevokePendingWhenPending() { var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).build()); - repository.setRevokeStatus(command.getId()); + setRevokeStatus(command.getId()); var result = repository.findById(command.getId()); - assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING); + assertThat(result).isPresent().get().satisfies(cmd -> { + assertThat(cmd.getStatus()).isEqualTo(CommandStatus.REVOKE_PENDING); + assertThat(cmd.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE); + }); } @Test void shouldSetRevokePendingWhenFinished() { var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(CommandStatus.FINISHED).build()); - repository.setRevokeStatus(command.getId()); + setRevokeStatus(command.getId()); var result = repository.findById(command.getId()); - assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING); + assertThat(result).isPresent().get().satisfies(cmd -> { + assertThat(cmd.getStatus()).isEqualTo(CommandStatus.REVOKE_PENDING); + assertThat(cmd.getCreatedResource()).isBlank(); + }); } @DisplayName("should not update when") @@ -647,10 +655,17 @@ class CommandRepositoryITCase { void shouldNotUpdate(CommandStatus status) { var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(status).build()); - repository.setRevokeStatus(command.getId()); + setRevokeStatus(command.getId()); var result = repository.findById(command.getId()); - assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(status); + assertThat(result).isPresent().get().satisfies(cmd -> { + assertThat(cmd.getStatus()).isEqualTo(status); + assertThat(cmd.getCreatedResource()).isNull(); + }); + } + + private void setRevokeStatus(String commandId) { + repository.setRevokeStatus(commandId, CommandTestFactory.CREATED_RESOURCE); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java index 85714d30f81e92ba77ce0c7f575e89dcc04343fa..3f4d68d90efa91280762ec75d49a7692d352a175 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceTest.java @@ -214,10 +214,12 @@ class CommandServiceTest { @Nested class TestRevokePendingCommand { - private static final Command REVOKE_PENDING_COMMAND = CommandTestFactory.createBuilder().status(CommandStatus.REVOKE_PENDING).build(); + private static final Command REVOKE_PENDING_COMMAND = CommandTestFactory.createBuilder().status(CommandStatus.REVOKE_PENDING) + .createdResource(CommandTestFactory.CREATED_RESOURCE).build(); @BeforeEach void init() { + when(repository.setRevokeStatus(anyString(), anyString())).thenReturn(REVOKE_PENDING_COMMAND); doReturn(true).when(service).shouldRevoke(any()); doReturn(REVOKE_PENDING_COMMAND).when(service).getById(anyString()); } @@ -233,7 +235,7 @@ class CommandServiceTest { void shouldCallRepository() { setCommandFinished(); - verify(repository).setRevokeStatus(CommandTestFactory.ID); + verify(repository).setRevokeStatus(CommandTestFactory.ID, CommandTestFactory.CREATED_RESOURCE); } @Test diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java index 7df40567d8e858171053fe352454a7e67decde01..e890e4ea2097781bba11e16db414d51370c90562 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/GrpcCommandServiceITCase.java @@ -168,7 +168,7 @@ class GrpcCommandServiceITCase { mongoOperations.dropCollection(Command.COLLECTION_NAME); mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); - vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()); + vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build()); when(readIsPermitted.test(any())).thenReturn(true); parentCommand = createParentCommand(); @@ -259,9 +259,5 @@ class GrpcCommandServiceITCase { return mongoOperations.findById(grpcCommand.getId(), Command.class); } - private void assertCommandIsFinished(GrpcCommand grpcCommand) { - var command = mongoOperations.findById(grpcCommand.getId(), Command.class); - assertThat(command.getStatus()).isEqualTo(CommandStatus.FINISHED); - } } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java index 5988d1bde47af660ad42c7ee6d613ad9aff7c3f5..5387ed1efef766385e8a769883af4c31c8c30189 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java @@ -29,12 +29,14 @@ import static org.mockito.Mockito.*; import java.util.Map; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.security.access.AccessDeniedException; +import de.ozgcloud.apilib.common.datatypes.GenericId; import de.ozgcloud.common.errorhandling.FunctionalErrorCode; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.vorgang.vorgang.Vorgang; @@ -308,4 +310,55 @@ class ExceptionHandlerTest { return handler.handleSearchServiceUnavailableException(exception); } } + + @DisplayName("Handle not found exception (from api lib)") + @Nested + class TestHandleNotFoundExceptionFromApiLib { + + private final String exceptionId = "42"; + private final GenericId id = GenericId.from(VorgangTestFactory.ID); + private final String entityName = Vorgang.class.toString(); + + @BeforeEach + void mockExceptionId() { + doReturn(exceptionId).when(handler).createExceptionId(); + } + + @Test + void shouldHaveStatusCode() { + var status = handleException().getStatus(); + + assertThat(status.getCode()).isEqualTo(Code.NOT_FOUND); + } + + @Test + void shouldHaveMessage() { + var statusException = handleException(); + + assertThat(statusException.getMessage()).contains(id.toString()); + assertThat(statusException.getMessage()).contains(entityName); + assertThat(statusException.getMessage()).contains(exceptionId); + } + + @Test + void shouldHaveStatusDescription() { + var status = handleException().getStatus(); + + assertThat(status.getDescription()).contains(id.toString()); + assertThat(status.getDescription()).contains(entityName); + assertThat(status.getDescription()).contains(exceptionId); + } + + @Test + void shouldHaveExceptionId() { + var metaData = handleException().getTrailers(); + + assertThat(metaData.get(createExceptionIdKey())).isEqualTo(exceptionId); + } + + private StatusException handleException() { + return handler.handleNotFoundException( + new de.ozgcloud.apilib.common.errorhandling.NotFoundException(id, entityName)); + } + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java index dd53e295f92b52ceec3d8c84936d367a8cc8efd7..269f31f0df733254ec0f7a6de31b87c1b9fe3c3f 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerITCase.java @@ -10,6 +10,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.SpyBean; @@ -32,10 +33,10 @@ import de.ozgcloud.vorgang.files.FileService; @ITCase @SpringBootTest(properties = { - "ozgcloud.processors[0].address: http://test1", - "ozgcloud.processors[0].name: processor1", - "ozgcloud.processors[0].forms[0].formEngineName: formEngineTest1", - "ozgcloud.processors[0].forms[0].formId: ID1" + "ozgcloud.processors[0].address=http://test1", + "ozgcloud.processors[0].name=processor1", + "ozgcloud.processors[0].forms[0].formEngineName=formEngineTest1", + "ozgcloud.processors[0].forms[0].formId=ID1" }) class VorgangEventListenerITCase { @@ -61,6 +62,7 @@ class VorgangEventListenerITCase { @MockBean private ProcessorService vorgagnProcessorService; @MockBean + @Qualifier("processorManager_OzgCloudCommandService") private OzgCloudVorgangService ozgCloudVorgangService; @MockBean private ProcessorVorgangMapper processorVorgangMapper; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java index e555f66338c6679e81c68b4aa0a2dbcdb483f2b4..124e90200536ff3aabcd41325efa75b5ac4afdd8 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java @@ -47,7 +47,7 @@ import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangBadRequestExc import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangRequest; import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangRequestMapper; import de.ozgcloud.vorgang.collaboration.CreateCollaborationVorgangRequestTestFactory; -import de.ozgcloud.vorgang.collaboration.GrpcCollaborationRequestTestFactory; +import de.ozgcloud.vorgang.collaboration.GrpcCreateCollaborationRequestDataTestFactory; import de.ozgcloud.vorgang.collaboration.GrpcCreateCollaborationVorgangResponseTestFactory; import io.grpc.stub.StreamObserver; @@ -349,11 +349,11 @@ class VorgangGrpcServiceTest { @Nested class TestCollaborationRequest { - private static final GrpcCollaborationRequest GRPC_COLLABORATION_REQUEST = GrpcCollaborationRequestTestFactory.create(); + private static final GrpcCreateCollaborationRequestData GRPC_COLLABORATION_REQUEST = GrpcCreateCollaborationRequestDataTestFactory.create(); private static final GrpcCreateCollaborationVorgangRequest REQUEST = GrpcCreateCollaborationVorgangRequest.newBuilder() - .setCollaborationRequest(GRPC_COLLABORATION_REQUEST).build(); - private static final GrpcCreateCollaborationVorgangResponse GRPC_COLLABORATION_RESPONSE = - GrpcCreateCollaborationVorgangResponseTestFactory.create(); + .setRequestData(GRPC_COLLABORATION_REQUEST).build(); + private static final GrpcCreateCollaborationVorgangResponse GRPC_COLLABORATION_RESPONSE = GrpcCreateCollaborationVorgangResponseTestFactory + .create(); @Mock private StreamObserver<GrpcCreateCollaborationVorgangResponse> responseObserver; @@ -413,8 +413,9 @@ class VorgangGrpcServiceTest { @Nested class TestCreateCollaborationVorgang { - private static final GrpcCollaborationRequest GRPC_COLLABORATION_REQUEST = GrpcCollaborationRequestTestFactory.create(); - private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory.create(); + private static final GrpcCreateCollaborationRequestData GRPC_COLLABORATION_REQUEST = GrpcCreateCollaborationRequestDataTestFactory.create(); + private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory + .create(); private static final Vorgang COLLABORATION_VORGANG = VorgangTestFactory.create(); @BeforeEach @@ -462,8 +463,9 @@ class VorgangGrpcServiceTest { @Nested class TestBuildCreateCollaborationVorgangRequest { - private static final GrpcCollaborationRequest GRPC_COLLABORATION_REQUEST = GrpcCollaborationRequestTestFactory.create(); - private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory.create(); + private static final GrpcCreateCollaborationRequestData GRPC_COLLABORATION_REQUEST = GrpcCreateCollaborationRequestDataTestFactory.create(); + private static final CreateCollaborationVorgangRequest CREATE_COLLABORATION_VORGANG_REQUEST = CreateCollaborationVorgangRequestTestFactory + .create(); private static final Vorgang VORGANG = VorgangTestFactory.create(); @BeforeEach diff --git a/vorgang-manager-server/src/test/resources/application-itcase.yml b/vorgang-manager-server/src/test/resources/application-itcase.yml index a9ac195ac3ed2a031ad421adb61d574b2504519c..2ab5f3470287edaf719a5db27b0cba4480042d0b 100644 --- a/vorgang-manager-server/src/test/resources/application-itcase.yml +++ b/vorgang-manager-server/src/test/resources/application-itcase.yml @@ -17,6 +17,9 @@ ozgcloud: application: address: localhost aktenzeichen: de.ozgcloud.vorgang.vorgang.AktenzeichenProviderEA + notification: + scheduling: + enabled: false mongock: enabled: false diff --git a/vorgang-manager-utils/pom.xml b/vorgang-manager-utils/pom.xml index 0dce87a6de03cd3cee36e7802e9ebf2b313e9412..e152aac5fa8b76246a3b88334125a5390cd25d67 100644 --- a/vorgang-manager-utils/pom.xml +++ b/vorgang-manager-utils/pom.xml @@ -30,14 +30,14 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-dependencies</artifactId> - <version>4.4.0-SNAPSHOT</version> + <version>4.5.0-SNAPSHOT</version> <relativePath/> </parent> <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-utils</artifactId> <name>OZG-Cloud Vorgang Manager Utils</name> - <version>2.15.0-PR-458-SNAPSHOT</version> + <version>2.17.0-SNAPSHOT</version> <properties> <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>