diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 27acb0c4ffd60cdf9acd3a905de168d91ac7417e..0f7d64c45be81fd4a74e0ccc903d3fd5a4a895d8 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -17,7 +17,7 @@ <properties> <vorgang-manager.version>2.9.0</vorgang-manager.version> <nachrichten-manager.version>2.9.0</nachrichten-manager.version> - <api-lib.version>0.10.0</api-lib.version> + <api-lib.version>0.11.0-SNAPSHOT</api-lib.version> </properties> <dependencies> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java index 49fbce9beef117e017788ae682323792bdb7478e..8fd50e588aabbf6f67f6af76b760657750e40f3f 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java @@ -23,6 +23,8 @@ */ package de.ozgcloud.bescheid; +import static java.util.Objects.*; + import java.time.LocalDate; import java.util.Arrays; import java.util.Optional; @@ -46,6 +48,7 @@ import de.ozgcloud.bescheid.nachricht.NachrichtService; 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.errorhandling.TechnicalException; import de.ozgcloud.document.BescheidDocumentCreatedEvent; @@ -78,8 +81,9 @@ class BescheidEventListener { 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 -> SEND_BESCHEID_ORDER.equals(command.getOrder()); + 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"; @@ -165,9 +169,9 @@ class BescheidEventListener { 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.getRelationVersion()); + service.sendBescheidManually(bescheidItem, command); } else if (SendBy.NACHRICHT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) { - service.sendBescheidPostfachMail(bescheidItem, command.getRelationVersion()); + 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), @@ -190,6 +194,15 @@ class BescheidEventListener { 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 { diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java index ffc2ece833e690b658dd1689c38e5e28789d1689..aa027989797574f34930c1249e922d370029d2da 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java @@ -1,17 +1,27 @@ package de.ozgcloud.bescheid; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; +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.attacheditem.AttachedItem; import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.attributes.ClientAttributeService; @@ -20,6 +30,7 @@ import de.ozgcloud.bescheid.nachricht.NachrichtService; 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.binaryfile.FileId; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.document.Document; @@ -32,11 +43,16 @@ import lombok.extern.log4j.Log4j2; class BescheidService { 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"; private final VorgangService vorgangService; private final AttachedItemService attachedItemService; - private final NachrichtService nachrichtService; - private final UserProfileService currentUserService; + private final UserProfileService userProfileService; + @Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME) + private final OzgCloudCommandService commandService; + private final CommandMapper commandMapper; private final ClientAttributeService bescheidClientAttributeService; private final BuildProperties buildProperties; private final Optional<BescheidRemoteService> remoteService; @@ -72,9 +88,10 @@ class BescheidService { } } - public void sendBescheidManually(AttachedItem bescheidItem, long version) { - validateBescheidSendManually(bescheidItem, version); - setBescheidSent(bescheidItem); + 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) { @@ -85,11 +102,13 @@ class BescheidService { } } - public void sendBescheidPostfachMail(AttachedItem bescheidItem, long version) { - validateBescheidSendPostfach(bescheidItem, version); + public void sendBescheidPostfachMail(AttachedItem bescheidItem, Command parentCommand) { + validateBescheidSendPostfach(bescheidItem, parentCommand.getRelationVersion()); var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - setBescheidSent(bescheidItem); - nachrichtService.sendNachricht(buildBescheid(bescheidItem, vorgang.getServiceKonto())); + 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) { @@ -98,10 +117,10 @@ class BescheidService { if (Bescheid.SendBy.NACHRICHT.notValue(sendBy)) { throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT)); } - if (StringUtils.isBlank(getNachrichtSubject(bescheidItem))) { + if (getNachrichtSubject(bescheidItem).isEmpty()) { throw new TechnicalException("Bescheid has no nachricht subject"); } - if (StringUtils.isBlank(getNachrichtText(bescheidItem))) { + if (getNachrichtText(bescheidItem).isEmpty()) { throw new TechnicalException("Bescheid has no nachricht text"); } } @@ -119,30 +138,93 @@ class BescheidService { } } - Bescheid buildBescheid(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto) { - return Bescheid.builder() - .vorgangId(VorgangId.from(bescheidItem.getVorgangId())) - .genehmigt(getBewilligt(bescheidItem)) - .bescheidFileId(getBescheidFileId(bescheidItem)) - .nachrichtSubject(Optional.ofNullable(getNachrichtSubject(bescheidItem))) - .nachrichtText(Optional.ofNullable(getNachrichtText(bescheidItem))) - .createdBy(currentUserService.getUserProfile().getId()) - .serviceKonto(serviceKonto) - .attachments(getAttachments(bescheidItem)) + 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(); } - 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)); + 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( + Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), + Bescheid.FIELD_SENT_BY, userId); } - String getNachrichtSubject(AttachedItem bescheidItem) { - return MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT); + 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(); } - String getNachrichtText(AttachedItem bescheidItem) { - return MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT); + 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( + NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION, + NachrichtService.FIELD_SUBJECT, getNachrichtSubject(bescheidItem).orElse(NachrichtService.SUBJECT), + NachrichtService.FIELD_MAIL_BODY, getNachrichtText(bescheidItem).orElse(StringUtils.EMPTY), + NachrichtService.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) { @@ -160,18 +242,20 @@ class BescheidService { return Collections.emptyList(); } - void setBescheidSent(AttachedItem bescheidItem) { - attachedItemService.setBescheidSentStatus(bescheidItem.getId(), bescheidItem.getVersion()); - try { - vorgangService.bescheiden(bescheidItem.getVorgangId()); - } catch (Exception e) { - attachedItemService.revertBescheidSendStatus(bescheidItem.getId(), bescheidItem.getVersion()); - throw e; - } - setAntragBewilligung(bescheidItem); + 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(); } - void setAntragBewilligung(AttachedItem bescheidItem) { + public void setAntragBewilligung(AttachedItem bescheidItem) { try { bescheidClientAttributeService.setAntragResult(bescheidItem.getVorgangId(), getBewilligt(bescheidItem)); } catch (Exception e) { diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java index 180d95031923d482c4f25f3f42f42ba0620b111d..24a67a215b953478b6bf2518432c37469eb94e42 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java @@ -25,8 +25,6 @@ package de.ozgcloud.bescheid.attacheditem; import static java.util.Objects.*; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -37,7 +35,6 @@ import java.util.stream.Collectors; 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; @@ -47,39 +44,33 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; import de.ozgcloud.bescheid.BescheidManagerConfiguration; -import de.ozgcloud.bescheid.common.callcontext.CallContextUser; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; 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; import lombok.extern.log4j.Log4j2; @Log4j2 @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"; - static final String PATCH_ATTACHED_ITEM = "PATCH_ATTACHED_ITEM"; static final String DEFAULT_SUBJECT = "Ihr Bescheid zum Antrag"; static final String DEFAULT_TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; @Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME) - @Autowired - private OzgCloudCommandService commandService; - @Autowired - private VorgangAttachedItemRemoteService remoteService; - @Autowired - private CommandMapper commandMapper; - @Autowired - private CurrentUserService currentUserService; - @Autowired - private TemplateHandler templateHandler; + private final OzgCloudCommandService commandService; + private final VorgangAttachedItemRemoteService remoteService; + private final CommandMapper commandMapper; + private final TemplateHandler templateHandler; public Optional<AttachedItem> findBescheidItem(String vorgangId) { return remoteService.findBescheidDraft(vorgangId); @@ -267,65 +258,12 @@ public class AttachedItemService { .build(); } - public void setBescheidSentStatus(String id, long version) { - createPatchCommand(id, version, buildBescheidSentStatusBodyObject(id)); - } - - Map<String, Object> buildBescheidSentStatusBodyObject(String bescheidId) { - return Map.of(AttachedItem.PROPERTY_ID, bescheidId, - AttachedItem.PROPERTY_ITEM, buildBescheidSentStatusItem()); - } - - Map<String, Object> buildBescheidSentStatusItem() { - var itemMap = buildItemMap(Bescheid.Status.SENT); - itemMap.put(Bescheid.FIELD_SENT_INFO, buildSentInfoMap()); - return itemMap; - } - - Map<String, Object> buildSentInfoMap() { - return Map.of( - Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), - Bescheid.FIELD_SENT_BY, getUserId()); - } - - String getUserId() { - return currentUserService.findUser().flatMap(CallContextUser::getUserId).orElse(StringUtils.EMPTY); - } - - public void revertBescheidSendStatus(String id, long version) { - createPatchCommand(id, version, buildRevertBescheidSentStatusBodyObject(id)); - } - - private void createPatchCommand(String id, long version, Map<String, Object> itemMap) { - commandService.createAndWaitUntilDone(buildPatchBescheidCommand(id, version, itemMap)); - } - - Map<String, Object> buildRevertBescheidSentStatusBodyObject(String bescheidId) { - return Map.of(AttachedItem.PROPERTY_ID, bescheidId, - AttachedItem.PROPERTY_ITEM, buildRevertBescheidSentStatusItem()); - } - - Map<String, Object> buildRevertBescheidSentStatusItem() { - var itemMap = buildItemMap(Bescheid.Status.DRAFT); - itemMap.put(Bescheid.FIELD_SENT_INFO, null); - return itemMap; - } - Map<String, Object> buildItemMap(Bescheid.Status status) { var itemMap = new HashMap<String, Object>(); itemMap.put(Bescheid.FIELD_STATUS, status.name()); return itemMap; } - OzgCloudCommand buildPatchBescheidCommand(String bescheidId, long bescheidVersion, Map<String, Object> bodyObject) { - return OzgCloudCommand.builder() - .relationId(commandMapper.mapRelationId(bescheidId)) - .relationVersion(bescheidVersion) - .order(PATCH_ATTACHED_ITEM) - .bodyObject(bodyObject) - .build(); - } - public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) { return remoteService.findAllBescheid(vorgangId); } 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 index 8b20aa41c65568e456538a45f3c363d1a18cbded..60949bbe87cf4d3b6c2a366dcc529d4be45c99bf 100644 --- 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 @@ -33,7 +33,8 @@ public class UserProfileTestFactory { private static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance(); - public static final UserId ID = UserId.from(UUID.randomUUID().toString()); + 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(); diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java index ce261151ddaa6d682521e59cfbb806c21c033656..4c3655447451ffdd42a19676c0f9216259b16d3c 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java @@ -1,38 +1,30 @@ package de.ozgcloud.bescheid.nachricht; -import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.stream.Stream; -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.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.extern.log4j.Log4j2; @Service @Log4j2 public class NachrichtService { - public static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; public static final String FIELD_POSTFACH_ID = "postfachId"; - static final String FIELD_REPLY_OPTION = "replyOption"; - static final String REPLY_OPTION = "POSSIBLE"; - static final String FIELD_SUBJECT = "subject"; - static final String FIELD_MAIL_BODY = "mailBody"; - static final String FIELD_ATTACHMENTS = "attachments"; + public static final String FIELD_REPLY_OPTION = "replyOption"; + public static final String REPLY_OPTION = "FORBIDDEN"; + public static final String FIELD_SUBJECT = "subject"; + public static final String FIELD_MAIL_BODY = "mailBody"; + public static final String FIELD_ATTACHMENTS = "attachments"; + public static final String SUBJECT = "Ihr Bescheid zum Antrag"; @Autowired private NachrichtRemoteService remoteService; @@ -44,7 +36,6 @@ public class NachrichtService { @Autowired private TemplateHandler templateHandler; - static final String SUBJECT = "Ihr Bescheid zum Antrag"; private static final String TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; @@ -68,43 +59,6 @@ public class NachrichtService { .orElseGet(() -> templateHandler.fillTemplate(TEMPLATE_FILE, bescheid)); } - public void sendNachricht(Bescheid bescheid) { - commandService.createAndWaitUntilDone(buildSendBescheidCommand(bescheid)); - } - - OzgCloudCommand buildSendBescheidCommand(Bescheid bescheid) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheid.getVorgangId().toString())) - .relationId(commandMapper.mapRelationId(bescheid.getVorgangId().toString())) - .order(SEND_POSTFACH_NACHRICHT_ORDER) - .createdBy(commandMapper.toOzgCloudUserId(bescheid.getCreatedBy().toString())) - .bodyObject(buildSendNachrichtCommandBody(bescheid)) - .build(); - } - - Map<String, Object> buildSendNachrichtCommandBody(Bescheid bescheid) { - return Map.of( - FIELD_REPLY_OPTION, REPLY_OPTION, - FIELD_SUBJECT, bescheid.getNachrichtSubject().orElse(SUBJECT), - FIELD_MAIL_BODY, bescheid.getNachrichtText().orElse(StringUtils.EMPTY), - FIELD_ATTACHMENTS, buildAttachments(bescheid), - Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, buildPostfachAddress(bescheid)); - - } - - List<String> buildAttachments(Bescheid bescheid) { - return Stream.concat(Stream.of(bescheid.getBescheidFileId()), bescheid.getAttachments().stream()).map(FileId::toString).toList(); - } - - Map<String, Object> buildPostfachAddress(Bescheid bescheid) { - var postfachAddress = getAddress(bescheid).orElseThrow( - () -> new TechnicalException("No ServiceKonto on Vorgang (id: %s)".formatted(bescheid.getVorgangId()))); - return Map.of(PostfachAddress.FIELD_TYPE, postfachAddress.getType(), - PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(), - PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(), - Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, bescheid.getServiceKonto().getType()); - } - Optional<PostfachAddress> getAddress(Bescheid bescheid) { var serviceKonto = bescheid.getServiceKonto(); if (Objects.nonNull(serviceKonto)) { 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 index 09b366285262b009acc54f131611760025ef1c5d..98689c96ea25c66ffcfbe9cab54556b148b7fc65 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java @@ -1,46 +1,18 @@ package de.ozgcloud.bescheid.vorgang; -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 lombok.NonNull; +import lombok.RequiredArgsConstructor; @Service("bescheid_VorgangService") +@RequiredArgsConstructor public class VorgangService { - static final String VORGANG_BESCHEIDEN = "VORGANG_BESCHEIDEN"; - - @Autowired - private VorgangRemoteService remoteService; - @Autowired - @Qualifier("bescheid_OzgCloudCommandService") - private OzgCloudCommandService commandService; - @Autowired - private CommandMapper commandMapper; + private final VorgangRemoteService remoteService; public Vorgang getById(@NonNull VorgangId id) { return remoteService.getById(id); } - public void bescheiden(String vorgangId) { - bescheiden(getById(VorgangId.from(vorgangId))); - } - - private void bescheiden(Vorgang vorgang) { - commandService.createAndWaitUntilDone(buildBescheidenCommand(vorgang)); - } - - OzgCloudCommand buildBescheidenCommand(Vorgang vorgang) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(vorgang.getId().toString())) - .relationId(commandMapper.mapRelationId(vorgang.getId().toString())) - .relationVersion(vorgang.getVersion()) - .order(VORGANG_BESCHEIDEN) - .build(); - } - } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java index 96c5ef5dafcba70a2f79b18ae9d7aa8b24bf8670..6347a9570ea12e841e2c6231ed798394daf809d2 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java @@ -9,6 +9,7 @@ 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; @@ -19,14 +20,19 @@ 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.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; @Autowired private BescheidFeatureProperties bescheidFeatureProperties; @@ -70,7 +76,7 @@ class BescheidEventListenerITCase { @Test void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(CommandTestFactory.createBuilder().order("OTHER").build())); + publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); verifyNoInteractions(service); } @@ -90,7 +96,7 @@ class BescheidEventListenerITCase { @Test void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(CommandTestFactory.createBuilder().order("OTHER").build())); + publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); verifyNoInteractions(attachedItemService); } @@ -110,9 +116,29 @@ class BescheidEventListenerITCase { @Test void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(CommandTestFactory.createBuilder().order("OTHER").build())); + 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 index 823d76cd45304b38173621fa521a6e3cbec6820e..1940fb2bf4294d0d48bfab82be1b5550d7986c00 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java @@ -35,6 +35,7 @@ import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.nachricht.NachrichtService; 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.errorhandling.TechnicalException; @@ -551,8 +552,8 @@ class BescheidEventListenerTest { void shouldCallSendBescheid() { listener.doSendBescheid(COMMAND); - verify(service).sendBescheidManually(bescheidItem, AttachedItemTestFactory.VERSION); - verify(service, never()).sendBescheidPostfachMail(any(), anyLong()); + verify(service).sendBescheidManually(bescheidItem, COMMAND); + verify(service, never()).sendBescheidPostfachMail(any(), any()); } @Test @@ -585,8 +586,8 @@ class BescheidEventListenerTest { void shouldCallBescheidService() { listener.doSendBescheid(COMMAND); - verify(service).sendBescheidPostfachMail(bescheidItem, AttachedItemTestFactory.VERSION); - verify(service, never()).sendBescheidManually(any(), anyLong()); + verify(service).sendBescheidPostfachMail(bescheidItem, COMMAND); + verify(service, never()).sendBescheidManually(any(), any()); } @Test @@ -599,6 +600,49 @@ class BescheidEventListenerTest { } } + @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 { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java index 6697f5fe8687a7524464e3a2fb01b1f86ff4cd62..6db0af2e5937ab0084001a0727e0be54689ddac6 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java @@ -5,11 +5,16 @@ 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.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; @@ -26,20 +31,31 @@ 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.attacheditem.AttachedItem; import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; import de.ozgcloud.bescheid.attributes.ClientAttributeService; 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.nachricht.NachrichtService; +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.binaryfile.FileId; +import de.ozgcloud.common.datatype.StringBasedValue; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.document.DocumentTestFactory; @@ -52,19 +68,19 @@ class BescheidServiceTest { @Mock private VorgangService vorgangService; @Mock - private BescheidRemoteService remoteService; - @Mock private AttachedItemService attachedItemService; @Mock - private NachrichtService nachrichtService; - @Mock private UserProfileService userProfileService; @Mock - private UserProfile callContextUser; + private OzgCloudCommandService commandService; + @Mock + private CommandMapper commandMapper; @Mock private ClientAttributeService clientAttributeService; @Mock private BuildProperties buildProperties; + @Mock + private BescheidRemoteService remoteService; @BeforeEach void init() { @@ -110,11 +126,23 @@ class BescheidServiceTest { @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 @@ -125,14 +153,37 @@ class BescheidServiceTest { } @Test - void shouldCallSendBescheid() { + void shouldCallGetVorgang() { sendBescheid(); - verify(service).setBescheidSent(bescheidItem); + 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() { - service.sendBescheidManually(bescheidItem, AttachedItemTestFactory.VERSION); + var parentCommand = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build(); + service.sendBescheidManually(bescheidItem, parentCommand); } } @@ -171,38 +222,42 @@ class BescheidServiceTest { @Nested class TestSendBescheidPostfachMail { - private AttachedItem bescheidItem; + 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 AttachedItem bescheidSendItem; + private OzgCloudCommand setBescheidSentSubCommand; + @Mock + private OzgCloudCommand sendPostfachNachrichtSubCommand; @Captor private ArgumentCaptor<VorgangId> vorgangIdCaptor; + @Captor + private ArgumentCaptor<List<OzgCloudCommand>> subCommandsCaptor; @BeforeEach void init() { - var item = AttachedItemTestFactory.createBescheidItem(); - item.put(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()); - bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build(); - doNothing().when(service).validateBescheidSendPostfach(any(), anyLong()); - lenient().when(callContextUser.getId()).thenReturn(UserId.from("user-id")); - lenient().when(userProfileService.getUserProfile()).thenReturn(callContextUser); + 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() { - doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any()); - when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); - sendBescheid(); - verify(service).validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION); + verify(service).validateBescheidSendPostfach(BESCHEID_ITEM, AttachedItemTestFactory.VERSION); } @Test void shouldCallVorgangService() { - doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any()); - when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); - sendBescheid(); verify(vorgangService).getById(vorgangIdCaptor.capture()); @@ -210,40 +265,36 @@ class BescheidServiceTest { } @Test - void shouldCallBuildBescheid() { - doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any()); - var serviceKonto = ServiceKontoTestFactory.create(); - var vorgang = VorgangTestFactory.createBuilder().serviceKonto(serviceKonto).build(); - doReturn(vorgang).when(vorgangService).getById(any()); - + void shouldCallGetUserId() { sendBescheid(); - verify(service).buildBescheid(bescheidItem, serviceKonto); + verify(service).getUserId(); } @Test - void shouldCallNachrichtService() { - var bescheid = BescheidTestFactory.create(); - doReturn(bescheid).when(service).buildBescheid(any(), any()); - when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); - + void shouldCallBuildSetBescheidSentSubCommands() { sendBescheid(); - verify(nachrichtService).sendNachricht(bescheid); + verify(service).buildSetBescheidSentSubCommands(BESCHEID_ITEM, VORGANG, UserProfileTestFactory.ID_STR); } @Test - void shouldCallSendBescheid() { - doReturn(BescheidTestFactory.create()).when(service).buildBescheid(any(), any()); - when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); + void shouldCallBuildSendPostfachNachrichtCommand() { + sendBescheid(); + + verify(service).buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR); + } + @Test + void shouldCallAddSubCommands() { sendBescheid(); - verify(service).setBescheidSent(bescheidItem); + verify(service).addSubCommands(eq(CommandTestFactory.ID), subCommandsCaptor.capture()); + assertThat(subCommandsCaptor.getValue()).containsExactly(setBescheidSentSubCommand, sendPostfachNachrichtSubCommand); } private void sendBescheid() { - service.sendBescheidPostfachMail(bescheidItem, AttachedItemTestFactory.VERSION); + service.sendBescheidPostfachMail(BESCHEID_ITEM, PARENT_COMMAND); } } @@ -352,114 +403,6 @@ class BescheidServiceTest { } } - @Nested - class TestBuildBescheid { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create(); - private static final String CREATED_BY = "user-id"; - - @BeforeEach - void init() { - when(callContextUser.getId()).thenReturn(UserId.from(CREATED_BY)); - when(userProfileService.getUserProfile()).thenReturn(callContextUser); - doReturn(FileId.from(DocumentTestFactory.DOCUMENT_FILE)).when(service).getBescheidFileId(any()); - } - - @Test - void shouldSetVorgangId() { - var result = buildBescheid(); - - assertThat(result.getVorgangId()).hasToString(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldCallGetBewilligt() { - buildBescheid(); - - verify(service).getBewilligt(BESCHEID_ITEM); - } - - @Test - void shouldSetGenehmigt() { - doReturn(true).when(service).getBewilligt(any()); - - var result = buildBescheid(); - - assertThat(result.isGenehmigt()).isTrue(); - } - - @Test - void shouldCallGetAttachments() { - buildBescheid(); - - verify(service).getAttachments(BESCHEID_ITEM); - } - - @Test - void shouldSetAttachments() { - var expectedAttachments = List.of(FileId.from(AttachedItemTestFactory.ATTACHMENT)); - doReturn(expectedAttachments).when(service).getAttachments(any()); - - var result = buildBescheid(); - - assertThat(result.getAttachments()).containsExactlyElementsOf(expectedAttachments); - } - - @Test - void shouldCallGetBescheidFileId() { - buildBescheid(); - - verify(service).getBescheidFileId(BESCHEID_ITEM); - } - - @Test - void shouldSetBescheidFileId() { - var result = buildBescheid(); - - assertThat(result.getBescheidFileId()).hasToString(DocumentTestFactory.DOCUMENT_FILE); - } - - @Test - void shouldSetNachrichtSubject() { - var result = buildBescheid(); - - assertThat(result.getNachrichtSubject()).contains(AttachedItemTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldSetNachrichtText() { - var result = buildBescheid(); - - assertThat(result.getNachrichtText()).contains(AttachedItemTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldCallCurrentUserService() { - buildBescheid(); - - verify(userProfileService).getUserProfile(); - } - - @Test - void shouldSetCreatedBy() { - var result = buildBescheid(); - - assertThat(result.getCreatedBy()).hasToString(CREATED_BY); - } - - @Test - void shouldSetServiceKonto() { - var result = buildBescheid(); - - assertThat(result.getServiceKonto()).usingRecursiveComparison().isEqualTo(SERVICE_KONTO); - } - - private Bescheid buildBescheid() { - return service.buildBescheid(BESCHEID_ITEM, SERVICE_KONTO); - } - } - @Nested class TestGetAttachments { @@ -540,6 +483,33 @@ class BescheidServiceTest { } } + @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 { @@ -573,7 +543,7 @@ class BescheidServiceTest { var result = service.getNachrichtSubject(bescheidItem); - assertThat(result).isEqualTo(AttachedItemTestFactory.NACHRICHT_SUBJECT); + assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_SUBJECT); } } @@ -587,49 +557,537 @@ class BescheidServiceTest { var result = service.getNachrichtText(bescheidItem); - assertThat(result).isEqualTo(AttachedItemTestFactory.NACHRICHT_TEXT); + assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_TEXT); } } @Nested - class TestSendBescheid { + class TestGetUserId { - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); @Mock - private AttachedItem bescheidSendItem; + private UserProfile userProfile; + + @BeforeEach + void init() { + when(userProfileService.getUserProfile()).thenReturn(userProfile); + when(userProfile.getId()).thenReturn(UserProfileTestFactory.ID); + + } @Test - void shouldCallSetBescheidStatusSent() { - sendBescheid(); + void shouldCallGetUserProfile() { + service.getUserId(); - verify(attachedItemService).setBescheidSentStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION); + verify(userProfileService).getUserProfile(); } @Test - void shouldCallBescheiden() { - sendBescheid(); + 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; - verify(vorgangService).bescheiden(CommandTestFactory.VORGANG_ID); + @BeforeEach + void inti() { + doReturn(vorgangBescheidenCommand).when(service).buildVorgangBescheidenCommand(any()); + doReturn(setBescheidSentStatusCommand).when(service).buildSetBescheidSentStatusCommand(any(), any()); } @Test - void shouldCallRevertBescheidStatusSent() { - doThrow(new TechnicalException("error")).when(vorgangService).bescheiden(anyString()); + void shouldCallBuildVorgangBescheidenCommand() { + buildSetBescheidSentCommands(); - assertThrows(TechnicalException.class, this::sendBescheid); + verify(service).buildVorgangBescheidenCommand(vorgang); + } - verify(attachedItemService).revertBescheidSendStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION); + @Test + void shouldCallBuildSetBescheidSentStatusCommand() { + buildSetBescheidSentCommands(); + + verify(service).buildSetBescheidSentStatusCommand(bescheidItem, UserProfileTestFactory.ID_STR); } @Test - void shouldCallSetAntragResult() { - sendBescheid(); + void shouldReturnResult() { + var result = buildSetBescheidSentCommands(); - verify(service).setAntragBewilligung(bescheidItem); + assertThat(result).containsExactly(vorgangBescheidenCommand, setBescheidSentStatusCommand); } - private void sendBescheid() { - service.setBescheidSent(bescheidItem); + 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(Bescheid.FIELD_SENT_BY, UserProfileTestFactory.ID_STR); + } + + private ZonedDateTime getSentAt(Map<String, Object> sentInfoMap) { + return ZonedDateTime.parse((String) sentInfoMap.get(Bescheid.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(NachrichtService.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(AttachedItemTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any()); + doReturn(Optional.of(AttachedItemTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any()); + doReturn(List.of(AttachedItemTestFactory.ATTACHMENT)).when(service).buildAttachments(any()); + } + + @Test + void shouldSetReplyOption() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).containsEntry(NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION); + } + + @Test + void shouldCallGetNachrichtSubject() { + buildSendNachrichtCommandBody(); + + verify(service).getNachrichtSubject(bescheidItem); + } + + @Test + void shouldSetSubject() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).containsEntry(NachrichtService.FIELD_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT); + } + + @Test + void shouldCallGetNachrichtText() { + buildSendNachrichtCommandBody(); + + verify(service).getNachrichtText(bescheidItem); + } + + @Test + void shouldSetMailBody() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).containsEntry(NachrichtService.FIELD_MAIL_BODY, AttachedItemTestFactory.NACHRICHT_TEXT); + } + + @Test + void shouldCallBuildAttachments() { + buildSendNachrichtCommandBody(); + + verify(service).buildAttachments(bescheidItem); + } + + @Test + void shouldSetAttachments() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).extracting(NachrichtService.FIELD_ATTACHMENTS, LIST).containsExactly(AttachedItemTestFactory.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(NachrichtService.FIELD_SUBJECT, NachrichtService.SUBJECT); + } + + @Test + void shouldSetMailBody() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).containsEntry(NachrichtService.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); } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java index 726edcf3e90a969633d5f3caf885298c65334776..9f4272fed782bba1aef9ea7236c4430752002e88 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java @@ -28,15 +28,12 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -61,8 +58,6 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.Bescheid.SendBy; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.common.callcontext.CallContextUser; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; @@ -86,8 +81,6 @@ class AttachedItemServiceTest { @Mock private VorgangAttachedItemRemoteService remoteService; @Mock - private CurrentUserService currentUserService; - @Mock private TemplateHandler templateHandler; @Nested @@ -1039,257 +1032,6 @@ class AttachedItemServiceTest { } } - @Nested - class TestSetBescheidSentStatus { - - private static final Map<String, Object> BODY_OBJECT_MAP = Map.of("key", "value"); - - @Mock - private OzgCloudCommand command; - - @BeforeEach - void init() { - doReturn(BODY_OBJECT_MAP).when(service).buildBescheidSentStatusBodyObject(any()); - } - - @Test - void shouldCallBuildPatchBescheidCommand() { - setBescheidStatusSent(); - - verify(service).buildPatchBescheidCommand(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION, BODY_OBJECT_MAP); - } - - @Test - void shouldCallCommandService() { - doReturn(command).when(service).buildPatchBescheidCommand(any(), anyLong(), any()); - - setBescheidStatusSent(); - - verify(commandService).createAndWaitUntilDone(command); - } - - private void setBescheidStatusSent() { - service.setBescheidSentStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION); - } - } - - @Nested - class TestBuildBescheidSentStatusBodyObject { - - @Test - void shouldSetId() { - var result = service.buildBescheidSentStatusBodyObject(AttachedItemTestFactory.ID); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID); - } - - @Test - void shouldCallBuildBescheidSentStatusItem() { - service.buildBescheidSentStatusBodyObject(AttachedItemTestFactory.ID); - - verify(service).buildBescheidSentStatusItem(); - } - - @Test - void shouldSetBescheidBodyObject() { - var expectedItemMap = Map.of("key", "value"); - doReturn(expectedItemMap).when(service).buildBescheidSentStatusItem(); - - var result = service.buildBescheidSentStatusBodyObject(AttachedItemTestFactory.ID); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM, expectedItemMap); - } - - } - - @Nested - class TestBuildBescheidSentStatusItem { - - @Test - void shouldSetStatus() { - var result = service.buildBescheidSentStatusItem(); - - assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name()); - } - } - - @Nested - class TestBuildSentInfoMap { - - @Test - void shouldSetSentAt() { - var result = service.buildSentInfoMap(); - - assertThat(getSentAt(result)).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); - } - - @Test - void shouldCallGetUser() { - service.buildSentInfoMap(); - - verify(currentUserService).findUser(); - } - - @Test - void shouldSetSentBy() { - var userId = "user-id"; - doReturn(userId).when(service).getUserId(); - - var result = service.buildSentInfoMap(); - - assertThat(result).containsEntry(Bescheid.FIELD_SENT_BY, userId); - } - - private ZonedDateTime getSentAt(Map<String, Object> sentInfo) { - return ZonedDateTime.parse(MapUtils.getString(sentInfo, Bescheid.FIELD_SENT_AT)); - } - } - - @Nested - class TestGetUserId { - - @Mock - private CallContextUser callContextUser; - - @Test - void shouldCallFindUser() { - service.getUserId(); - - verify(currentUserService).findUser(); - } - - @Test - void shouldCallGetUserIdOnCallContexUser() { - when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser)); - - service.getUserId(); - - verify(callContextUser).getUserId(); - } - - @Test - void shouldReturnUserId() { - var expectedUserId = "user-id"; - when(callContextUser.getUserId()).thenReturn(Optional.of(expectedUserId)); - when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser)); - - var result = service.getUserId(); - - assertThat(result).isEqualTo(expectedUserId); - } - - @Test - void shouldReturnEmptyWhenNoUserFound() { - var result = service.getUserId(); - - assertThat(result).isEmpty(); - } - - @Test - void shouldReturnEmptyWhenNoUserIdFound() { - when(currentUserService.findUser()).thenReturn(Optional.of(callContextUser)); - - var result = service.getUserId(); - - assertThat(result).isEmpty(); - } - } - - @Nested - class TestRevertBescheidStatusSent { - - private static final Map<String, Object> BODY_OBJECT_MAP = Map.of("key", "value"); - - @Mock - private OzgCloudCommand command; - - @Test - void shouldCallBuildRevertBescheidSentStatusBodyObject() { - revertBescheidStatusSent(); - - verify(service).buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallBuildPatchBescheidCommand() { - doReturn(BODY_OBJECT_MAP).when(service).buildRevertBescheidSentStatusBodyObject(any()); - - revertBescheidStatusSent(); - - verify(service).buildPatchBescheidCommand(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION, BODY_OBJECT_MAP); - } - - @Test - void shouldCallCommandService() { - doReturn(command).when(service).buildPatchBescheidCommand(any(), anyLong(), any()); - - revertBescheidStatusSent(); - - verify(commandService).createAndWaitUntilDone(command); - } - - private void revertBescheidStatusSent() { - service.revertBescheidSendStatus(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION); - } - - } - - @Nested - class TestBuildRevertBescheidSentStatusBodyObject { - - @Test - void shouldSetId() { - var result = service.buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID); - } - - @Test - void shouldCallBuildRevertBescheidSentStatusItem() { - service.buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID); - - verify(service).buildRevertBescheidSentStatusItem(); - } - - @Test - void shouldSetBescheidBodyObject() { - var expectedItemMap = Map.of("key", "value"); - doReturn(expectedItemMap).when(service).buildRevertBescheidSentStatusItem(); - - var result = service.buildRevertBescheidSentStatusBodyObject(AttachedItemTestFactory.ID); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM, expectedItemMap); - } - } - - @Nested - class TestBuildRevertBescheidSentStatusItem { - - @Test - void shouldCallBuildItemMap() { - service.buildRevertBescheidSentStatusItem(); - - verify(service).buildItemMap(Bescheid.Status.DRAFT); - } - - @Test - void shouldReturnResultsOfBuildItemMap() { - var expectedItemMap = new HashMap<String, Object>(Map.of("key", "value")); - doReturn(expectedItemMap).when(service).buildItemMap(any()); - - var result = service.buildRevertBescheidSentStatusItem(); - - assertThat(result).containsEntry("key", "value"); - } - - @Test - void shouldSetSentInfoNull() { - var result = service.buildRevertBescheidSentStatusItem(); - - assertThat(result).containsEntry(Bescheid.FIELD_SENT_INFO, null); - } - } - @Nested class TestBuildItemMap { @@ -1301,54 +1043,6 @@ class AttachedItemServiceTest { } } - @Nested - class TestBuildPatchBescheidCommand { - - private static final Map<String, Object> BODY_OBJECT_MAP = Map.of("key", "value"); - - @Test - void shouldCallRelationIdMapper() { - buildPatchBescheidCommand(); - - verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetRelationId() { - var expectedId = GenericId.from(AttachedItemTestFactory.ID); - when(commandMapper.mapRelationId(any())).thenReturn(expectedId); - - var result = buildPatchBescheidCommand(); - - assertThat(result.getRelationId()).isEqualTo(expectedId); - } - - @Test - void shouldSetRelationVersion() { - var result = buildPatchBescheidCommand(); - - assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var result = buildPatchBescheidCommand(); - - assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM); - } - - @Test - void shouldSetBodyObject() { - var result = buildPatchBescheidCommand(); - - assertThat(result.getBodyObject()).isSameAs(BODY_OBJECT_MAP); - } - - private OzgCloudCommand buildPatchBescheidCommand() { - return service.buildPatchBescheidCommand(AttachedItemTestFactory.ID, AttachedItemTestFactory.VERSION, BODY_OBJECT_MAP); - } - } - @Nested class TestFindAllBescheid { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java index f18ffbc9d6851d39b9dfe8676d98f7676013dbe5..5974a286fb170a9c04db124f1b80220f84d66496 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java @@ -1,12 +1,9 @@ package de.ozgcloud.bescheid.nachricht; 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.List; -import java.util.Map; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; @@ -16,21 +13,9 @@ 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.user.OzgCloudUserId; -import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; -import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.vorgang.PostfachAddressTestFactory; -import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; -import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.common.errorhandling.TechnicalException; class NachrichtServiceTest { @@ -41,10 +26,6 @@ class NachrichtServiceTest { @Mock private NachrichtRemoteService remoteService; @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; - @Mock private TemplateHandler templateHandler; @Nested @@ -126,225 +107,4 @@ class NachrichtServiceTest { assertThat(message).isEqualTo("FROM_TEMPLATE"); } } - - @Nested - class TestSendNachricht { - - @Mock - private OzgCloudCommand ozgCloudCommand; - - @BeforeEach - void init() { - doReturn(ozgCloudCommand).when(service).buildSendBescheidCommand(any()); - } - - @Test - void shouldCallBuildBescheidCommand() { - var bescheid = BescheidTestFactory.create(); - - service.sendNachricht(bescheid); - - verify(service).buildSendBescheidCommand(bescheid); - } - - @Test - void shouldCallCommandService() { - service.sendNachricht(BescheidTestFactory.create()); - - verify(commandService).createAndWaitUntilDone(ozgCloudCommand); - } - - } - - @Nested - class TestBuildSendBescheidCommand { - - private static final Map<String, Object> bodyObject = Map.of("key", "value"); - private final Bescheid bescheid = BescheidTestFactory.create(); - - @BeforeEach - void init() { - doReturn(bodyObject).when(service).buildSendNachrichtCommandBody(any()); - } - - @Test - void shouldCallVorgangIdMapper() { - buildCommand(); - - verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetVorgangId() { - var vorgangId = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString()); - when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(vorgangId); - - var result = buildCommand(); - - assertThat(result.getVorgangId()).isEqualTo(vorgangId); - } - - @Test - void shouldCallMapRelationId() { - buildCommand(); - - verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetRelationId() { - var relationId = GenericId.from("relation-id"); - when(commandMapper.mapRelationId(anyString())).thenReturn(relationId); - - var result = buildCommand(); - - assertThat(result.getRelationId()).isEqualTo(relationId); - } - - @Test - void shouldSetOrder() { - var result = buildCommand(); - - assertThat(result.getOrder()).isEqualTo(NachrichtService.SEND_POSTFACH_NACHRICHT_ORDER); - } - - @Test - void shouldCallCreatedBy() { - buildCommand(); - - verify(commandMapper).toOzgCloudUserId(BescheidTestFactory.CREATED_BY.toString()); - } - - @Test - void shouldSetCreatedBy() { - var userId = OzgCloudUserId.from(BescheidTestFactory.CREATED_BY.toString()); - when(commandMapper.toOzgCloudUserId(anyString())).thenReturn(userId); - - var result = buildCommand(); - - assertThat(result.getCreatedBy()).isEqualTo(userId); - } - - @Test - void shouldCallBuildSendNachrichtCommandBody() { - buildCommand(); - - verify(service).buildSendNachrichtCommandBody(bescheid); - } - - @Test - void shouldSetBodyObject() { - var result = buildCommand(); - - assertThat(result.getBodyObject()).isEqualTo(bodyObject); - } - - private OzgCloudCommand buildCommand() { - return service.buildSendBescheidCommand(bescheid); - } - } - - @Nested - class TestBuildSendNachrichtCommandBody { - - private final Bescheid bescheid = BescheidTestFactory.create(); - - @Test - void shouldCallBuildPostfachAddress() { - service.buildSendNachrichtCommandBody(bescheid); - - verify(service).buildPostfachAddress(bescheid); - } - - @Test - void shouldSetPostfachAddress() { - var postfachAddressMap = Map.<String, Object>of("key", "value"); - doReturn(postfachAddressMap).when(service).buildPostfachAddress(any()); - - var result = service.buildSendNachrichtCommandBody(bescheid); - - assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddressMap); - } - - @Test - void shouldSetReplyOption() { - var result = service.buildSendNachrichtCommandBody(bescheid); - - assertThat(result).containsEntry(NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION); - } - - @Test - void shouldSetSubject() { - var result = service.buildSendNachrichtCommandBody(bescheid); - - assertThat(result).containsEntry(NachrichtService.FIELD_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldSetMailBody() { - var result = service.buildSendNachrichtCommandBody(bescheid); - - assertThat(result).containsEntry(NachrichtService.FIELD_MAIL_BODY, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldSetAttachments() { - var result = service.buildSendNachrichtCommandBody(bescheid); - - assertThat(result).containsEntry(NachrichtService.FIELD_ATTACHMENTS, - List.of(BescheidTestFactory.BESCHEID_FILE_ID, AttachedItemTestFactory.ATTACHMENT)); - } - } - - @Nested - class TestBuildPostfachAddress { - - @Test - void shouldCallGetAddress() { - var bescheid = BescheidTestFactory.create(); - - service.buildPostfachAddress(bescheid); - - verify(service).getAddress(bescheid); - } - - @Test - void shouldThrowExceptionIfNoServiceKonto() { - doReturn(Optional.empty()).when(service).getAddress(any()); - var bescheid = BescheidTestFactory.create(); - - assertThrows(TechnicalException.class, () -> service.buildPostfachAddress(bescheid)); - } - - @Test - void shouldSetAddressType() { - var result = service.buildPostfachAddress(BescheidTestFactory.create()); - - assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_TYPE, PostfachAddressTestFactory.TYPE); - } - - @Test - void shouldSetAddressVersion() { - var result = service.buildPostfachAddress(BescheidTestFactory.create()); - - assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_VERSION, PostfachAddressTestFactory.VERSION); - } - - @Test - void shouldSetAddressIdentifier() { - var result = service.buildPostfachAddress(BescheidTestFactory.create()); - - assertThat(result).extracting(Vorgang.PostfachAddress.FIELD_IDENTIFIER, MAP) - .containsEntry(NachrichtService.FIELD_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID); - } - - @Test - void shouldSetServiceKontoType() { - var result = service.buildPostfachAddress(BescheidTestFactory.create()); - - assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, ServiceKontoTestFactory.TYPE); - } - - } - } 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 index 424a4330012bc1fd605dede82c56eac40c435f67..cc93692c7831628dd87ada5bf0cf21f2250b5bb4 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java @@ -11,12 +11,6 @@ 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; - class VorgangServiceTest { @Spy @@ -25,10 +19,6 @@ class VorgangServiceTest { @Mock private VorgangRemoteService remoteService; - @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; @Nested class TestGetById { @@ -54,99 +44,4 @@ class VorgangServiceTest { assertThat(result).isEqualTo(vorgang); } } - - @Nested - class TestBescheiden { - - private final static Vorgang VORGANG = VorgangTestFactory.create(); - - @Mock - private OzgCloudCommand ozgCloudCommand; - - @BeforeEach - void init() { - doReturn(VORGANG).when(service).getById(any(VorgangId.class)); - } - - @Test - void shouldCallGetBeyId() { - service.bescheiden(VorgangTestFactory.ID.toString()); - - verify(service).getById(VorgangTestFactory.ID); - } - - @Test - void shouldCallBuildBescheidenCommand() { - service.bescheiden(VorgangTestFactory.ID.toString()); - - verify(service).buildBescheidenCommand(VORGANG); - } - - @Test - void shouldCallCommandService() { - doReturn(ozgCloudCommand).when(service).buildBescheidenCommand(any()); - - service.bescheiden(VorgangTestFactory.ID.toString()); - - verify(commandService).createAndWaitUntilDone(ozgCloudCommand); - } - } - - @Nested - class TestBuildBescheidenCommand { - - private final static Vorgang VORGANG = VorgangTestFactory.create(); - - @Test - void shouldCallCommandMapperToOzgCloudVorgangId() { - service.buildBescheidenCommand(VORGANG); - - verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetVorgangId() { - var expectedId = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString()); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedId); - - var result = service.buildBescheidenCommand(VORGANG); - - assertThat(result.getVorgangId()).isEqualTo(expectedId); - } - - @Test - void shouldCallCommandMapperMapRelationId() { - service.buildBescheidenCommand(VORGANG); - - verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetRelationId() { - var expectedId = GenericId.from(VorgangTestFactory.ID.toString()); - when(commandMapper.mapRelationId(any())).thenReturn(expectedId); - - var result = service.buildBescheidenCommand(VORGANG); - - assertThat(result.getRelationId()).isEqualTo(expectedId); - } - - @Test - void shouldSetRelationVersion() { - var expectedVersion = VORGANG.getVersion(); - - var result = service.buildBescheidenCommand(VORGANG); - - assertThat(result.getRelationVersion()).isEqualTo(expectedVersion); - } - - @Test - void shouldSetOrder() { - var expectedOrder = VorgangService.VORGANG_BESCHEIDEN; - - var result = service.buildBescheidenCommand(VORGANG); - - assertThat(result.getOrder()).isEqualTo(expectedOrder); - } - } } diff --git a/lombok.config b/lombok.config index d07dd9b0e2b0281fbf514a968b9451cb6af62f93..a06fa130e8af26b659f2d3a0cb1114cd966a9b0e 100644 --- a/lombok.config +++ b/lombok.config @@ -27,4 +27,5 @@ lombok.log.slf4j.flagUsage = ERROR lombok.log.log4j.flagUsage = ERROR lombok.data.flagUsage = ERROR lombok.nonNull.exceptionType = IllegalArgumentException -lombok.addLombokGeneratedAnnotation = true \ No newline at end of file +lombok.addLombokGeneratedAnnotation = true +lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier \ No newline at end of file diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index a04e5464ba13ff4739cc6ad67e1d1990a861c8c0..1d0e1c0689976082d253db668465fb2f937c4972 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -53,7 +53,7 @@ <zufi-manager-interface.version>1.0.0</zufi-manager-interface.version> <user-manager-interface.version>2.1.0</user-manager-interface.version> - <bescheid-manager.version>1.14.1</bescheid-manager.version> + <bescheid-manager.version>1.15.0-SNAPSHOT</bescheid-manager.version> <processor-manager.version>0.4.1</processor-manager.version> <nachrichten-manager.version>2.10.0-SNAPSHOT</nachrichten-manager.version> <ozgcloud-starter.version>0.10.0</ozgcloud-starter.version>