diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java index 6ec01b6f79faee44c1cae7c9806ea4beede9416b..dd6cb3d0a4a8a31ae7aecc328658f9ab12f05b24 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java @@ -38,7 +38,6 @@ import de.ozgcloud.alfa.common.CollectionModelBuilder; import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.kommentar.KommentarCommandController.KommentarCommandByVorgangController; -import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -67,7 +66,7 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, var attachmentsLink = linkTo(methodOn(KommentarController.class).getAttachments(kommentar.getId())); return ModelBuilder.fromEntity(kommentar).addLink(selfLink.withSelfRel()) - .ifMatch(() -> isEditable(vorgang)) + .ifMatch(() -> vorgangController.isEditable(vorgang)) .addLink(commandLink.withRel(REL_EDIT)) .ifMatch(HAS_ATTACHMENTS) .addLink(attachmentsLink.withRel(REL_ATTACHMENTS)) @@ -80,13 +79,9 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, return CollectionModelBuilder.fromEntities(entities.map(kommentar -> buildModel(kommentar, vorgang))) .addLink(linkTo(KommentarController.class).withSelfRel()) .addLink(linkTo(BinaryFileController.class).slash(vorgangId).slash("kommentarAttachment").slash("file").withRel(REL_UPLOAD_FILE)) - .ifMatch(kommentareModel -> isEditable(vorgang)) + .ifMatch(() -> vorgangController.isEditable(vorgang)) .addLink(linkTo(methodOn(KommentarCommandByVorgangController.class).createKommentar(null, vorgangId)) .withRel(REL_CREATE)) .buildModel(); } - - private boolean isEditable(VorgangWithEingang vorgang) { - return vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN; - } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java index 8d23095292dea0d30595fcdde1a13e3191e61d28..a78a8557ccbc84d841fe54e826d46631ed0b9dc7 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java @@ -213,4 +213,8 @@ public class VorgangController { return handleGetAllRequest(requestCriteria); } + + public boolean isEditable(VorgangWithEingang vorgang) { + return vorgangService.isEditable(vorgang); + } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java index 61c4f75e230452f02dc4475e8790c172b4803b19..c85203151d23b98260e8b4c43c8659e3d7279b68 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java @@ -97,4 +97,8 @@ class VorgangService { private Collection<String> getOrganisationseinheitenIdsFromUser() { return userService.getUser().getOrganisationseinheitIds(); } + + public boolean isEditable(VorgangWithEingang vorgang) { + return vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN && (vorgang.getHeader() == null || !vorgang.getHeader().isLocked()); + } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java index 21ec0ed833dc64a2ef0a4995c7940d07b497b6b8..e5bedc8eac2d93aa7ac9a76879c2f1ea945f97e5 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java @@ -43,9 +43,9 @@ import org.springframework.hateoas.server.EntityLinks; import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory; -import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; class KommentarModelAssemblerTest { @@ -90,11 +90,13 @@ class KommentarModelAssemblerTest { @Nested class TestLinksOnModel { - final String COMMAND_BY_KOMMENTAR_PATH = // + private static final String COMMAND_BY_KOMMENTAR_PATH = // KommentarCommandController.KOMMENTAR_COMMANDS .replace("{kommentarId}", KommentarTestFactory.ID) .replace("{kommentarVersion}", String.valueOf(KommentarTestFactory.VERSION)); + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + @Test void shouldHaveSelfLink() { var link = buildModel().getLink(IanaLinkRelations.SELF); @@ -105,6 +107,8 @@ class KommentarModelAssemblerTest { @Test void shouldHaveEditLink() { + when(vorgangController.isEditable(vorgang)).thenReturn(true); + var model = buildModel(); assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isPresent().get().extracting(Link::getHref) @@ -113,9 +117,9 @@ class KommentarModelAssemblerTest { @Test void shouldNotHaveEditLink() { - var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build(); + when(vorgangController.isEditable(vorgang)).thenReturn(false); - var model = modelAssembler.buildModel(KommentarTestFactory.create(), vorgang); + var model = buildModel(); assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isEmpty(); } @@ -149,7 +153,7 @@ class KommentarModelAssemblerTest { } EntityModel<Kommentar> buildModel() { - return modelAssembler.buildModel(KommentarTestFactory.create(), VorgangWithEingangTestFactory.create()); + return modelAssembler.buildModel(KommentarTestFactory.create(), vorgang); } } @@ -157,10 +161,11 @@ class KommentarModelAssemblerTest { class TestLinksOnCollectionModel { private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); @BeforeEach void beforeEach() { - when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(VorgangWithEingangTestFactory.create()); + when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang); } @Test @@ -187,6 +192,7 @@ class KommentarModelAssemblerTest { @Test void shouldHaveCreateKommentarLink() { initUserProfileUrlProvider(urlProvider); + when(vorgangController.isEditable(vorgang)).thenReturn(true); var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(), VorgangHeaderTestFactory.ID); @@ -201,8 +207,7 @@ class KommentarModelAssemblerTest { @Test void shouldNotHaveCreateKommentarLink() { initUserProfileUrlProvider(urlProvider); - var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build(); - when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang); + when(vorgangController.isEditable(vorgang)).thenReturn(false); var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(), VorgangHeaderTestFactory.ID); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java index 4c237346f037043fb98cf7c8c49a3a72b8e65bfd..21077182204efb4f4d68590f22751ae19141df72 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java @@ -901,4 +901,27 @@ class VorgangControllerTest { .content(body)); } } + + @Nested + class TestIsEditable { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + + @Test + void shouldCallService() { + controller.isEditable(vorgang); + + verify(vorgangService).isEditable(vorgang); + } + + @ParameterizedTest + @ValueSource(booleans = {true, false}) + void shouldReturnServiceResult(boolean serviceResult) { + when(vorgangService.isEditable(vorgang)).thenReturn(serviceResult); + + var editable = controller.isEditable(vorgang); + + assertThat(editable).isEqualTo(serviceResult); + } + } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java index ee9788983ebb3355a4df0706ea42d46aabe385cc..e1b2ad1d5df534a5b3e6db19d749aa467f14f32c 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java @@ -33,6 +33,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -332,4 +334,59 @@ class VorgangServiceTest { verify(service).buildFilterCriteria(any(FilterCriteria.class)); } } + + @Nested + class TestIsEditable { + + @ParameterizedTest + @EnumSource + void shouldBeFalseWhenVorgangIsLocked(VorgangStatus status) { + var vorgang = VorgangWithEingangTestFactory.createBuilder() + .header(VorgangHeadTestFactory.createBuilder().locked(true).build()) + .status(status) + .build(); + + var editable = service.isEditable(vorgang); + + assertThat(editable).isFalse(); + } + + @Test + void shouldBeFalseWhenVorgangZuLoeschen() { + var vorgang = VorgangWithEingangTestFactory.createBuilder() + .header(VorgangHeadTestFactory.createBuilder().locked(false).build()) + .status(VorgangStatus.ZU_LOESCHEN) + .build(); + + var editable = service.isEditable(vorgang); + + assertThat(editable).isFalse(); + } + + @ParameterizedTest + @EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ZU_LOESCHEN") + void shouldBeTrueWhenVorgangIsNotZuLoeschen(VorgangStatus status) { + var vorgang = VorgangWithEingangTestFactory.createBuilder() + .header(VorgangHeadTestFactory.createBuilder().locked(false).build()) + .status(status) + .build(); + + var editable = service.isEditable(vorgang); + + assertThat(editable).isTrue(); + } + + @ParameterizedTest + @EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ZU_LOESCHEN") + void shouldBeTrueIfHeaderIsNull(VorgangStatus status) { + var vorgang = VorgangWithEingangTestFactory.createBuilder() + .header(null) + .status(status) + .build(); + + var editable = service.isEditable(vorgang); + + assertThat(editable).isTrue(); + } + } } \ No newline at end of file