diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java index 8ebf3d388dd200bb2d9ee9a5d57f817ab4a3817a..1b4aee5979b99a9591f17b1648913d3ec0801191 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/bescheid/BescheidModelAssembler.java @@ -1,17 +1,25 @@ package de.ozgcloud.alfa.bescheid; +import static java.util.Optional.*; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.function.Predicate; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.RepresentationModelAssembler; +import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; +import de.ozgcloud.alfa.vorgang.Eingang; +import de.ozgcloud.alfa.vorgang.EingangHeader; +import de.ozgcloud.alfa.vorgang.VorgangController; +import de.ozgcloud.alfa.vorgang.VorgangProperties; +import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import lombok.RequiredArgsConstructor; @Component @@ -31,6 +39,8 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc private static final Predicate<Bescheid> HAS_ATTACHMENTS = bescheid -> !bescheid.getAttachments().isEmpty(); private final BescheidService bescheidService; + private final VorgangController vorgangController; + private final VorgangProperties vorgangProperties; @Override public EntityModel<Bescheid> toModel(Bescheid bescheid) { @@ -40,8 +50,8 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc var uploadBescheidFileLink = linkTo(methodOn(BinaryFileController.class).uploadFile(bescheid.getVorgangId(), "bescheidFile", null)); var uploadAttachmentLink = linkTo(methodOn(BinaryFileController.class).uploadFile(bescheid.getVorgangId(), "bescheidAttachment", null)); var attachmentsLink = linkTo(methodOn(BescheidController.class).getAttachments(bescheid.getVorgangId())); - var createCommandLink = linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(bescheid.getVorgangId(), - bescheid.getId(), bescheid.getVersion(), null)); + var createCommandLink = buildCreateCommandLink(bescheid); + var vorgangWithEingang = vorgangController.getVorgang(bescheid.getVorgangId()); return ModelBuilder.fromEntity(bescheid) .addLink(selfLink.withSelfRel()) @@ -52,10 +62,34 @@ public class BescheidModelAssembler implements RepresentationModelAssembler<Besc .ifMatch(HAS_ATTACHMENTS) .addLink(attachmentsLink.withRel(REL_ATTACHMENTS)) .addLink(createCommandLink.withRel(REL_UPDATE)) - .ifMatch(bescheidService::canCreateBescheidDocumentAutomatically) + .ifMatch(() -> canCreateBescheidDocumentAutomatically(vorgangWithEingang)) .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT)) .addLink(createCommandLink.withRel(REL_CREATE_DOCUMENT_FROM_FILE)) .addLink(createCommandLink.withRel(REL_SEND)) .buildModel(); } + + private WebMvcLinkBuilder buildCreateCommandLink(Bescheid bescheid) { + return linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(bescheid.getVorgangId(), bescheid.getId(), + bescheid.getVersion(), null)); + } + + boolean canCreateBescheidDocumentAutomatically(VorgangWithEingang vorgang) { + return bescheidService.canCreateBescheidDocumentAutomatically() && hasVorgangCreateBescheidDocumentEnabled(vorgang); + } + + boolean hasVorgangCreateBescheidDocumentEnabled(VorgangWithEingang vorgang) { + return ofNullable(vorgang.getEingang()) + .map(Eingang::getHeader) + .map(this::isCreateBescheidDocumentEnabled) + .orElse(false); + } + + private boolean isCreateBescheidDocumentEnabled(EingangHeader eingangHeader) { + return vorgangProperties.getBescheid().stream().anyMatch(prop -> isFormIdAndFormEngineNameMatching(eingangHeader, prop)); + } + + private boolean isFormIdAndFormEngineNameMatching(EingangHeader eingangHeader, VorgangProperty property) { + return property.getFormId().equals(eingangHeader.getFormId()) && property.getFormEngineName().equals(eingangHeader.getFormEngineName()); + } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java index 450d840af3c37898c155029886b6241e1220f679..b89bf7cbd6f033fa90798eaaf53b6b3106639b78 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/bescheid/BescheidModelAssemblerTest.java @@ -5,7 +5,9 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -19,7 +21,15 @@ import org.springframework.hateoas.Link; import org.springframework.web.util.UriTemplate; import de.ozgcloud.alfa.common.command.CommandController; +import de.ozgcloud.alfa.vorgang.Eingang; +import de.ozgcloud.alfa.vorgang.EingangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.EingangTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangProperties; +import de.ozgcloud.alfa.vorgang.VorgangPropertyTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; class BescheidModelAssemblerTest { @@ -30,10 +40,22 @@ class BescheidModelAssemblerTest { @Mock private BescheidService bescheidService; + @Mock + private VorgangProperties vorgangProperties; + + @Mock + private VorgangController vorgangController; + @Nested class TestToModel { private final Bescheid bescheid = BescheidTestFactory.create(); + private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create(); + + @BeforeEach + void setUp() { + when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgangWithEingang); + } @Test void shouldHaveSelfLink() { @@ -95,7 +117,7 @@ class BescheidModelAssemblerTest { @Test void shouldHaveCreateDocumentLink() { - when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(true); + doReturn(true).when(assembler).canCreateBescheidDocumentAutomatically(vorgangWithEingang); var model = callToModel(); @@ -105,7 +127,7 @@ class BescheidModelAssemblerTest { @Test void shoulNotdHaveCreateDocumentLink() { - when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(false); + doReturn(false).when(assembler).canCreateBescheidDocumentAutomatically(vorgangWithEingang); var model = callToModel(); @@ -168,4 +190,146 @@ class BescheidModelAssemblerTest { return assembler.toModel(bescheid); } } + + @Nested + class TestHasVorgangCreateBescheidDocumentEnabled { + + @Nested + class TestOnEmptyBescheidProperties { + + @BeforeEach + void setUp() { + when(vorgangProperties.getBescheid()).thenReturn(Collections.emptyList()); + } + + @Test + void shouldReturnFalse() { + var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create()); + + assertThat(hasEnabled).isFalse(); + } + + } + + @Nested + class TestOnBescheidPropertiesSet { + + @BeforeEach + void setUp() { + when(vorgangProperties.getBescheid()).thenReturn(List.of(VorgangPropertyTestFactory.create())); + } + + @Test + void shouldReturnFalseIfFormEngineNameNotEquals() { + var vorgang = createVorgang(EingangTestFactory.createBuilder() + .header(EingangHeaderTestFactory.createBuilder() + .formEngineName("different").build()) + .build()); + + var hasEnabled = callProcessor(vorgang); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnTrue() { + var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create()); + + assertThat(hasEnabled).isTrue(); + } + } + + @Test + void shouldReturnFalseOnEmptyEingang() { + var vorgangWithEmptyEingang = createVorgang(null); + + var hasEnabled = callProcessor(vorgangWithEmptyEingang); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnFalseOnEmptyEingangHeader() { + var vorgangWithEmptyEingangHeader = EingangTestFactory.createBuilder().header(null).build(); + + var hasEnabled = callProcessor(createVorgang(vorgangWithEmptyEingangHeader)); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnFalseOnEmptyFormEngineName() { + var vorgangWithEmptyFormEngineName = createVorgang( + EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formEngineName(null).build()).build()); + + var hasEnabled = callProcessor(vorgangWithEmptyFormEngineName); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnFalseOnEmptyFormId() { + var vorgangWithEmptyFormId = createVorgang( + EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formId(null).build()).build()); + + var hasEnabled = callProcessor(vorgangWithEmptyFormId); + + assertThat(hasEnabled).isFalse(); + } + + private boolean callProcessor(VorgangWithEingang vorgang) { + return assembler.hasVorgangCreateBescheidDocumentEnabled(vorgang); + } + + private VorgangWithEingang createVorgang(Eingang eingang) { + return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build(); + } + + } + + @Nested + class TestCanCreateBescheidDocumentAutomatically { + + private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create(); + + @Test + void shoulReturnTrueIfServiceConfigured() { + doReturn(true).when(assembler).hasVorgangCreateBescheidDocumentEnabled(vorgangWithEingang); + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(true); + + var canCreate = assembler.canCreateBescheidDocumentAutomatically(vorgangWithEingang); + + assertThat(canCreate).isTrue(); + } + + @Test + void shouldReturnFalseIfServiceNotConfigured() { + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(false); + + var canCreate = assembler.canCreateBescheidDocumentAutomatically(vorgangWithEingang); + + assertThat(canCreate).isFalse(); + } + + @Test + void shouldTrueIfVorgangConfigured() { + doReturn(true).when(assembler).hasVorgangCreateBescheidDocumentEnabled(vorgangWithEingang); + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(true); + + var canCreate = assembler.canCreateBescheidDocumentAutomatically(vorgangWithEingang); + + assertThat(canCreate).isTrue(); + } + + @Test + void shouldReturnFalseIfVorgangNotConfigured() { + doReturn(false).when(assembler).hasVorgangCreateBescheidDocumentEnabled(vorgangWithEingang); + when(bescheidService.canCreateBescheidDocumentAutomatically()).thenReturn(true); + + var canCreate = assembler.canCreateBescheidDocumentAutomatically(vorgangWithEingang); + + assertThat(canCreate).isFalse(); + } + } + }