Skip to content
Snippets Groups Projects
Commit 613c0af7 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-6989 OZG-7216 Deactivate links if locked

parent 3ac7caed
No related branches found
No related tags found
No related merge requests found
...@@ -38,7 +38,6 @@ import de.ozgcloud.alfa.common.CollectionModelBuilder; ...@@ -38,7 +38,6 @@ import de.ozgcloud.alfa.common.CollectionModelBuilder;
import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController;
import de.ozgcloud.alfa.kommentar.KommentarCommandController.KommentarCommandByVorgangController; 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.VorgangController;
import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
...@@ -67,7 +66,7 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, ...@@ -67,7 +66,7 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar,
var attachmentsLink = linkTo(methodOn(KommentarController.class).getAttachments(kommentar.getId())); var attachmentsLink = linkTo(methodOn(KommentarController.class).getAttachments(kommentar.getId()));
return ModelBuilder.fromEntity(kommentar).addLink(selfLink.withSelfRel()) return ModelBuilder.fromEntity(kommentar).addLink(selfLink.withSelfRel())
.ifMatch(() -> isEditable(vorgang)) .ifMatch(() -> vorgangController.isEditable(vorgang))
.addLink(commandLink.withRel(REL_EDIT)) .addLink(commandLink.withRel(REL_EDIT))
.ifMatch(HAS_ATTACHMENTS) .ifMatch(HAS_ATTACHMENTS)
.addLink(attachmentsLink.withRel(REL_ATTACHMENTS)) .addLink(attachmentsLink.withRel(REL_ATTACHMENTS))
...@@ -80,13 +79,9 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar, ...@@ -80,13 +79,9 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar,
return CollectionModelBuilder.fromEntities(entities.map(kommentar -> buildModel(kommentar, vorgang))) return CollectionModelBuilder.fromEntities(entities.map(kommentar -> buildModel(kommentar, vorgang)))
.addLink(linkTo(KommentarController.class).withSelfRel()) .addLink(linkTo(KommentarController.class).withSelfRel())
.addLink(linkTo(BinaryFileController.class).slash(vorgangId).slash("kommentarAttachment").slash("file").withRel(REL_UPLOAD_FILE)) .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)) .addLink(linkTo(methodOn(KommentarCommandByVorgangController.class).createKommentar(null, vorgangId))
.withRel(REL_CREATE)) .withRel(REL_CREATE))
.buildModel(); .buildModel();
} }
private boolean isEditable(VorgangWithEingang vorgang) {
return vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN;
}
} }
\ No newline at end of file
...@@ -213,4 +213,8 @@ public class VorgangController { ...@@ -213,4 +213,8 @@ public class VorgangController {
return handleGetAllRequest(requestCriteria); return handleGetAllRequest(requestCriteria);
} }
public boolean isEditable(VorgangWithEingang vorgang) {
return vorgangService.isEditable(vorgang);
}
} }
\ No newline at end of file
...@@ -97,4 +97,8 @@ class VorgangService { ...@@ -97,4 +97,8 @@ class VorgangService {
private Collection<String> getOrganisationseinheitenIdsFromUser() { private Collection<String> getOrganisationseinheitenIdsFromUser() {
return userService.getUser().getOrganisationseinheitIds(); 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
...@@ -43,9 +43,9 @@ import org.springframework.hateoas.server.EntityLinks; ...@@ -43,9 +43,9 @@ import org.springframework.hateoas.server.EntityLinks;
import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.UserProfileUrlProvider;
import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory; import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangController;
import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
class KommentarModelAssemblerTest { class KommentarModelAssemblerTest {
...@@ -90,11 +90,13 @@ class KommentarModelAssemblerTest { ...@@ -90,11 +90,13 @@ class KommentarModelAssemblerTest {
@Nested @Nested
class TestLinksOnModel { class TestLinksOnModel {
final String COMMAND_BY_KOMMENTAR_PATH = // private static final String COMMAND_BY_KOMMENTAR_PATH = //
KommentarCommandController.KOMMENTAR_COMMANDS KommentarCommandController.KOMMENTAR_COMMANDS
.replace("{kommentarId}", KommentarTestFactory.ID) .replace("{kommentarId}", KommentarTestFactory.ID)
.replace("{kommentarVersion}", String.valueOf(KommentarTestFactory.VERSION)); .replace("{kommentarVersion}", String.valueOf(KommentarTestFactory.VERSION));
private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
@Test @Test
void shouldHaveSelfLink() { void shouldHaveSelfLink() {
var link = buildModel().getLink(IanaLinkRelations.SELF); var link = buildModel().getLink(IanaLinkRelations.SELF);
...@@ -105,6 +107,8 @@ class KommentarModelAssemblerTest { ...@@ -105,6 +107,8 @@ class KommentarModelAssemblerTest {
@Test @Test
void shouldHaveEditLink() { void shouldHaveEditLink() {
when(vorgangController.isEditable(vorgang)).thenReturn(true);
var model = buildModel(); var model = buildModel();
assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isPresent().get().extracting(Link::getHref) assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isPresent().get().extracting(Link::getHref)
...@@ -113,9 +117,9 @@ class KommentarModelAssemblerTest { ...@@ -113,9 +117,9 @@ class KommentarModelAssemblerTest {
@Test @Test
void shouldNotHaveEditLink() { 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(); assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isEmpty();
} }
...@@ -149,7 +153,7 @@ class KommentarModelAssemblerTest { ...@@ -149,7 +153,7 @@ class KommentarModelAssemblerTest {
} }
EntityModel<Kommentar> buildModel() { EntityModel<Kommentar> buildModel() {
return modelAssembler.buildModel(KommentarTestFactory.create(), VorgangWithEingangTestFactory.create()); return modelAssembler.buildModel(KommentarTestFactory.create(), vorgang);
} }
} }
...@@ -157,10 +161,11 @@ class KommentarModelAssemblerTest { ...@@ -157,10 +161,11 @@ class KommentarModelAssemblerTest {
class TestLinksOnCollectionModel { class TestLinksOnCollectionModel {
private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
@BeforeEach @BeforeEach
void beforeEach() { void beforeEach() {
when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(VorgangWithEingangTestFactory.create()); when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
} }
@Test @Test
...@@ -187,6 +192,7 @@ class KommentarModelAssemblerTest { ...@@ -187,6 +192,7 @@ class KommentarModelAssemblerTest {
@Test @Test
void shouldHaveCreateKommentarLink() { void shouldHaveCreateKommentarLink() {
initUserProfileUrlProvider(urlProvider); initUserProfileUrlProvider(urlProvider);
when(vorgangController.isEditable(vorgang)).thenReturn(true);
var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(), var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(),
VorgangHeaderTestFactory.ID); VorgangHeaderTestFactory.ID);
...@@ -201,8 +207,7 @@ class KommentarModelAssemblerTest { ...@@ -201,8 +207,7 @@ class KommentarModelAssemblerTest {
@Test @Test
void shouldNotHaveCreateKommentarLink() { void shouldNotHaveCreateKommentarLink() {
initUserProfileUrlProvider(urlProvider); initUserProfileUrlProvider(urlProvider);
var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build(); when(vorgangController.isEditable(vorgang)).thenReturn(false);
when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(), var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(),
VorgangHeaderTestFactory.ID); VorgangHeaderTestFactory.ID);
......
...@@ -901,4 +901,27 @@ class VorgangControllerTest { ...@@ -901,4 +901,27 @@ class VorgangControllerTest {
.content(body)); .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
...@@ -33,6 +33,8 @@ import org.junit.jupiter.api.BeforeEach; ...@@ -33,6 +33,8 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; 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.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
...@@ -332,4 +334,59 @@ class VorgangServiceTest { ...@@ -332,4 +334,59 @@ class VorgangServiceTest {
verify(service).buildFilterCriteria(any(FilterCriteria.class)); 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment