Skip to content
Snippets Groups Projects
Commit 819556d4 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-3625 OZG-4037 implement feature toggle for loeschanforderung

parent d7226ed8
Branches
Tags
No related merge requests found
......@@ -25,10 +25,22 @@ package de.ozgcloud.alfa;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
import de.ozgcloud.alfa.common.FeatureToggle;
import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.downloadtoken.DownloadTokenController;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserId;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.system.SystemStatusService;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangController;
import java.time.Instant;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.info.BuildProperties;
import org.springframework.hateoas.EntityModel;
......@@ -38,17 +50,6 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.downloadtoken.DownloadTokenController;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserId;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.system.SystemStatusService;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangController;
import lombok.NonNull;
@RestController
@RequestMapping(RootController.PATH)
public class RootController {
......@@ -66,6 +67,8 @@ public class RootController {
private SystemStatusService systemStatusService;
@Autowired
private UserManagerUrlProvider userManagerUrlProvider;
@Autowired
private FeatureToggle featureToggle;
@GetMapping
public EntityModel<RootResource> getRootResource() {
......@@ -120,7 +123,14 @@ public class RootController {
static final int PAGE_SIZE = 100;
private final List<VorgangStatus> statusList = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN);
VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN);
List<VorgangStatus> getStatusList() {
if (featureToggle.isLoeschanforderungEnabled()) {
return Stream.of(statusList, List.of(VorgangStatus.ZU_LOESCHEN)).flatMap(Collection::stream).toList();
}
return statusList;
}
void addViewLinks(ModelBuilder<RootResource> modelBuilder, Optional<UserId> userId) {
modelBuilder.addLink(buildGetAllVorgaengeLink());
......@@ -205,7 +215,7 @@ public class RootController {
}
void addVorgangStatusLinks(ModelBuilder<RootResource> modelBuilder, String linkRelTemplate) {
statusList.forEach(status -> modelBuilder.addLink(buildGetAllVorgaengeByStatus(status, linkRelTemplate)));
getStatusList().forEach(status -> modelBuilder.addLink(buildGetAllVorgaengeByStatus(status, linkRelTemplate)));
}
Link buildGetAllVorgaengeByStatus(VorgangStatus status, String linkRelTemplate) {
......@@ -222,7 +232,7 @@ public class RootController {
}
List<Link> buildVorgangStatusLinks(String linkRelTemplate, UserId userId) {
return statusList.stream().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList();
return getStatusList().stream().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList();
}
Link buildGetAllVorgaengeByAssignedToAndStatus(VorgangStatus status, String linkRelTemplate, UserId userId) {
......
package de.ozgcloud.alfa.common;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class FeatureToggle {
@Value("${goofy.features.loeschanforderung}")
private boolean loeschanforderung;
public boolean isLoeschanforderungEnabled() {
return loeschanforderung;
}
}
package de.ozgcloud.alfa.loeschanforderung;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
import de.ozgcloud.alfa.common.FeatureToggle;
import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItem;
import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.vorgang.Vorgang;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link;
......@@ -13,11 +17,6 @@ import org.springframework.hateoas.LinkRelation;
import org.springframework.hateoas.server.RepresentationModelProcessor;
import org.springframework.stereotype.Component;
import java.util.Optional;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
@Component
class LoeschAnforderungVorgangProzessor implements RepresentationModelProcessor<EntityModel<? extends Vorgang>> {
......@@ -30,8 +29,15 @@ class LoeschAnforderungVorgangProzessor implements RepresentationModelProcessor<
@Autowired
private VorgangAttachedItemService vorgangAttachedItemService;
@Autowired
private FeatureToggle featureToggle;
@Override
public EntityModel<? extends Vorgang> process(EntityModel<? extends Vorgang> model) {
if (!featureToggle.isLoeschanforderungEnabled()) {
return model;
}
var vorgang = model.getContent();
var vorgangAttachedItem = vorgangAttachedItemService.findVorgangAttachedItem(vorgang.getId(), LoeschAnforderung.ITEM_NAME);
return ModelBuilder.fromModel(model)
......
......@@ -6,6 +6,8 @@ logging:
goofy:
production: false
features:
loeschanforderung: true
keycloak:
auth-server-url: http://localhost:8088
......
......@@ -51,6 +51,8 @@ management:
goofy:
production: true
features:
loeschanforderung: false
keycloak:
auth-server-url: http://localhost:8088
......
......@@ -29,10 +29,19 @@ import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import de.ozgcloud.alfa.RootController.RootResource;
import de.ozgcloud.alfa.common.FeatureToggle;
import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserId;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.system.SystemStatusService;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
......@@ -51,16 +60,6 @@ import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import de.ozgcloud.alfa.RootController.RootResource;
import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserId;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.system.SystemStatusService;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
class RootControllerTest {
@Spy
......@@ -72,9 +71,10 @@ class RootControllerTest {
private CurrentUserService currentUserService;
@Mock
private SystemStatusService systemStatusService;
@Mock
private UserManagerUrlProvider userManagerUrlProvider;
@Mock
private FeatureToggle featureToggle;
private MockMvc mockMvc;
......@@ -567,12 +567,12 @@ class RootControllerTest {
@Nested
class TestBuildVorgangStatusLinks {
@Spy
private final ModelBuilder<RootResource> modelBuilder = ModelBuilder.fromEntity(rootResource);
private final UserId userId = UserProfileTestFactory.ID;
@Test
void shouldCallBuildVorgangListByPageLink() {
when(featureToggle.isLoeschanforderungEnabled()).thenReturn(true);
controller.buildVorgangStatusLinks(RootController.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
verify(controller, times(7)).buildGetAllVorgaengeByAssignedToAndStatus(
......@@ -583,6 +583,8 @@ class RootControllerTest {
@Test
void shouldCallFormatLinkRelTemplate() {
when(featureToggle.isLoeschanforderungEnabled()).thenReturn(true);
controller.buildVorgangStatusLinks(RootController.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
verify(controller, times(7)).formatLinkRelTemplate(eq(RootController.VORGAENGE_ALL_REL_TEMPLATE), any(VorgangStatus.class));
......@@ -590,6 +592,8 @@ class RootControllerTest {
@Test
void shouldBuildLinks() {
when(featureToggle.isLoeschanforderungEnabled()).thenReturn(true);
var links = controller.buildVorgangStatusLinks(RootController.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
assertThat(links).hasSize(7);
......@@ -673,4 +677,22 @@ class RootControllerTest {
}
}
}
@Nested
public class TestGetStatusList {
@Test
void shouldReturnWithZuLoeschen() {
when(featureToggle.isLoeschanforderungEnabled()).thenReturn(true);
assertThat(controller.getStatusList()).hasSize(7).contains(VorgangStatus.ZU_LOESCHEN);
}
@Test
void shouldReturnWithoutZuLoeschen() {
when(featureToggle.isLoeschanforderungEnabled()).thenReturn(false);
assertThat(controller.getStatusList()).hasSize(6).doesNotContain(VorgangStatus.ZU_LOESCHEN);
}
}
}
\ No newline at end of file
package de.ozgcloud.alfa.loeschanforderung;
import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import de.ozgcloud.alfa.common.FeatureToggle;
import de.ozgcloud.alfa.common.UserProfileUrlProvider;
import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService;
import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemTestFactory;
......@@ -8,6 +13,7 @@ import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
......@@ -21,13 +27,6 @@ import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link;
import org.springframework.web.util.UriTemplate;
import java.util.Optional;
import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.initUserProfileUrlProvider;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class LoeschAnforderungVorgangProzessorTest {
@InjectMocks
......@@ -39,8 +38,16 @@ class LoeschAnforderungVorgangProzessorTest {
@Mock
private VorgangAttachedItemService vorgangAttachedItemService;
@Mock
private FeatureToggle featureToggle;
@DisplayName("add links")
@Nested
class TestLinks {
@BeforeEach
void init() {
when(featureToggle.isLoeschanforderungEnabled()).thenReturn(true);
initUserProfileUrlProvider(new UserProfileUrlProvider());
when(vorgangAttachedItemService.findVorgangAttachedItem(VorgangHeaderTestFactory.ID, LoeschAnforderung.ITEM_NAME)).thenReturn(
Optional.of(VorgangAttachedItemTestFactory.create()));
......@@ -50,7 +57,8 @@ class LoeschAnforderungVorgangProzessorTest {
@DisplayName("add 'loeschen_anfordern' link")
class TestLoeschenAnfordernLink {
private static final UriTemplate EXPECTED_LINK_URI_TEMPLATE = new UriTemplate(LoeschAnforderungByVorgangController.CREATE_LOESCHANFORDERUNG_PATH);
private static final UriTemplate EXPECTED_LINK_URI_TEMPLATE = new UriTemplate(
LoeschAnforderungByVorgangController.CREATE_LOESCHANFORDERUNG_PATH);
@Nested
class TestOnVerwaltungUser {
......@@ -152,7 +160,26 @@ class LoeschAnforderungVorgangProzessorTest {
var model = prozessor.process(EntityModel.of(VorgangHeaderTestFactory.create()));
var link = model.getLink(LoeschAnforderungVorgangProzessor.REL_LOESCH_ANFORDERUNG);
assertThat(link).isPresent().map(Link::getHref).hasValue(EXPECTED_LINK_URI_TEMPLATE.expand(VorgangAttachedItemTestFactory.ID).toString());
assertThat(link).isPresent().map(Link::getHref)
.hasValue(EXPECTED_LINK_URI_TEMPLATE.expand(VorgangAttachedItemTestFactory.ID).toString());
}
}
}
@DisplayName("feature toggle")
@Nested
class TestLoeschAnforderungFeatureToggle {
@ParameterizedTest
@EnumSource(mode = Mode.INCLUDE, names = { "VERWORFEN", "ABGESCHLOSSEN" })
void isOff(VorgangStatus status) {
when(featureToggle.isLoeschanforderungEnabled()).thenReturn(false);
var vorgang = VorgangHeaderTestFactory.createBuilder().status(status);
var model = prozessor.process(EntityModel.of(vorgang.build()));
assertThat(model.getLink(LoeschAnforderungVorgangProzessor.REL_LOESCHEN_ANFORDERN)).isEmpty();
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment