diff --git a/goofy-server/src/main/java/de/itvsh/goofy/attached_item/VorgangAttachedItem.java b/goofy-server/src/main/java/de/itvsh/goofy/attached_item/VorgangAttachedItem.java new file mode 100644 index 0000000000000000000000000000000000000000..12d2e399feabccf3a41a0a6a2c5113d3e5318c01 --- /dev/null +++ b/goofy-server/src/main/java/de/itvsh/goofy/attached_item/VorgangAttachedItem.java @@ -0,0 +1,21 @@ +package de.itvsh.goofy.attached_item; + +import java.util.Map; + +import de.itvsh.goofy.common.command.CommandBody; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class VorgangAttachedItem implements CommandBody { + + private String id; + private long version; + + private String client; + private String vorgangId; + private String itemName; + + private Map<String, Object> item; +} \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/attached_item/VorgangAttachedItemService.java b/goofy-server/src/main/java/de/itvsh/goofy/attached_item/VorgangAttachedItemService.java new file mode 100644 index 0000000000000000000000000000000000000000..403e258f9f96ca389a398bfdd4d7ce6f60034a59 --- /dev/null +++ b/goofy-server/src/main/java/de/itvsh/goofy/attached_item/VorgangAttachedItemService.java @@ -0,0 +1,54 @@ +package de.itvsh.goofy.attached_item; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import de.itvsh.goofy.common.command.Command; +import de.itvsh.goofy.common.command.CommandBody; +import de.itvsh.goofy.common.command.CommandBodyMapper; +import de.itvsh.goofy.common.command.CommandOrder; +import de.itvsh.goofy.common.command.CommandService; +import de.itvsh.goofy.common.command.CreateCommand; +import de.itvsh.goofy.kommentar.Kommentar; +import de.itvsh.goofy.wiedervorlage.Wiedervorlage; + +@Service +public class VorgangAttachedItemService { + + @Autowired + private CommandBodyMapper commandBodyMapper; + @Autowired + private CommandService commandService; + + static final String WIEDERVORLAGE_ITEM_NAME = "Wiedervorlage"; + static final String KOMMENTAR_ITEM_NAME = "Kommentar"; + + public Command createNewWiedervorlage(Wiedervorlage wiedervorlage, String vorgangId) { + var vorgangAttachedItem = buildVorgangAttachedItem(wiedervorlage, vorgangId, WIEDERVORLAGE_ITEM_NAME); + + return commandService.createCommand(buildCreateCommand(vorgangId, vorgangAttachedItem)); + } + + public Command createNewKommentar(Kommentar kommentar, String vorgangId) { + var vorgangAttachedItem = buildVorgangAttachedItem(kommentar, vorgangId, KOMMENTAR_ITEM_NAME); + + return commandService.createCommand(buildCreateCommand(vorgangId, vorgangAttachedItem)); + } + + VorgangAttachedItem buildVorgangAttachedItem(CommandBody body, String vorgangId, String itemName) { + return VorgangAttachedItem.builder() + .vorgangId(vorgangId) + .itemName(itemName) + .item(commandBodyMapper.fromObjectToMap(body)) + .build(); + } + + CreateCommand buildCreateCommand(String vorgangId, CommandBody commandBody) { + return CreateCommand.builder() + .vorgangId(vorgangId) + .relationId(vorgangId) + .order(CommandOrder.CREATE_ATTACHED_ITEM) + .body(commandBody) + .build(); + } +} \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java index 7941e9f30b61bb38e2a3abc93812fbc39639c62d..1239d61fc27eaf9e55166c7565ad8801b748e55d 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java @@ -26,13 +26,6 @@ public interface CommandBodyMapper { static final String ITEM_NAME_PROPERTY = "itemName"; static final String ITEM_PROPERTY = "item"; - private Object checkEnumValue(Entry<Object, Object> entry) { - if (entry.getValue() instanceof Enum<?> enumValue) { - return enumValue.name(); - } - return entry.getValue(); - } - default GrpcCommandBody mapToBody(Map<String, String> bodyMap) { if (Objects.isNull(bodyMap)) { return GrpcCommandBody.getDefaultInstance(); @@ -86,4 +79,11 @@ public interface CommandBodyMapper { .filter(IS_NOT_VERSION_VALUE) .collect(Collectors.toMap(entry -> entry.getKey().toString(), this::checkEnumValue)); } + + private Object checkEnumValue(Entry<Object, Object> entry) { + if (entry.getValue() instanceof Enum<?> enumValue) { + return enumValue.name(); + } + return entry.getValue(); + } } \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java index 22ff718ba4814b519736975d6647ff2fd6cdccba..98059321e5f0afcc6cd914a3e2f5feefa921ffe6 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java @@ -81,14 +81,13 @@ public class CommandController { command = command.toBuilder() .vorgangId(vorgangId) .relationId(relationId) - .relationVersion(relationVersion) .build(); if (isSendPostfachMailOrder(command)) { command = prepareCommandForPostfachNachricht(command, vorgangId); } - var created = createCommand(command); + var created = createCommand(command, relationVersion); return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); } @@ -119,16 +118,24 @@ public class CommandController { return vorgangController.getVorgang(vorgangId); } - public Command createCommand(CreateCommand command) { - return service.createCommand(command); + public Command createCommand(CreateCommand command, long relationVersion) { + return service.createCommand(command, relationVersion); } - public Command createCommand(CreateCommand command, String itemName) { - return service.createCommand(command, itemName); + // Anlegen eines Commands fuer eine neue PostfachNachricht(resend) + public Command createCommandWithoutRelation(CreateCommand command) { + return service.createCommandWithoutRelation(command); } - public Command createCommandWithoutValidation(CreateCommand command, String itemName) { - return service.createCommandWithoutValidation(command, itemName); + // Anlegen eines Commands fuer das Editieren einer Wiedervorlage/eines + // Kommentares + public Command createCommand(CreateCommand command, String itemName, long relationVersion) { + return service.createCommand(command, itemName, relationVersion); + } + + // Anlegen eines Commands fuer das erledigen/wiedereroeffnen einer Wiedervorlage + public Command createCommandWithoutValidation(CreateCommand command, String itemName, long relationVersion) { + return service.createCommandWithoutValidation(command, itemName, relationVersion); } } } \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java index c3254f8f432ec9fee52f983a7ab55570b00fc26e..28dac75b4cee8d3514bb764db01d2f7fdbf6bc61 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java @@ -11,24 +11,50 @@ import org.springframework.validation.annotation.Validated; import lombok.NonNull; -@Service @Validated -class CommandService { +@Service +public class CommandService { + + static final long NO_RELATION_VERSION = -1; @Autowired private CommandRemoteService remoteService; - public Command createCommand(@Valid CreateCommand command) { + public Command createCommand(CreateCommand command) { + command = command.toBuilder().relationVersion(NO_RELATION_VERSION).build(); + + return remoteService.createCommand(command); + } + + ////////// + public Command createCommand(@Valid CreateCommand command, long relationVersion) { + command = command.toBuilder().relationVersion(relationVersion).build(); + return remoteService.createCommand(command); } - public Command createCommand(@Valid CreateCommand command, String itemName) { + // Anlegen eines Commands fuer eine neue PostfachNachricht(resend) + public Command createCommandWithoutRelation(CreateCommand command) { + command = command.toBuilder().relationVersion(NO_RELATION_VERSION).build(); + + return remoteService.createCommand(command); + } + + // Anlegen eines Commands fuer das Editieren einer Wiedervorlage/eines + // Kommentares + public Command createCommand(@Valid CreateCommand command, String itemName, long relationVersion) { + command = command.toBuilder().relationVersion(relationVersion).build(); + return remoteService.createCommand(command, itemName); } - public Command createCommandWithoutValidation(CreateCommand command, String itemName) { + // Anlegen eines Commands fuer das erledigen/wiedereroeffnen einer Wiedervorlage + public Command createCommandWithoutValidation(CreateCommand command, String itemName, long relationVersion) { + command = command.toBuilder().relationVersion(relationVersion).build(); + return remoteService.createCommand(command, itemName); } + ///////// public Command getById(String commandId) { return remoteService.getCommand(commandId); diff --git a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarCommandController.java b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarCommandController.java index ec6eff4ce49380eca4a2b631a1786e098b8e373c..02200186665d3280fa44bfced261ba1da9a593be 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarCommandController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarCommandController.java @@ -2,8 +2,6 @@ package de.itvsh.goofy.kommentar; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import java.time.ZonedDateTime; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; @@ -17,7 +15,6 @@ import de.itvsh.goofy.common.command.CommandController; import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; import de.itvsh.goofy.common.command.CommandOrder; import de.itvsh.goofy.common.command.CreateCommand; -import de.itvsh.goofy.common.user.CurrentUserService; @RestController @RequestMapping(KommentarCommandController.KOMMENTAR_COMMANDS) @@ -34,8 +31,8 @@ public class KommentarCommandController { @PostMapping public ResponseEntity<Void> editKommentar(@RequestBody KommentarCommand kommentarCommand, @PathVariable String kommentarId, @PathVariable long kommentarVersion) { - var command = commandByRelationController.createCommand(buildCommand(service.getById(kommentarId), kommentarCommand, kommentarVersion), - KommentarRemoteService.ITEM_NAME); + var command = commandByRelationController.createCommand(buildCommand(service.getById(kommentarId), kommentarCommand), + KommentarRemoteService.ITEM_NAME, kommentarVersion); return buildResponseLink(command); } @@ -43,11 +40,10 @@ public class KommentarCommandController { return ResponseEntity.created(linkTo(CommandController.class).slash(createdKommentarCommand.getId()).toUri()).build(); } - CreateCommand buildCommand(Kommentar kommentar, KommentarCommand command, long kommentarVersion) { + CreateCommand buildCommand(Kommentar kommentar, KommentarCommand command) { var commandBuilder = CreateCommand.builder() .order(CommandOrder.UPDATE_ATTACHED_ITEM) .relationId(kommentar.getId()) - .relationVersion(kommentarVersion) .vorgangId(kommentar.getVorgangId()); return commandBuilder.body(updateKommentarByCommand(kommentar, command)).build(); @@ -61,39 +57,16 @@ public class KommentarCommandController { @RequestMapping(KommentarCommandByVorgangController.KOMMENTAR_COMMANDS_BY_VORGANG) public static class KommentarCommandByVorgangController { - static final String KOMMENTAR_COMMANDS_BY_VORGANG = "/api/vorgangs/{vorgangId}/{relationVersion}/kommentarCommands"; - - @Autowired - private CommandByRelationController commandByRelationController; + static final String KOMMENTAR_COMMANDS_BY_VORGANG = "/api/vorgangs/{vorgangId}/kommentarCommands"; @Autowired - private CurrentUserService userService; + private KommentarService service; @PostMapping - public ResponseEntity<Void> createKommentar(@RequestBody KommentarCommand command, @PathVariable String vorgangId, - @PathVariable long relationVersion) { - var createdCommand = commandByRelationController.createCommand(buildCommand(vorgangId, command, relationVersion), - KommentarRemoteService.ITEM_NAME); + public ResponseEntity<Void> createKommentar(@RequestBody KommentarCommand command, @PathVariable String vorgangId) { + var createdCommand = service.createKommentar(command, vorgangId); return ResponseEntity.created(linkTo(CommandController.class).slash(createdCommand.getId()).toUri()).build(); } - - CreateCommand buildCommand(String vorgangId, KommentarCommand command, long relationVersion) { - return CreateCommand.builder() - .vorgangId(vorgangId) - .order(CommandOrder.CREATE_ATTACHED_ITEM) - .relationId(vorgangId) - .relationVersion(relationVersion) - .body(buildBody(command.getKommentar())) - .build(); - } - - Kommentar buildBody(Kommentar kommentar) { - return kommentar.toBuilder() - .createdAt(ZonedDateTime.now().withNano(0)) - .createdBy(userService.getUserId().toString()) - .build(); - } - } -} +} \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarModelAssembler.java b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarModelAssembler.java index 551ca7d1f3b91f8a1c8df602a45dccdfe95e1563..f1fda7f7fe86d4ef4e4e257c96e08b69a7dc5759 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarModelAssembler.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarModelAssembler.java @@ -19,8 +19,6 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, static final String REL_CREATE = "create-kommentar"; static final String REL_EDIT = "edit"; - static final long RELATION_ID_ON_CREATE = -1; - @Override public EntityModel<Kommentar> toModel(Kommentar kommentar) { var selfLink = linkTo(KommentarController.class).slash(kommentar.getId()); @@ -34,7 +32,7 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, public CollectionModel<EntityModel<Kommentar>> toCollectionModel(Stream<Kommentar> entities, String vorgangId) { return CollectionModel.of(entities.map(this::toModel).collect(Collectors.toList()), linkTo(KommentarController.class).withSelfRel(), - linkTo(methodOn(KommentarCommandByVorgangController.class).createKommentar(null, vorgangId, RELATION_ID_ON_CREATE)) + linkTo(methodOn(KommentarCommandByVorgangController.class).createKommentar(null, vorgangId)) .withRel(REL_CREATE)); } } \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarService.java b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarService.java index 8b14e5f2262ef7a7628d9c2526f3704fa9654707..e2f8a698b46892fa04b36180d7e9285145f026e6 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/kommentar/KommentarService.java @@ -1,17 +1,39 @@ package de.itvsh.goofy.kommentar; +import java.time.ZonedDateTime; import java.util.stream.Stream; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -@Service +import de.itvsh.goofy.attached_item.VorgangAttachedItemService; +import de.itvsh.goofy.common.command.Command; +import de.itvsh.goofy.common.user.CurrentUserService; + @Validated +@Service class KommentarService { @Autowired private KommentarRemoteService remoteService; + @Autowired + private CurrentUserService currentUserService; + @Autowired + private VorgangAttachedItemService vorgangAttachedItemService; + + public Command createKommentar(@Valid KommentarCommand kommentarCommand, String vorgangId) { + return vorgangAttachedItemService.createNewKommentar(addCreated(kommentarCommand.getKommentar()), vorgangId); + } + + Kommentar addCreated(Kommentar kommentar) { + return kommentar.toBuilder() + .createdAt(ZonedDateTime.now().withNano(0)) + .createdBy(currentUserService.getUserId().toString()) + .build(); + } public Stream<Kommentar> findByVorgangId(String vorgangId) { return remoteService.findByVorgangId(vorgangId); @@ -20,4 +42,4 @@ class KommentarService { public Kommentar getById(String kommentarId) { return remoteService.getById(kommentarId); } -} +} \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java index c295097dfb4d61ee615ed52ca17ee6c458b92669..aba1528f495b685b32fababbaeff557f283b4eae 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java @@ -81,8 +81,6 @@ public class PostfachMailController { static final String POSTFACH_MAIL_COMMAND_PATH = "/api/vorgangs/{vorgangId}/postfachMails/{postfachMailId}/commands"; // NOSONAR - static final long RELATION_ID_ON_CREATE = -1; - @Autowired private PostfachMailService service; @Autowired @@ -94,9 +92,8 @@ public class PostfachMailController { command = command.toBuilder() .vorgangId(vorgangId) .relationId(postfachMailId) - .relationVersion(RELATION_ID_ON_CREATE) .build(); - var created = commandByRelationController.createCommand(command); + var created = commandByRelationController.createCommandWithoutRelation(command); service.resendPostfachMail(created.getId(), postfachMailId); diff --git a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandController.java b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandController.java index cf2bb3778a08c063cf7a55d81cdd4ac66cfef7ca..c2072d1a51af0629801f486444697fb60403873f 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandController.java @@ -2,7 +2,6 @@ package de.itvsh.goofy.wiedervorlage; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import java.time.ZonedDateTime; import java.util.Objects; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +18,6 @@ import de.itvsh.goofy.common.command.CommandController; import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; import de.itvsh.goofy.common.command.CommandOrder; import de.itvsh.goofy.common.command.CreateCommand; -import de.itvsh.goofy.common.user.CurrentUserService; @RestController @RequestMapping(WiedervorlageCommandController.WIEDERVORLAGE_COMMANDS) @@ -38,7 +36,7 @@ public class WiedervorlageCommandController { @PathVariable long wiedervorlageVersion) { var commandWithUpdatedWiedervorlage = buildCommand(service.getById(wiedervorlageId), command, wiedervorlageVersion); - var createdCommand = createByOrder(commandWithUpdatedWiedervorlage, command.getOrder()); + var createdCommand = createByOrder(commandWithUpdatedWiedervorlage, command.getOrder(), wiedervorlageVersion); service.updateNextFrist((Wiedervorlage) commandWithUpdatedWiedervorlage.getBody(), commandWithUpdatedWiedervorlage.getVorgangId()); @@ -64,11 +62,11 @@ public class WiedervorlageCommandController { } } - Command createByOrder(CreateCommand command, CommandOrder commandOrder) { + Command createByOrder(CreateCommand command, CommandOrder commandOrder, long wiedervorlageVersion) { if (shouldBeValidated(commandOrder)) { - return commandByRelationController.createCommand(command, WiedervorlageRemoteService.ITEM_NAME); + return commandByRelationController.createCommand(command, WiedervorlageRemoteService.ITEM_NAME, wiedervorlageVersion); } else { - return commandByRelationController.createCommandWithoutValidation(command, WiedervorlageRemoteService.ITEM_NAME); + return commandByRelationController.createCommandWithoutValidation(command, WiedervorlageRemoteService.ITEM_NAME, wiedervorlageVersion); } } @@ -88,45 +86,20 @@ public class WiedervorlageCommandController { @RequestMapping(WiedervorlageCommandByVorgangController.WIEDERVORLAGE_COMMANDS_BY_VORGANG) public static class WiedervorlageCommandByVorgangController { - static final String WIEDERVORLAGE_COMMANDS_BY_VORGANG = "/api/vorgangs/{vorgangId}/{relationVersion}/wiedervorlageCommands"; - - @Autowired - private CommandByRelationController commandByRelationController; - - @Autowired - private CurrentUserService userService; + static final String WIEDERVORLAGE_COMMANDS_BY_VORGANG = "/api/vorgangs/{vorgangId}/wiedervorlageCommands"; @Autowired private WiedervorlageService service; @PostMapping - public ResponseEntity<Void> createWiedervorlage(@RequestBody WiedervorlageCommand command, @PathVariable String vorgangId, - @PathVariable long relationVersion) { - var createdCommand = commandByRelationController.createCommand(buildCommand(vorgangId, command, relationVersion), - WiedervorlageRemoteService.ITEM_NAME); + public ResponseEntity<Void> createWiedervorlage(@RequestBody WiedervorlageCommand command, @PathVariable String vorgangId) { + var preparedWiedervorlageCommand = command.toBuilder().wiedervorlage(stripAttachmentFileUriToId(command.getWiedervorlage())).build(); + var createdCommand = service.createWiedervorlage(preparedWiedervorlageCommand, vorgangId); - service.updateNextFrist(command.getWiedervorlage(), vorgangId); + service.updateNextFrist(preparedWiedervorlageCommand.getWiedervorlage(), vorgangId); return ResponseEntity.created(linkTo(CommandController.class).slash(createdCommand.getId()).toUri()).build(); } - - CreateCommand buildCommand(String vorgangId, WiedervorlageCommand command, long relationVersion) { - return CreateCommand.builder() - .vorgangId(vorgangId) - .relationId(vorgangId) - .relationVersion(relationVersion) - .order(CommandOrder.CREATE_ATTACHED_ITEM) - .body(buildBody(command.getWiedervorlage())) - .build(); - } - - Wiedervorlage buildBody(Wiedervorlage wiedervorlage) { - wiedervorlage = wiedervorlage.toBuilder() - .createdAt(ZonedDateTime.now().withNano(0)) - .createdBy(userService.getUserId().toString()) - .build(); - return stripAttachmentFileUriToId(wiedervorlage); - } } // TODO Durch LinkedResource am attachment Attribute ersetzen diff --git a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssembler.java b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssembler.java index f6a3282806962bf7d06bf74cc0c433852de550a4..c771af6325aa0bdfd9834eaea21866e3d466aa14 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssembler.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssembler.java @@ -27,8 +27,6 @@ class WiedervorlageModelAssembler implements RepresentationModelAssembler<Wieder static final String REL_CREATE = "create-wiedervorlage"; static final String REL_UPLOAD_FILE = "uploadFile"; - static final long RELATION_ID_ON_CREATE = -1; - private static final Predicate<Wiedervorlage> ALLOW_ERLEDIGEN = wiedervorlage -> !wiedervorlage.isDone(); private static final Predicate<Wiedervorlage> ALLOW_WIEDEREROEFFNEN = Wiedervorlage::isDone; private static final Predicate<Wiedervorlage> HAS_ATTACHMENTS = wiedervorlage -> !wiedervorlage.getAttachments().isEmpty(); @@ -51,7 +49,7 @@ class WiedervorlageModelAssembler implements RepresentationModelAssembler<Wieder public CollectionModel<EntityModel<Wiedervorlage>> toCollectionModel(Stream<Wiedervorlage> entities, String vorgangId) { return CollectionModel.of(entities.map(this::toModel).collect(Collectors.toList()), linkTo(WiedervorlageController.class).withSelfRel(), - linkTo(methodOn(WiedervorlageCommandByVorgangController.class).createWiedervorlage(null, vorgangId, RELATION_ID_ON_CREATE)) + linkTo(methodOn(WiedervorlageCommandByVorgangController.class).createWiedervorlage(null, vorgangId)) .withRel(REL_CREATE), linkTo(BinaryFileController.class).slash(vorgangId).slash("wiedervorlageAttachment").slash("file") .withRel(REL_UPLOAD_FILE)); diff --git a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java index 4d6961375b53686657df8aa323f17c06f8eddd96..de585297ea0d63b551f8e6fae89211b88155e3fe 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java @@ -1,15 +1,24 @@ package de.itvsh.goofy.wiedervorlage; import java.time.LocalDate; +import java.time.ZonedDateTime; import java.util.Comparator; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Stream; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import de.itvsh.goofy.attached_item.VorgangAttachedItemService; +import de.itvsh.goofy.common.command.Command; +import de.itvsh.goofy.common.user.CurrentUserService; +@Validated @Service class WiedervorlageService { @@ -17,6 +26,21 @@ class WiedervorlageService { @Autowired private WiedervorlageRemoteService remoteService; + @Autowired + private VorgangAttachedItemService vorgangAttachedItemService; + @Autowired + private CurrentUserService currentUserService; + + public Command createWiedervorlage(@Valid WiedervorlageCommand wiedervorlageCommand, String vorgangId) { + return vorgangAttachedItemService.createNewWiedervorlage(addCreated(wiedervorlageCommand.getWiedervorlage()), vorgangId); + } + + Wiedervorlage addCreated(Wiedervorlage wiedervorlage) { + return wiedervorlage.toBuilder() + .createdAt(ZonedDateTime.now().withNano(0)) + .createdBy(currentUserService.getUserId().toString()) + .build(); + } public Wiedervorlage getById(String wiedervorlageId) { return remoteService.getById(wiedervorlageId); diff --git a/goofy-server/src/test/java/de/itvsh/goofy/attached_item/VorgangAttachedItemServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/attached_item/VorgangAttachedItemServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ab01cf545f688576b0f67c2270b18a9e43499cb5 --- /dev/null +++ b/goofy-server/src/test/java/de/itvsh/goofy/attached_item/VorgangAttachedItemServiceTest.java @@ -0,0 +1,180 @@ +package de.itvsh.goofy.attached_item; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +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 static org.assertj.core.api.Assertions.*; + +import de.itvsh.goofy.common.command.Command; +import de.itvsh.goofy.common.command.CommandBodyMapper; +import de.itvsh.goofy.common.command.CommandOrder; +import de.itvsh.goofy.common.command.CommandService; +import de.itvsh.goofy.common.command.CommandTestFactory; +import de.itvsh.goofy.common.command.CreateCommand; +import de.itvsh.goofy.kommentar.Kommentar; +import de.itvsh.goofy.kommentar.KommentarTestFactory; +import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; +import de.itvsh.goofy.wiedervorlage.Wiedervorlage; +import de.itvsh.goofy.wiedervorlage.WiedervorlageTestFactory; + +class VorgangAttachedItemServiceTest { + + @Spy + @InjectMocks + private VorgangAttachedItemService service; + @Mock + private CommandBodyMapper commandBodyMapper; + @Mock + private CommandService commandService; + + @DisplayName("Build vorgang attached item") + @Nested + class TestCreateNewWiedervorlage { + + @DisplayName("should call") + @Nested + class TestCalls { + + private Wiedervorlage wiedervorlage = WiedervorlageTestFactory.create(); + + @BeforeEach + void mockServices() { + doReturn(VorgangAttachedItemTestFactory.create()).when(service).buildVorgangAttachedItem(any(), any(), any()); + doReturn(CommandTestFactory.createCreateCommand()).when(service).buildCreateCommand(any(), any()); + } + + @DisplayName("command service") + @Test + void shouldCallCommandService() { + callCreateNewWiedervorlage(); + + verify(commandService).createCommand(any()); + } + + private Command callCreateNewWiedervorlage() { + return service.createNewWiedervorlage(wiedervorlage, VorgangHeaderTestFactory.ID); + } + } + } + + @DisplayName("Create new kommentar") + @Nested + class TestCreateNewKommentar { + + @DisplayName("should call") + @Nested + class TestCalls { + + private Kommentar kommentar = KommentarTestFactory.create(); + + @BeforeEach + void mockServices() { + doReturn(VorgangAttachedItemTestFactory.create()).when(service).buildVorgangAttachedItem(any(), any(), any()); + doReturn(CommandTestFactory.createCreateCommand()).when(service).buildCreateCommand(any(), any()); + } + + @DisplayName("command service") + @Test + void shouldCallCommandService() { + callCreateNewKommentar(); + + verify(commandService).createCommand(any()); + } + + private Command callCreateNewKommentar() { + return service.createNewKommentar(kommentar, VorgangHeaderTestFactory.ID); + } + } + } + + @DisplayName("build createCommand") + @Nested + class TestBuildVorgangAttachedItem { + + private static final Wiedervorlage BODY = WiedervorlageTestFactory.create(); + + @BeforeEach + void mockServices() { + when(commandBodyMapper.fromObjectToMap(any())).thenReturn(VorgangAttachedItemTestFactory.ITEM); + } + + @Test + void shouldCallCommandBodyMapper() { + buildVorgangAttachedItem(); + + verify(commandBodyMapper).fromObjectToMap(BODY); + } + + @Test + void shouldContainsVorgangId() { + var vorgangAttachedItem = buildVorgangAttachedItem(); + + assertThat(vorgangAttachedItem.getVorgangId()).isEqualTo(VorgangHeaderTestFactory.ID); + } + + @Test + void shouldContainsItemName() { + var vorgangAttachedItem = buildVorgangAttachedItem(); + + assertThat(vorgangAttachedItem.getItemName()).isEqualTo(VorgangAttachedItemService.WIEDERVORLAGE_ITEM_NAME); + } + + @Test + void shouldContainsItem() { + var vorgangAttachedItem = buildVorgangAttachedItem(); + + assertThat(vorgangAttachedItem.getItem()).isEqualTo(VorgangAttachedItemTestFactory.ITEM); + } + + private VorgangAttachedItem buildVorgangAttachedItem() { + return service.buildVorgangAttachedItem(BODY, VorgangHeaderTestFactory.ID, + VorgangAttachedItemService.WIEDERVORLAGE_ITEM_NAME); + } + } + + @DisplayName("build createCommand") + @Nested + class TestBuildCreateCommand { + + @Test + void shouldContainsVorgangId() throws Exception { + var createCommand = buildCommand(); + + assertThat(createCommand.getVorgangId()).isEqualTo(VorgangHeaderTestFactory.ID); + } + + @Test + void shouldContainsRelationId() throws Exception { + var createCommand = buildCommand(); + + assertThat(createCommand.getRelationId()).isEqualTo(VorgangHeaderTestFactory.ID); + } + + @Test + void shouldContainsOrder() throws Exception { + var createCommand = buildCommand(); + + assertThat(createCommand.getOrder()).isEqualTo(CommandOrder.CREATE_ATTACHED_ITEM); + } + + @Test + void shouldContainsBody() throws Exception { + var createCommand = buildCommand(); + + assertThat(((VorgangAttachedItem) createCommand.getBody())).usingRecursiveComparison() + .isEqualTo(VorgangAttachedItemTestFactory.create()); + } + + private CreateCommand buildCommand() { + return service.buildCreateCommand(VorgangHeaderTestFactory.ID, VorgangAttachedItemTestFactory.create()); + } + } +} \ No newline at end of file diff --git a/goofy-server/src/test/java/de/itvsh/goofy/attached_item/VorgangAttachedItemTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/attached_item/VorgangAttachedItemTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..e60eb908369e7814decfbda69ee8436618764bcc --- /dev/null +++ b/goofy-server/src/test/java/de/itvsh/goofy/attached_item/VorgangAttachedItemTestFactory.java @@ -0,0 +1,26 @@ +package de.itvsh.goofy.attached_item; + +import java.util.Map; +import java.util.UUID; + +public class VorgangAttachedItemTestFactory { + + public static final String ID = UUID.randomUUID().toString(); + public static final long VERSION = 42; + public static final String CLIENT = "Goofy"; + public static final String ITEM_NAME = "ItemName"; + public static final Map<String, Object> ITEM = Map.of("oneKey", "oneValue"); + + public static VorgangAttachedItem create() { + return createBuilder().build(); + } + + public static VorgangAttachedItem.VorgangAttachedItemBuilder createBuilder() { + return VorgangAttachedItem.builder() + .id(ID) + .version(VERSION) + .client(CLIENT) + .itemName(ITEM_NAME) + .item(ITEM); + } +} \ No newline at end of file diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java index f7792d08c6f0c4f255f9744f6a32f96c22e6290b..d1974d77858aef0cae2f9b3852af412bc8c4bf2f 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java @@ -146,7 +146,7 @@ class CommandControllerTest { @BeforeEach void initTest() { - when(service.createCommand(any(CreateCommand.class))).thenReturn(CommandTestFactory.create()); + when(service.createCommand(any(CreateCommand.class), anyLong())).thenReturn(CommandTestFactory.create()); } @DisplayName("should return CREATED") @@ -160,11 +160,11 @@ class CommandControllerTest { void callService() throws Exception { doRequest(); - verify(service).createCommand(createCommandCaptor.capture()); + verify(service).createCommand(createCommandCaptor.capture(), eq(CommandTestFactory.RELATION_VERSION)); assertThat(createCommandCaptor.getValue().getOrder()).isEqualTo(CommandTestFactory.ORDER); assertThat(createCommandCaptor.getValue().getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID); assertThat(createCommandCaptor.getValue().getRelationId()).isEqualTo(CommandTestFactory.RELATION_ID); - assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(CommandTestFactory.RELATION_VERSION); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isZero(); } @DisplayName("should have location header") @@ -251,6 +251,20 @@ class CommandControllerTest { } } + @DisplayName("Create by vorgang with relation id") + @Nested + class TestCreateByVorgangWithoutRelationId { + + private final CreateCommand command = CommandTestFactory.createCreateCommand(); + + @Test + void shouldCallSerice() { + controller.createCommandWithoutRelation(command); + + verify(service).createCommandWithoutRelation(command); + } + } + @Nested class CreateByVorgangAndItemName { @@ -262,9 +276,9 @@ class CommandControllerTest { @Test void shouldCallService() { - controller.createCommand(command, ITEM_NAME); + controller.createCommand(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); - verify(service).createCommand(command, ITEM_NAME); + verify(service).createCommand(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); } } @@ -273,11 +287,10 @@ class CommandControllerTest { @Test void shouldCallService() { - controller.createCommandWithoutValidation(command, ITEM_NAME); + controller.createCommandWithoutValidation(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); - verify(service).createCommandWithoutValidation(command, ITEM_NAME); + verify(service).createCommandWithoutValidation(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); } - } } } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java index 759269e308b7733181a6b4f2113288d7ffd29e72..a3462fc704138553c8bdfa59344abd35eedb0668 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java @@ -29,27 +29,61 @@ class CommandServiceTest { private final CreateCommand command = CommandTestFactory.createCreateCommand(); - @Test - void shouldCallRemoteServiceWithVersion() { - service.createCommand(command); + @Nested + class TestWithCreateCommandOnly { + + @Test + void shouldCallRemoteService() { + service.createCommand(command); - verify(remoteService).createCommand(command); + verify(remoteService).createCommand(any(CreateCommand.class)); + } + + @Test + void shouldHaveSetRelationVersion() { + service.createCommand(command); + + verify(remoteService).createCommand(createCommandCaptor.capture()); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(CommandService.NO_RELATION_VERSION); + } } - @Test - void shouldHaveVorgangId() { - service.createCommand(command); + @Nested + class TestWithRelationVersion { + + @Test + void shouldCallRemoteService() { + service.createCommand(command, CommandTestFactory.RELATION_VERSION); + + verify(remoteService).createCommand(any(CreateCommand.class)); + } + + @Test + void shouldHaveSetRelationId() { + service.createCommand(command, CommandTestFactory.RELATION_VERSION); - verify(remoteService).createCommand(createCommandCaptor.capture()); - assertThat(createCommandCaptor.getValue().getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID); + verify(remoteService).createCommand(createCommandCaptor.capture()); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(CommandTestFactory.RELATION_VERSION); + } } - @Test - void shouldHaveRelationId() { - service.createCommand(command); + @Nested + class TestWithoutRelationVersion { + + @Test + void shouldCallRemoteService() { + service.createCommandWithoutRelation(command); + + verify(remoteService).createCommand(any(CreateCommand.class)); + } + + @Test + void shouldHaveSetRelationId() { + service.createCommandWithoutRelation(command); - verify(remoteService).createCommand(createCommandCaptor.capture()); - assertThat(createCommandCaptor.getValue().getRelationId()).isEqualTo(CommandTestFactory.RELATION_ID); + verify(remoteService).createCommand(createCommandCaptor.capture()); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(CommandService.NO_RELATION_VERSION); + } } } @@ -64,9 +98,17 @@ class CommandServiceTest { @Test void shouldCallRemoteService() { - service.createCommand(command, ITEM_NAME); + service.createCommand(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); + + verify(remoteService).createCommand(any(CreateCommand.class), eq(ITEM_NAME)); + } + + @Test + void shouldHaveSetRelationId() { + service.createCommand(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); - verify(remoteService).createCommand(command, ITEM_NAME); + verify(remoteService).createCommand(createCommandCaptor.capture(), eq(ITEM_NAME)); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(CommandTestFactory.RELATION_VERSION); } } @@ -75,9 +117,17 @@ class CommandServiceTest { @Test void shouldCallRemoteService() { - service.createCommandWithoutValidation(command, ITEM_NAME); + service.createCommandWithoutValidation(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); + + verify(remoteService).createCommand(any(CreateCommand.class), eq(ITEM_NAME)); + } + + @Test + void shouldHaveSetRelationId() { + service.createCommandWithoutValidation(command, ITEM_NAME, CommandTestFactory.RELATION_VERSION); - verify(remoteService).createCommand(command, ITEM_NAME); + verify(remoteService).createCommand(createCommandCaptor.capture(), eq(ITEM_NAME)); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(CommandTestFactory.RELATION_VERSION); } } } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/user/GoofyUserTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/common/user/GoofyUserTestFactory.java index dd713bdae5e65d6ada50b375071cc6adefb25c4c..fb8a5c667c83e35d0b986946b6a2c45cb59116ff 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/user/GoofyUserTestFactory.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/user/GoofyUserTestFactory.java @@ -1,15 +1,20 @@ package de.itvsh.goofy.common.user; +import java.util.UUID; + import de.itvsh.goofy.vorgang.ZustaendigeStelleTestFactory; public class GoofyUserTestFactory { + public static final UserId ID = UserId.from(UUID.randomUUID().toString()); + public static GoofyUser create() { return createBuilder().build(); } public static GoofyUser.GoofyUserBuilder createBuilder() { return GoofyUser.builder() + .id(ID) .organisationseinheitId(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); } } \ No newline at end of file diff --git a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandControllerTest.java index 219acc66a0825b4d96c68987374a368df05b2228..9f1b8757e60a9fa24b1bc6f89d85296dc56488c9 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandControllerTest.java @@ -6,8 +6,6 @@ import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -import java.util.UUID; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -27,8 +25,6 @@ import de.itvsh.goofy.common.command.CommandController.CommandByRelationControll import de.itvsh.goofy.common.command.CommandOrder; import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.common.command.CreateCommand; -import de.itvsh.goofy.common.user.CurrentUserService; -import de.itvsh.goofy.common.user.UserId; import de.itvsh.goofy.kommentar.KommentarCommandController.KommentarCommandByVorgangController; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; @@ -47,51 +43,26 @@ class KommentarCommandControllerTest { private KommentarCommandByVorgangController controller; @Mock private KommentarService service; - @Mock - private CommandByRelationController commandByRelationController; - @Mock - private CurrentUserService userService; private MockMvc mockMvc; @BeforeEach void init() { mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); - when(userService.getUserId()).thenReturn(UserId.from(UUID.randomUUID())); - when(commandByRelationController.createCommand(any(), anyString())).thenReturn(CommandTestFactory.create()); - } - @Test - void shouldReturnCreated() throws Exception { - doRequest().andExpect(status().isCreated()); + when(service.createKommentar(any(), any())).thenReturn(CommandTestFactory.create()); } @Test void shouldCallService() throws Exception { doRequest(); - verify(commandByRelationController).createCommand(any(), eq(KommentarRemoteService.ITEM_NAME)); - } - - @Test - void shouldBuildCommand() throws Exception { - doRequest(); - - verify(controller).buildCommand(eq(VorgangHeaderTestFactory.ID), any(), eq(RELATION_ID_ON_CREATE)); + verify(service).createKommentar(any(KommentarCommand.class), eq(VorgangHeaderTestFactory.ID)); } @Test - void shouldGiveCommandToService() throws Exception { - doRequest(); - - verify(commandByRelationController).createCommand(commandCaptor.capture(), anyString()); - var command = commandCaptor.getValue(); - - assertThat(command).usingRecursiveComparison() - .ignoringFields("body", "status", "relationVersion")// TODO relationVersion beachten OZG-2684 - .isEqualTo(CommandTestFactory.createCreateCommandBuilder().order(CommandOrder.CREATE_ATTACHED_ITEM) - .relationId(VorgangHeaderTestFactory.ID) - .build()); + void shouldReturnCreated() throws Exception { + doRequest().andExpect(status().isCreated()); } private ResultActions doRequest() throws Exception { @@ -120,7 +91,7 @@ class KommentarCommandControllerTest { @BeforeEach void init() { mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); - when(commandByRelationController.createCommand(any(), anyString())).thenReturn(CommandTestFactory.create()); + when(commandByRelationController.createCommand(any(), anyString(), anyLong())).thenReturn(CommandTestFactory.create()); when(service.getById(any())).thenReturn(KommentarTestFactory.createBuilder().vorgangId(VorgangHeaderTestFactory.ID).build()); } @@ -140,14 +111,14 @@ class KommentarCommandControllerTest { void shouldBuildCommand() throws Exception { doRequest(); - verify(controller).buildCommand(any(Kommentar.class), any(KommentarCommand.class), eq(KommentarTestFactory.VERSION)); + verify(controller).buildCommand(any(Kommentar.class), any(KommentarCommand.class)); } @Test void shouldGiveCommandToService() throws Exception { doRequest(); - verify(commandByRelationController).createCommand(commandCaptor.capture(), anyString()); + verify(commandByRelationController).createCommand(commandCaptor.capture(), anyString(), anyLong()); var command = commandCaptor.getValue(); assertThat(command).usingRecursiveComparison() diff --git a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandITCase.java index 32783371fc29bcfedc774f68e76e8bd213531a61..45ce5ed15a923cf3daaa9d7d919e6bbbd7695461 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandITCase.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarCommandITCase.java @@ -115,14 +115,14 @@ class KommentarCommandITCase { @BeforeEach void initTest() { when(remoteService.getById(any())).thenReturn(KommentarTestFactory.create()); - when(commandRemoteService.createCommand(any(), anyString())).thenReturn(CommandTestFactory.create()); + when(commandRemoteService.createCommand(any())).thenReturn(CommandTestFactory.create()); } @Test void shouldCreateCommand() throws Exception { doRequestByVorgangId(createValidRequestContent()).andExpect(status().isCreated()); - verify(commandRemoteService).createCommand(any(), eq(KommentarRemoteService.ITEM_NAME)); + verify(commandRemoteService).createCommand(any()); } @WithMockUser @@ -130,6 +130,8 @@ class KommentarCommandITCase { @Nested class TestValidation { + private static final String FIELD_PREFIX = "kommentarCommand.kommentar"; + @DisplayName("for null Text") @Test void createCommandWithInvalidText() throws Exception { @@ -137,7 +139,7 @@ class KommentarCommandITCase { doRequestByVorgangId(content).andExpect(status().isUnprocessableEntity()) .andExpect(jsonPath("$.issues.length()").value(1)) - .andExpect(jsonPath("$.issues.[0].field").value("command.body.text")) + .andExpect(jsonPath("$.issues.[0].field").value(FIELD_PREFIX + ".text")) .andExpect(jsonPath("$.issues.[0].messageCode").value(ValidationMessageCodes.FIELD_IS_EMPTY)); } @@ -147,7 +149,7 @@ class KommentarCommandITCase { String content = buildContentWithText(StringUtils.EMPTY); doRequestByVorgangId(content).andExpect(status().isUnprocessableEntity()) - .andExpect(jsonPath("$.issues.[0].field").value("command.body.text")); + .andExpect(jsonPath("$.issues.[0].field").value(FIELD_PREFIX + ".text")); } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarModelAssemblerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarModelAssemblerTest.java index 8599e12e747a09a2d0a6fe59ac16e12d87ae2a31..9e605466c1e115ca671e7152d75376ba46ada19d 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarModelAssemblerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarModelAssemblerTest.java @@ -76,7 +76,7 @@ class KommentarModelAssemblerTest { assertThat(link).isPresent(); assertThat(link.get().getHref()).isEqualTo( - "/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/" + KommentarModelAssembler.RELATION_ID_ON_CREATE + "/kommentarCommands"); + "/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/kommentarCommands"); } } } \ No newline at end of file diff --git a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarServiceTest.java index d7193d38b9d8ba7ae8385d7e2414f0e42a2d45e8..084812e5f76e99e0efbbb4430605467c68a57c57 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/kommentar/KommentarServiceTest.java @@ -1,21 +1,103 @@ package de.itvsh.goofy.kommentar; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; + +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 static org.assertj.core.api.Assertions.*; +import de.itvsh.goofy.attached_item.VorgangAttachedItemService; +import de.itvsh.goofy.common.command.Command; +import de.itvsh.goofy.common.command.CommandTestFactory; +import de.itvsh.goofy.common.user.CurrentUserService; +import de.itvsh.goofy.common.user.GoofyUserTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; class KommentarServiceTest { + @Spy @InjectMocks private KommentarService service; - @Mock private KommentarRemoteService remoteService; + @Mock + private VorgangAttachedItemService vorgangAttachedItemService; + @Mock + private CurrentUserService currentUserService; + + @DisplayName("Create kommentar") + @Nested + class TestCreateKommentar { + + @DisplayName("should") + @Nested + class TestCalls { + + @BeforeEach + void mockServices() { + doReturn(KommentarTestFactory.create()).when(service).addCreated(any()); + when(vorgangAttachedItemService.createNewKommentar(any(), any())).thenReturn(CommandTestFactory.create()); + } + + @DisplayName("add created") + @Test + void shouldAddCreated() { + callCreateKommentar(); + + verify(service).addCreated(any(Kommentar.class)); + } + + @DisplayName("call vorgangattacheditem service") + @Test + void shouldCallVorgangAttachedItemService() { + callCreateKommentar(); + + verify(vorgangAttachedItemService).createNewKommentar(any(Kommentar.class), eq(VorgangHeaderTestFactory.ID)); + } + } + + @DisplayName("Add created") + @Nested + class TestAddCreated { + + @BeforeEach + void mockServices() { + when(currentUserService.getUserId()).thenReturn(GoofyUserTestFactory.ID); + } + + @Test + void shouldSetCreatedAt() throws Exception { + var kommentar = callAddCreated(); + + assertThat(kommentar.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); + } + + @Test + void shouldSetCreatedBy() throws Exception { + var kommentar = callAddCreated(); + + assertThat(kommentar.getCreatedBy()).isEqualTo(GoofyUserTestFactory.ID.toString()); + } + + private Kommentar callAddCreated() { + return service.addCreated(KommentarTestFactory.createBuilder().createdAt(null).createdBy(null).build()); + } + } + + private Command callCreateKommentar() { + return service.createKommentar(KommentarCommandTestFactory.create(), VorgangHeaderTestFactory.ID); + } + } @Nested class TestGetById { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java index 607cc4ada5037eb8aef73b6350b786ebe6837b86..77f85fb625a2744ebe45085cd8731efaf93104c1 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java @@ -17,8 +17,6 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import static org.assertj.core.api.Assertions.*; - import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.common.command.CreateCommand; @@ -49,15 +47,14 @@ class PostfachMailCommandControllerTest { @BeforeEach void mockController() { - when(commandByRelationController.createCommand(any(CreateCommand.class))).thenReturn(CommandTestFactory.create()); + when(commandByRelationController.createCommandWithoutRelation(any(CreateCommand.class))).thenReturn(CommandTestFactory.create()); } @Test void shouldCallCommandByRelationController() throws Exception { doRequest(); - verify(commandByRelationController).createCommand(createCommandCaptor.capture()); - assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(PostfachMailCommandController.RELATION_ID_ON_CREATE); + verify(commandByRelationController).createCommandWithoutRelation(createCommandCaptor.capture()); } @Test diff --git a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java index 552717bfd37235877ec24a5ba13208001ecfadd0..d7943300b584b4b9ab37f935fa05e6b3aebb3c25 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java @@ -5,9 +5,6 @@ import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -22,16 +19,10 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import static org.assertj.core.api.Assertions.*; - -import de.itvsh.goofy.common.binaryfile.BinaryFileTestFactory; -import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; -import de.itvsh.goofy.common.command.CommandOrder; import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.common.command.CreateCommand; import de.itvsh.goofy.common.user.CurrentUserService; -import de.itvsh.goofy.common.user.UserTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; import de.itvsh.goofy.wiedervorlage.WiedervorlageCommandController.WiedervorlageCommandByVorgangController; @@ -51,8 +42,6 @@ class WiedervorlageCommandByVorgangControllerTest { private ArgumentCaptor<CreateCommand> createCommandCaptor; private MockMvc mockMvc; - private static final long RELATION_VERSION = -1; - @BeforeEach void init() { mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); @@ -64,30 +53,17 @@ class WiedervorlageCommandByVorgangControllerTest { @BeforeEach void mockUserService() { - when(userService.getUserId()).thenReturn(UserTestFactory.ID); + when(service.createWiedervorlage(any(), any())).thenReturn(CommandTestFactory.create()); } @Nested class ServiceMethod { - @BeforeEach - void initMocks() { - when(commandByRelationController.createCommand(any(), any())).thenReturn(CommandTestFactory.create()); - } - - @Test - void shouldCallCommandByRelationController() throws Exception { - doRequest(); - - verify(commandByRelationController).createCommand(any(CreateCommand.class), - eq(WiedervorlageRemoteService.ITEM_NAME)); - } - @Test - void shouldBuildCommand() throws Exception { + void shouldCallService() throws Exception { doRequest(); - verify(controller).buildCommand(eq(VorgangHeaderTestFactory.ID), any(WiedervorlageCommand.class), eq(RELATION_VERSION)); + verify(service).createWiedervorlage(any(WiedervorlageCommand.class), eq(VorgangHeaderTestFactory.ID)); } @Test @@ -102,95 +78,12 @@ class WiedervorlageCommandByVorgangControllerTest { doRequest().andExpect(status().isCreated()); } } - - @Nested - class BuildCreateCommand { - - @Test - void shouldContainsOrder() throws Exception { - var createCommand = buildCommand(); - - assertThat(createCommand.getOrder()).isEqualTo(CommandOrder.CREATE_ATTACHED_ITEM); - } - - @Test - void shouldContainsVorgangId() throws Exception { - var createCommand = buildCommand(); - - assertThat(createCommand.getVorgangId()).isEqualTo(VorgangHeaderTestFactory.ID); - } - - @Test - void shouldContainsRelationId() throws Exception { - var createCommand = buildCommand(); - - assertThat(createCommand.getRelationId()).isEqualTo(VorgangHeaderTestFactory.ID); - } - - @Test - void shouldContainsRelationVersion() throws Exception { - var createCommand = buildCommand(); - - assertThat(createCommand.getRelationVersion()).isEqualTo(RELATION_VERSION); - } - - @Test - void shouldContainsBody() throws Exception { - var createCommand = buildCommand(); - - assertThat(((Wiedervorlage) createCommand.getBody())).usingRecursiveComparison().ignoringFields("createdAt", "createdBy") - .isEqualTo(WiedervorlageTestFactory.create()); - } - - private CreateCommand buildCommand() { - return controller.buildCommand(VorgangHeaderTestFactory.ID, WiedervorlageCommandTestFactory.create(), RELATION_VERSION); - } - } - - @Nested - class BuildBody { - - private final Wiedervorlage wiedervorlage = WiedervorlageTestFactory.create(); - - @Test - void shouldSetCreatedAt() { - var enrichedWiedervorlage = buildBody(wiedervorlage.toBuilder().createdAt(null).build()); - - assertThat(enrichedWiedervorlage.getCreatedAt()).isCloseTo(ZonedDateTime.now().withNano(0), - within(2, ChronoUnit.SECONDS)); - } - - @Test - void shouldSetCreatedBy() { - var enrichedWiedervorlage = buildBody(wiedervorlage.toBuilder().createdBy(null).build()); - - assertThat(enrichedWiedervorlage.getCreatedBy()).isEqualTo(UserTestFactory.ID.toString()); - } - - @Nested - class StripAttachmentFileUriToId { - - @Test - void shouldStripFileUriToFileId() { - var fileIdAsUri = FileId.from("api/irgendwas/dazwischen/" + BinaryFileTestFactory.ID); - var wiedervorlageWithAttachmentAsFileUri = WiedervorlageTestFactory.createBuilder().attachment(fileIdAsUri).build(); - - var wiedervorlage = buildBody(wiedervorlageWithAttachmentAsFileUri); - - assertThat(wiedervorlage.getAttachments().get(0)).isEqualTo(BinaryFileTestFactory.FILE_ID); - } - } - - private Wiedervorlage buildBody(Wiedervorlage wiedervorlage) { - return controller.buildBody(wiedervorlage); - } - } } private ResultActions doRequest() throws Exception { return mockMvc.perform( post(WiedervorlageCommandByVorgangController.WIEDERVORLAGE_COMMANDS_BY_VORGANG, - VorgangHeaderTestFactory.ID, RELATION_VERSION) + VorgangHeaderTestFactory.ID) .content(WiedervorlageCommandTestFactory.createValidRequestContent()) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().is2xxSuccessful()); diff --git a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandControllerTest.java index ae40b90507521a107252fa025df4682772dd11bf..a5d337f05f22aac349185fff4d2d83de23b0d027 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandControllerTest.java @@ -22,6 +22,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.assertj.core.api.Assertions.*; import de.itvsh.goofy.common.binaryfile.BinaryFileTestFactory; +import de.itvsh.goofy.common.binaryfile.FileId; import de.itvsh.goofy.common.command.Command; import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; import de.itvsh.goofy.common.command.CommandOrder; @@ -62,7 +63,7 @@ class WiedervorlageCommandControllerTest { @BeforeEach void init() { when(service.getById(any())).thenReturn(WiedervorlageTestFactory.create()); - doReturn(CommandTestFactory.create()).when(controller).createByOrder(any(), any()); + doReturn(CommandTestFactory.create()).when(controller).createByOrder(any(), any(), anyLong()); } @Test @@ -76,7 +77,7 @@ class WiedervorlageCommandControllerTest { void shouldCallCreateByOrderController() throws Exception { doRequest(); - verify(controller).createByOrder(any(), any()); + verify(controller).createByOrder(any(), any(), anyLong()); } @Test @@ -246,7 +247,8 @@ class WiedervorlageCommandControllerTest { void shouldCallCreateCommand() { createCommandByOrder(CommandOrder.EDIT_WIEDERVORLAGE); - verify(commandByRelationController).createCommand(any(), eq(WiedervorlageRemoteService.ITEM_NAME)); + verify(commandByRelationController).createCommand(any(), eq(WiedervorlageRemoteService.ITEM_NAME), + eq(WiedervorlageTestFactory.VERSION)); } } @@ -257,7 +259,8 @@ class WiedervorlageCommandControllerTest { void shouldCallCreateCommandWithoutValidation() { createCommandByOrder(CommandOrder.WIEDERVORLAGE_ERLEDIGEN); - verify(commandByRelationController).createCommandWithoutValidation(any(), eq(WiedervorlageRemoteService.ITEM_NAME)); + verify(commandByRelationController).createCommandWithoutValidation(any(), eq(WiedervorlageRemoteService.ITEM_NAME), + eq(WiedervorlageTestFactory.VERSION)); } } @@ -268,13 +271,28 @@ class WiedervorlageCommandControllerTest { void shouldCallCreateCommandWithoutValidation() { createCommandByOrder(CommandOrder.WIEDERVORLAGE_WIEDEREROEFFNEN); - verify(commandByRelationController).createCommandWithoutValidation(any(), eq(WiedervorlageRemoteService.ITEM_NAME)); + verify(commandByRelationController).createCommandWithoutValidation(any(), eq(WiedervorlageRemoteService.ITEM_NAME), + eq(WiedervorlageTestFactory.VERSION)); } } private Command createCommandByOrder(CommandOrder order) { - return controller.createByOrder(CommandTestFactory.createCreateCommand(), order); + return controller.createByOrder(CommandTestFactory.createCreateCommand(), order, WiedervorlageTestFactory.VERSION); } } } + + @Nested + class StripAttachmentFileUriToId { + + @Test + void shouldStripFileUriToFileId() { + var fileIdAsUri = FileId.from("api/irgendwas/dazwischen/" + BinaryFileTestFactory.ID); + var wiedervorlageWithAttachmentAsFileUri = WiedervorlageTestFactory.createBuilder().attachment(fileIdAsUri).build(); + + var wiedervorlage = WiedervorlageCommandController.stripAttachmentFileUriToId(wiedervorlageWithAttachmentAsFileUri); + + assertThat(wiedervorlage.getAttachments().get(0)).isEqualTo(BinaryFileTestFactory.FILE_ID); + } + } } \ No newline at end of file diff --git a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandITCase.java index e93af260521099e54007a668668f9283457ed1d8..d6041830348dbd90fce3fc6d6ebbcb7f70b1e532 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandITCase.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageCommandITCase.java @@ -150,7 +150,7 @@ class WiedervorlageCommandITCase { @BeforeEach void initTest() { - when(commandRemoteService.createCommand(any(), anyString())).thenReturn(CommandTestFactory.create()); + when(commandRemoteService.createCommand(any())).thenReturn(CommandTestFactory.create()); when(wiedervorlageRemoteService.getById(anyString())).thenReturn(WiedervorlageTestFactory.create()); } @@ -158,7 +158,7 @@ class WiedervorlageCommandITCase { void shouldCreateCommand() throws Exception { doRequest(createValidRequestContent()).andExpect(status().isCreated()); - verify(commandRemoteService).createCommand(any(), anyString()); + verify(commandRemoteService).createCommand(any()); } @WithMockUser @@ -166,6 +166,8 @@ class WiedervorlageCommandITCase { @Nested class TestValidation { + private static final String FIELD_PREFIX = "wiedervorlageCommand.wiedervorlage"; + @DisplayName("for null Betreff") @Test void createCommandWithInvalidBetreff() throws Exception { @@ -173,7 +175,7 @@ class WiedervorlageCommandITCase { doRequest(content).andExpect(status().isUnprocessableEntity()) .andExpect(jsonPath("$.issues.length()").value(1)) - .andExpect(jsonPath("$.issues.[0].field").value("command.body.betreff")) + .andExpect(jsonPath("$.issues.[0].field").value(FIELD_PREFIX + ".betreff")) .andExpect(jsonPath("$.issues.[0].messageCode").value(ValidationMessageCodes.FIELD_IS_EMPTY)); } @@ -183,7 +185,7 @@ class WiedervorlageCommandITCase { String content = buildContentWithBetreff("a"); doRequest(content).andExpect(status().isUnprocessableEntity()) - .andExpect(jsonPath("$.issues.[0].field").value("command.body.betreff")); + .andExpect(jsonPath("$.issues.[0].field").value(FIELD_PREFIX + ".betreff")); } @@ -215,7 +217,7 @@ class WiedervorlageCommandITCase { doRequest(content).andExpect(status().isUnprocessableEntity()) .andExpect(jsonPath("$.issues.length()").value(1)) - .andExpect(jsonPath("$.issues.[0].field").value("command.body.frist")) + .andExpect(jsonPath("$.issues.[0].field").value(FIELD_PREFIX + ".frist")) .andExpect(jsonPath("$.issues.[0].messageCode").value(ValidationMessageCodes.FIELD_DATE_PAST)); } @@ -227,7 +229,7 @@ class WiedervorlageCommandITCase { doRequest(content).andExpect(status().isUnprocessableEntity()) .andExpect(jsonPath("$.issues.length()").value(1)) - .andExpect(jsonPath("$.issues.[0].field").value("command.body.frist")) + .andExpect(jsonPath("$.issues.[0].field").value(FIELD_PREFIX + ".frist")) .andExpect(jsonPath("$.issues.[0].messageCode").value(ValidationMessageCodes.FIELD_IS_EMPTY)); } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssemblerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssemblerTest.java index 6d29f9637bc0aa28701358c9e50efb46abada82b..9106cf6495d827777b93143782f93cdc6d52dd1e 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssemblerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageModelAssemblerTest.java @@ -133,8 +133,7 @@ class WiedervorlageModelAssemblerTest { var link = collectionModel.getLink(WiedervorlageModelAssembler.REL_CREATE); assertThat(link).isPresent(); - assertThat(link.get().getHref()).isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/" - + WiedervorlageModelAssembler.RELATION_ID_ON_CREATE + "/wiedervorlageCommands"); + assertThat(link.get().getHref()).isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/wiedervorlageCommands"); } @Test diff --git a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java index 1609042fd1f5e58458f8dffa0dd91f1970e9c338..7ce0f902d948916578a78eb94589685a507fe0bd 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java @@ -1,15 +1,16 @@ package de.itvsh.goofy.wiedervorlage; -import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.time.LocalDate; +import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; 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.ArgumentMatchers; @@ -17,6 +18,14 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import static org.assertj.core.api.Assertions.*; + +import de.itvsh.goofy.attached_item.VorgangAttachedItemService; +import de.itvsh.goofy.common.command.Command; +import de.itvsh.goofy.common.command.CommandService; +import de.itvsh.goofy.common.command.CommandTestFactory; +import de.itvsh.goofy.common.user.CurrentUserService; +import de.itvsh.goofy.common.user.GoofyUserTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; class WiedervorlageServiceTest { @@ -24,9 +33,78 @@ class WiedervorlageServiceTest { @Spy @InjectMocks private WiedervorlageService service; - @Mock private WiedervorlageRemoteService remoteService; + @Mock + private VorgangAttachedItemService vorgangAttachedItemService; + @Mock + private CommandService commandService; + @Mock + private CurrentUserService currentUserService; + + @DisplayName("Create wiedervorlage") + @Nested + class TestCreateWiedervorlage { + + @DisplayName("should") + @Nested + class TestCalls { + + @BeforeEach + void mockServices() { + doReturn(WiedervorlageTestFactory.create()).when(service).addCreated(any()); + when(vorgangAttachedItemService.createNewWiedervorlage(any(), any())).thenReturn(CommandTestFactory.create()); + } + + @DisplayName("add created") + @Test + void shouldAddCreated() { + callCreateWiedervorlage(); + + verify(service).addCreated(any(Wiedervorlage.class)); + } + + @DisplayName("call vorgangattacheditem service") + @Test + void shouldCallVorgangAttachedItemService() { + callCreateWiedervorlage(); + + verify(vorgangAttachedItemService).createNewWiedervorlage(any(Wiedervorlage.class), eq(VorgangHeaderTestFactory.ID)); + } + } + + @DisplayName("Add created") + @Nested + class TestAddCreated { + + @BeforeEach + void mockServices() { + when(currentUserService.getUserId()).thenReturn(GoofyUserTestFactory.ID); + } + + @Test + void shouldSetCreatedAt() throws Exception { + var wiedervorlage = callAddCreated(); + + assertThat(wiedervorlage.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); + } + + @Test + void shouldSetCreatedBy() throws Exception { + var wiedervorlage = callAddCreated(); + + assertThat(wiedervorlage.getCreatedBy()).isEqualTo(GoofyUserTestFactory.ID.toString()); + } + + private Wiedervorlage callAddCreated() { + return service.addCreated(WiedervorlageTestFactory.createBuilder().createdAt(null).createdBy(null).build()); + } + } + + private Command callCreateWiedervorlage() { + return service.createWiedervorlage(WiedervorlageCommandTestFactory.create(), VorgangHeaderTestFactory.ID); + } + } @Nested class TestGetById {