diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java index a8af53edb791331f6beb006f0b95bd89d8758f8d..6b1eddb06bbdde10b0b234ace883e20d2978bc65 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java @@ -27,12 +27,14 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.server.LinkBuilder; import org.springframework.stereotype.Component; +import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserRole; @@ -68,11 +70,12 @@ class RootViewLinkHandler { static final int PAGE_SIZE = 100; + private static final List<VorgangStatus> STATUS_LIST = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, + VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET); + private final CurrentUserService currentUserService; private final SystemStatusService systemStatusService; - - private final List<VorgangStatus> statusList = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, - VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN); + private final FeatureToggleProperties featureToggleProperties; public void addViewLinks(EntityModel<Root> model, Optional<UserId> userId) { model.add(buildGetAllVorgaengeLink()); @@ -158,7 +161,7 @@ class RootViewLinkHandler { } void addVorgangStatusLinks(EntityModel<Root> model, String linkRelTemplate) { - statusList.forEach(status -> model.add(buildGetAllVorgaengeByStatus(status, linkRelTemplate))); + getVorgangStatuses().forEach(status -> model.add(buildGetAllVorgaengeByStatus(status, linkRelTemplate))); } Link buildGetAllVorgaengeByStatus(VorgangStatus status, String linkRelTemplate) { @@ -175,7 +178,11 @@ class RootViewLinkHandler { } List<Link> buildVorgangStatusLinks(String linkRelTemplate, UserId userId) { - return statusList.stream().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList(); + return getVorgangStatuses().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList(); + } + + Stream<VorgangStatus> getVorgangStatuses() { + return STATUS_LIST.stream().filter(status -> status != VorgangStatus.WEITERGELEITET || featureToggleProperties.isForwardByOzgCloudEnabled()); } Link buildGetAllVorgaengeByAssignedToAndStatus(VorgangStatus status, String linkRelTemplate, UserId userId) { @@ -214,4 +221,5 @@ class RootViewLinkHandler { .getAllByAssignedToAndUngeleseneNachrichten(0, PAGE_SIZE, userId, VorgangController.PARAM_NACHRICHTEN_UNGELESENE)) .withRel(linkRel); } + } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java index 6f0a4929e00ed92387cf4cf0d7394ce698a2dd07..852c8cfc857519ad795c68c9c81930f6728e4800 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java @@ -39,4 +39,5 @@ class ByStatus { private int abgeschlossen; private int verworfen; private int zuLoeschen; + private int weitergeleitet; } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java index 9e8cbd8c31459b379a51b42b5334c9babb2bcf07..57b9c2e7c56f6c53b3027d44972243c109c7ab39 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java @@ -28,26 +28,27 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; +import lombok.RequiredArgsConstructor; @Service +@RequiredArgsConstructor class StatisticService { - static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, - VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN); - static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER = Collections.emptyList(); - static final List<VorgangStatus> COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER = Collections.emptyList(); + private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, + VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, + VorgangStatus.WEITERGELEITET); + private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER = Collections.emptyList(); + private static final List<VorgangStatus> COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER = Collections.emptyList(); - @Autowired - private StatisticRemoteService remoteService; - - @Autowired - private CurrentUserService currentUserService; + private final StatisticRemoteService remoteService; + private final CurrentUserService currentUserService; + private final FeatureToggleProperties featureToggleProperties; public Statistic getVorgaengeStatistic() { var response = remoteService.getVorgaengeStatistics(getCountByVorgangStatusList()); @@ -56,7 +57,7 @@ class StatisticService { List<VorgangStatus> getCountByVorgangStatusList() { if (currentUserService.hasRole(UserRole.VERWALTUNG_USER)) { - return COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER; + return getVerwaltungUserStatuses(); } if (currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)) { return COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER; @@ -80,6 +81,7 @@ class StatisticService { .verworfen(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.VERWORFEN))) .inBearbeitung(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.IN_BEARBEITUNG))) .zuLoeschen(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.ZU_LOESCHEN))) + .weitergeleitet(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.WEITERGELEITET))) .build()) .build(); } @@ -91,4 +93,10 @@ class StatisticService { private boolean getBooleanResult(Map<String, StatisticResult> response, String resultName) { return Optional.ofNullable(response.get(resultName)).map(StatisticResult::getBoolValue).orElse(false); } + + List<VorgangStatus> getVerwaltungUserStatuses() { + return COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER.stream() + .filter(status -> status != VorgangStatus.WEITERGELEITET || featureToggleProperties.isForwardByOzgCloudEnabled()) + .toList(); + } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/LinkTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/LinkTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..011dd9db09c4aa8690dee42d024244373bebf9b5 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/LinkTestFactory.java @@ -0,0 +1,19 @@ +package de.ozgcloud.alfa; + +import java.util.List; +import java.util.stream.Stream; + +import org.springframework.hateoas.Link; + +import com.thedeanda.lorem.LoremIpsum; + +public class LinkTestFactory { + + public static Link create() { + return Link.of(LoremIpsum.getInstance().getUrl()); + } + + public static List<Link> createList(int size) { + return Stream.iterate(0, i -> i + 1).limit(size).map(i -> create()).toList(); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java index 6f0e2b655828b4283ba6947fbc81dedeb0783ffd..02d0843e8e8ebdd8673b51a9205435e1c09e1ca4 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java @@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.List; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; @@ -36,6 +37,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.EnumSource.Mode; +import org.mockito.AdditionalAnswers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -45,6 +47,7 @@ import org.springframework.hateoas.LinkRelation; import com.thedeanda.lorem.LoremIpsum; +import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; @@ -61,6 +64,8 @@ class RootViewLinkHandlerTest { private CurrentUserService currentUserService; @Mock private SystemStatusService systemStatusService; + @Mock + private FeatureToggleProperties featureToggleProperties; @DisplayName("Add view links") @Nested @@ -211,7 +216,7 @@ class RootViewLinkHandlerTest { } @Test - void shouldCallAddVorgangStatusLinks() { + void shouldCallAddAllVorgangStatusLinks() { viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID)); verify(viewLinkHandler).addAllVorgangStatusLinks(model); @@ -433,29 +438,76 @@ class RootViewLinkHandlerTest { class TestBuildVorgangStatusLinks { private final UserId userId = UserProfileTestFactory.ID; + private final List<VorgangStatus> statuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN); + + @BeforeEach + void mock() { + doReturn(statuses.stream()).when(viewLinkHandler).getVorgangStatuses(); + } @Test - void shouldCallBuildVorgangListByPageLink() { + void shouldCallGetVorgangStatuses() { viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID); - verify(viewLinkHandler, times(7)).buildGetAllVorgaengeByAssignedToAndStatus( - any(VorgangStatus.class), - eq(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE), - eq(userId)); + verify(viewLinkHandler).getVorgangStatuses(); } @Test - void shouldCallFormatLinkRelTemplate() { + void shouldCallBuildVorgangListByPageLink() { viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID); - verify(viewLinkHandler, times(7)).formatLinkRelTemplate(eq(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE), any(VorgangStatus.class)); + statuses.forEach(status -> verify(viewLinkHandler).buildGetAllVorgaengeByAssignedToAndStatus(status, + RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, userId)); } @Test - void shouldBuildLinks() { + void shouldReturnLinks() { + var expectedLinks = LinkTestFactory.createList(statuses.size()); + doAnswer(AdditionalAnswers.returnsElementsOf(expectedLinks)).when(viewLinkHandler).buildGetAllVorgaengeByAssignedToAndStatus(any(), + any(), any()); + var links = viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID); - assertThat(links).hasSize(7); + assertThat(links).containsExactlyInAnyOrderElementsOf(expectedLinks); + } + } + + @DisplayName("build get all vorgaenge by assignedTo and status") + @Nested + class TestBuildGetAllVorgaengeByAssignedToAndStatus { + + @ParameterizedTest + @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", + "ZU_LOESCHEN", "WEITERGELEITET" }) + void shouldCallFormatLinkRelTemplate(VorgangStatus status) { + viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, + UserProfileTestFactory.ID); + + verify(viewLinkHandler).formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, status); + } + + @ParameterizedTest + @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", + "ZU_LOESCHEN", "WEITERGELEITET" }) + void shouldAddByAssignedToAndStatus(VorgangStatus status) { + var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, + UserProfileTestFactory.ID); + + assertThat(link.getHref()).isEqualTo( + "/api/vorgangs?page=0&limit=100&assignedTo=" + UserProfileTestFactory.ID.toString() + "&status=" + status.toString()); + } + + @ParameterizedTest + @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", + "ZU_LOESCHEN", "WEITERGELEITET" }) + void shouldHaveFormattedRelation(VorgangStatus status) { + var expectedRelation = LoremIpsum.getInstance().getWords(1); + doReturn(expectedRelation).when(viewLinkHandler).formatLinkRelTemplate(any(), any()); + + var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, + UserProfileTestFactory.ID); + + assertThat(link.getRel()).isEqualTo(LinkRelation.of(expectedRelation)); } } @@ -465,7 +517,7 @@ class RootViewLinkHandlerTest { @ParameterizedTest @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", - "ZU_LOESCHEN" }) + "ZU_LOESCHEN", "WEITERGELEITET" }) void shouldCallFormatLinkRelTemplateWithAllVorgaengeTemplate(VorgangStatus status) { var linkRel = viewLinkHandler.formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, status); @@ -474,7 +526,7 @@ class RootViewLinkHandlerTest { @ParameterizedTest @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", - "ZU_LOESCHEN" }) + "ZU_LOESCHEN", "WEITERGELEITET" }) void shouldCallFormatLinkRelTemplateWithMyVorgaengeTemplate(VorgangStatus status) { var linkRel = viewLinkHandler.formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, status); @@ -483,7 +535,7 @@ class RootViewLinkHandlerTest { @ParameterizedTest @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", - "ZU_LOESCHEN" }) + "ZU_LOESCHEN", "WEITERGELEITET" }) void shouldCallFormatLinkRelTemplateWithUnassignedVorgaengeTemplate(VorgangStatus status) { var linkRel = viewLinkHandler.formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_UNASSIGNED_REL_TEMPLATE, status); @@ -493,33 +545,38 @@ class RootViewLinkHandlerTest { @DisplayName("build get all vorgaenge by status") @Nested - class TestBuildGetAllByStatus { + class TestBuildGetAllVorgaengeByStatus { @ParameterizedTest @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", - "ZU_LOESCHEN" }) + "ZU_LOESCHEN", "WEITERGELEITET" }) void shouldAddByStatus(VorgangStatus status) { var link = viewLinkHandler.buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE); assertThat(link.getHref()).isEqualTo("/api/vorgangs?page=0&limit=100&status=" + status.toString()); } - } + @ParameterizedTest + @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", + "ZU_LOESCHEN", "WEITERGELEITET" }) + void shouldCallFormatLinkRelTemplate(VorgangStatus status) { + viewLinkHandler.buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE); - @DisplayName("build get all vorgaenge by assignedTo and status") - @Nested - class TestBuildGetAllVorgaengeByAssignedToAndStatus { + verify(viewLinkHandler).formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, status); + } @ParameterizedTest @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", - "ZU_LOESCHEN" }) - void shouldAddByAssignedToAndStatus(VorgangStatus status) { - var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, - UserProfileTestFactory.ID); + "ZU_LOESCHEN", "WEITERGELEITET" }) + void shouldHaveFormattedRelation(VorgangStatus status) { + var expectedRelation = LoremIpsum.getInstance().getWords(1); + doReturn(expectedRelation).when(viewLinkHandler).formatLinkRelTemplate(any(), any()); - assertThat(link.getHref()).isEqualTo( - "/api/vorgangs?page=0&limit=100&assignedTo=" + UserProfileTestFactory.ID.toString() + "&status=" + status.toString()); + var link = viewLinkHandler.buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE); + + assertThat(link.getRel()).isEqualTo(LinkRelation.of(expectedRelation)); } + } @DisplayName("build get all unassigned vorgaenge by status") @@ -528,7 +585,7 @@ class RootViewLinkHandlerTest { @ParameterizedTest @EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN", - "ZU_LOESCHEN" }) + "ZU_LOESCHEN", "WEITERGELEITET" }) void shouldAddByUnassignedToAndStatus(VorgangStatus status) { var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, UserId.empty()); @@ -706,4 +763,90 @@ class RootViewLinkHandlerTest { } } + + @Nested + class TestAddVorgangStatusLinks { + + private final EntityModel<Root> model = EntityModel.of(RootTestFactory.create()); + private final List<VorgangStatus> vorgangStatuses = List.of(VorgangStatus.NEU, VorgangStatus.BESCHIEDEN); + private final List<Link> links = LinkTestFactory.createList(vorgangStatuses.size()); + + @BeforeEach + void mock() { + doReturn(vorgangStatuses.stream()).when(viewLinkHandler).getVorgangStatuses(); + doAnswer(AdditionalAnswers.returnsElementsOf(links)).when(viewLinkHandler).buildGetAllVorgaengeByStatus(any(), any()); + } + + @Test + void shouldCallGetVorgangStatuses() { + viewLinkHandler.addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE); + + verify(viewLinkHandler).getVorgangStatuses(); + } + + @Test + void shouldCallBuildGetAllVorgaengeByStatus() { + viewLinkHandler.addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE); + + vorgangStatuses + .forEach(status -> verify(viewLinkHandler).buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE)); + } + + @Test + void shouldAddLinksToModel() { + viewLinkHandler.addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE); + + assertThat(model.getLinks()).containsExactlyInAnyOrderElementsOf(links); + } + } + + @Nested + class TestGetVorgangStatuses { + + @Test + void shouldCallFeatureToggleProperties() { + viewLinkHandler.getVorgangStatuses().toList(); + + verify(featureToggleProperties).isForwardByOzgCloudEnabled(); + } + + @Nested + class TestOnIsForwardByOzgCloudEnabled { + + @BeforeEach + void mock() { + when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(true); + } + + @Test + void shouldReturnStream() { + var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, + VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, + VorgangStatus.WEITERGELEITET); + + var stream = viewLinkHandler.getVorgangStatuses(); + + assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses); + } + } + + @Nested + class TestOnIsNotForwardByOzgCloudEnabled { + + @BeforeEach + void mock() { + when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(false); + } + + @Test + void shouldReturnStream() { + var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, + VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN); + + var stream = viewLinkHandler.getVorgangStatuses(); + + assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses); + } + } + } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java index 61204730a5b571ba703774b95289d9e18a67ff7c..58ef88e6ca343dbdb02a510919ccb304058def9e 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java @@ -24,12 +24,12 @@ package de.ozgcloud.alfa.statistic; import static de.ozgcloud.alfa.statistic.StatisticRemoteService.*; -import static de.ozgcloud.alfa.statistic.StatisticService.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Collections; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -39,6 +39,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; @@ -52,6 +53,8 @@ class StatisticServiceTest { private StatisticRemoteService remoteService; @Mock private CurrentUserService currentUserService; + @Mock + private FeatureToggleProperties featureToggleProperties; @Nested class TestBuildGetVorgaengeStatisticResult { @@ -155,6 +158,15 @@ class StatisticServiceTest { assertThat(statistic.getByStatus().getZuLoeschen()).isEqualTo(StatisticResultTestFactory.INT_VALUE); } + @Test + void shouldContainCountByStatusWeitergeleitet() { + var statistic = service.buildGetVorgaengeStatisticResult(Map.of( + String.format(COUNT_VORGANG_STATUS_RESULT_NAME_FORMAT, VorgangStatus.WEITERGELEITET.name()), + StatisticResultTestFactory.create())); + + assertThat(statistic.getByStatus().getWeitergeleitet()).isEqualTo(StatisticResultTestFactory.INT_VALUE); + } + @Test void shouldContainDefaultCountByStatus() { var statistic = service.buildGetVorgaengeStatisticResult(Map.of()); @@ -174,13 +186,25 @@ class StatisticServiceTest { @Nested class TestGetCountByVorgangStatusList { + private static final List<VorgangStatus> VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN); + + @Test + void shouldCallGetVerwaltungUserStatuses() { + when(currentUserService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true); + + service.getCountByVorgangStatusList(); + + verify(service).getVerwaltungUserStatuses(); + } + @Test - void shouldGetForVerwalungUser() { + void shouldReturnVerwaltungUserStatuses() { when(currentUserService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true); + doReturn(VORGANG_STATUS_VERWALTUNG_USER).when(service).getVerwaltungUserStatuses(); var result = service.getCountByVorgangStatusList(); - assertThat(result).containsAll(COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER); + assertThat(result).containsAll(VORGANG_STATUS_VERWALTUNG_USER); } @Test @@ -190,7 +214,7 @@ class StatisticServiceTest { var result = service.getCountByVorgangStatusList(); - assertThat(result).containsAll(COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER); + assertThat(result).containsAll(Collections.emptyList()); } @Test @@ -201,7 +225,7 @@ class StatisticServiceTest { var result = service.getCountByVorgangStatusList(); - assertThat(result).containsAll(COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER); + assertThat(result).containsAll(Collections.emptyList()); } @Test @@ -222,6 +246,7 @@ class StatisticServiceTest { private final Statistic statistic = StatisticTestFactory.create(); private final Map<String, StatisticResult> getVorgangStatisticsResponse = Map.of(COUNT_WIEDERVORLAGE_NEXT_FRIST_RESULT_NAME, StatisticResultTestFactory.create()); + private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU); @BeforeEach void beforeEach() { @@ -258,4 +283,54 @@ class StatisticServiceTest { assertThat(result).isEqualTo(statistic); } } + + @Nested + class TestGetVorgangStatuses { + + @Test + void shouldCallFeatureToggleProperties() { + service.getVerwaltungUserStatuses(); + + verify(featureToggleProperties).isForwardByOzgCloudEnabled(); + } + + @Nested + class TestOnIsForwardByOzgCloudEnabled { + + @BeforeEach + void mock() { + when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(true); + } + + @Test + void shouldReturnStream() { + var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, + VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, + VorgangStatus.WEITERGELEITET); + + var stream = service.getVerwaltungUserStatuses(); + + assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses); + } + } + + @Nested + class TestOnIsNotForwardByOzgCloudEnabled { + + @BeforeEach + void mock() { + when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(false); + } + + @Test + void shouldReturnStream() { + var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, + VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN); + + var stream = service.getVerwaltungUserStatuses(); + + assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses); + } + } + } }