diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java index 6f38ff76d04e3afe1293373e69b3f29e3c105ed2..4254b7063b982f1c3f201fa5fa6d9597efffb0ce 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessor.java @@ -34,24 +34,28 @@ class ForwardingVorgangWithEingangProcessor implements RepresentationModelProces Optional.ofNullable(model.getContent()) .ifPresent(vorgang -> model .addIf(isForwardableByOzgCloud(vorgang), () -> buildForwardByOzgCloudLink(vorgang)) - .addIf(isEinheitlicherAnsprechpartner(), () -> buildForwardByEmailLink(vorgang))); + .addIf(isForwardableByEmail(), () -> buildForwardByEmailLink(vorgang))); return model; } boolean isForwardableByOzgCloud(VorgangWithEingang vorgang) { - return featureToggleProperties.isForwardByOzgCloudEnabled() && isStatusNeu(vorgang); + return featureToggleProperties.isForwardByOzgCloudEnabled() && isStatusNeu(vorgang) && isNotPoststelleOrEinheitlicherAnsprechpartner(); } private boolean isStatusNeu(VorgangWithEingang vorgang) { return vorgang.getStatus() == VorgangStatus.NEU; } + boolean isNotPoststelleOrEinheitlicherAnsprechpartner() { + return userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE) || userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER); + } + private Link buildForwardByOzgCloudLink(VorgangWithEingang vorgang) { return linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), null)).withRel(REL_FORWARD_BY_OZGCLOUD); } - private boolean isEinheitlicherAnsprechpartner() { + boolean isForwardableByEmail() { return userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java index 3525396016c13693149efd8277945c7252ec7150..f0253bb135352b2a54d5994f505af2f29e421a9b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardingVorgangWithEingangProcessorTest.java @@ -5,12 +5,12 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; 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.junit.jupiter.params.provider.EnumSource.Mode; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -22,7 +22,6 @@ import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserRole; -import de.ozgcloud.alfa.vorgang.Vorgang; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -42,6 +41,8 @@ class ForwardingVorgangWithEingangProcessorTest { @Nested class TestProcess { + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + @Test void shouldReturnSameModelOnEmptyEntity() { EntityModel<VorgangWithEingang> inputModel = when(mock(EntityModel.class).getContent()).thenReturn(null).getMock(); @@ -53,7 +54,7 @@ class ForwardingVorgangWithEingangProcessorTest { @Test void shouldReturnSameModel() { - var inputModel = EntityModel.of(VorgangWithEingangTestFactory.create()); + var inputModel = EntityModel.of(vorgang); var model = processor.process(inputModel); @@ -63,10 +64,10 @@ class ForwardingVorgangWithEingangProcessorTest { @Nested class TestForwardByOzgCloudLink { - private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - @Test void shouldCallIsForwardableByOzgCloud() { + doReturn(false).when(processor).isForwardableByOzgCloud(any()); + processor.process(EntityModel.of(vorgang)); verify(processor).isForwardableByOzgCloud(vorgang); @@ -74,6 +75,7 @@ class ForwardingVorgangWithEingangProcessorTest { @Nested class TestOnIsNotForwardableByOzgCloud { + @BeforeEach void givenIsNotForwardableByOzgCloud() { doReturn(false).when(processor).isForwardableByOzgCloud(any()); @@ -89,6 +91,7 @@ class ForwardingVorgangWithEingangProcessorTest { @Nested class TestOnIsForwardableByOzgCloud { + @BeforeEach void givenIsNotForwardableByOzgCloud() { doReturn(true).when(processor).isForwardableByOzgCloud(any()); @@ -109,40 +112,52 @@ class ForwardingVorgangWithEingangProcessorTest { } @Nested - class TestForwardingLink { + class TestForwardByEmailLink { - @DisplayName("should NOT be present in other Role then EA") - @ParameterizedTest - @EnumSource - void shouldNotBePresentWithoutRole(Vorgang.VorgangStatus status) { - when(userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER)).thenReturn(false); + @Test + void shouldCallIsForwardableByEmail() { + doReturn(false).when(processor).isForwardableByEmail(); - var link = processor.process(buildVorgangInStatus(status)).getLink(ForwardingVorgangWithEingangProcessor.REL_FORWARD_BY_EMAIL); + processor.process(EntityModel.of(vorgang)); - assertThat(link).isEmpty(); + verify(processor).isForwardableByEmail(); } - @DisplayName("with role EinheitlicherAnsprechpartner") @Nested - class TestWithRoleEinheitlicherAnsprechpartner { + class TestOnIsNotForwardableByEmail { + @BeforeEach - void init() { - when(userService.hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER)).thenReturn(true); + void givenIsNotForwardableByEmail() { + doReturn(false).when(processor).isForwardableByEmail(); } - @DisplayName("should be present in any Status") - @ParameterizedTest - @EnumSource() - void shouldBePresent(VorgangStatus status) { - var link = processor.process(buildVorgangInStatus(status)).getLink(ForwardingVorgangWithEingangProcessor.REL_FORWARD_BY_EMAIL); + @Test + void shouldNotAddLink() { + var model = processor.process(EntityModel.of(vorgang)); - assertThat(link).isPresent().get().extracting(Link::getHref) - .isEqualTo("/api/forwardings?vorgangId=" + VorgangHeaderTestFactory.ID); + assertThat(model.getLink(ForwardingVorgangWithEingangProcessor.REL_FORWARD_BY_EMAIL)).isEmpty(); } } - private EntityModel<VorgangWithEingang> buildVorgangInStatus(VorgangStatus status) { - return EntityModel.of(VorgangWithEingangTestFactory.createBuilder().status(status).build()); + @Nested + class TestOnIsForwardableByEmail { + + @BeforeEach + void givenIsForwardableByEmail() { + doReturn(true).when(processor).isForwardableByEmail(); + } + + @Test + void shouldAddLink() { + var expectedHref = UriComponentsBuilder.fromUriString(ForwardingController.LIST_PATH) + .queryParam(ForwardingController.PARAM_VORGANG_ID, VorgangHeaderTestFactory.ID).build().toString(); + + var model = processor.process(EntityModel.of(vorgang)); + + assertThat(model.getLink(ForwardingVorgangWithEingangProcessor.REL_FORWARD_BY_EMAIL)).get() + .extracting(Link::getHref) + .isEqualTo(expectedHref); + } } } } @@ -167,6 +182,16 @@ class ForwardingVorgangWithEingangProcessorTest { assertThat(forwardableByOzgCloud).isFalse(); } + + @ParameterizedTest + @EnumSource + void shouldNotCallIsNotPoststelleOrEinheitlicherAnsprechpartner(VorgangStatus status) { + var vorgang = VorgangWithEingangTestFactory.createBuilder().status(status).build(); + + processor.isForwardableByOzgCloud(vorgang); + + verify(processor, never()).isNotPoststelleOrEinheitlicherAnsprechpartner(); + } } @Nested @@ -177,24 +202,109 @@ class ForwardingVorgangWithEingangProcessorTest { when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(true); } - @ParameterizedTest - @EnumSource(mode = Mode.EXCLUDE, names = { "NEU" }) - void shouldReturnFalseOnVorgangStatusNotNeu(VorgangStatus status) { - var vorgang = VorgangWithEingangTestFactory.createBuilder().status(status).build(); + @Nested + class TestOnVorgangNotNeu { + @ParameterizedTest + @EnumSource(mode = Mode.EXCLUDE, names = { "NEU" }) + void shouldReturnFalseOnVorgangStatusNotNeu(VorgangStatus status) { + var vorgang = VorgangWithEingangTestFactory.createBuilder().status(status).build(); - var forwardableByOzgCloud = processor.isForwardableByOzgCloud(vorgang); + var forwardableByOzgCloud = processor.isForwardableByOzgCloud(vorgang); - assertThat(forwardableByOzgCloud).isFalse(); + assertThat(forwardableByOzgCloud).isFalse(); + } + + @ParameterizedTest + @EnumSource(mode = Mode.EXCLUDE, names = { "NEU" }) + void shouldNotCallIsNotPoststelleOrEinheitlicherAnsprechpartner(VorgangStatus status) { + var vorgang = VorgangWithEingangTestFactory.createBuilder().status(status).build(); + + processor.isForwardableByOzgCloud(vorgang); + + verify(processor, never()).isNotPoststelleOrEinheitlicherAnsprechpartner(); + } } - @Test - void shouldReturnTrueOnVorgangStatusNeu() { - var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.NEU).build(); + @Nested + class TestOnVorgangIsNeu { - var forwardableByOzgCloud = processor.isForwardableByOzgCloud(vorgang); + private final VorgangWithEingang newVorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.NEU).build(); - assertThat(forwardableByOzgCloud).isTrue(); + @Test + void shouldCallIsNotPoststelleOrEinheitlicherAnsprechpartner() { + processor.isForwardableByOzgCloud(newVorgang); + + verify(processor).isNotPoststelleOrEinheitlicherAnsprechpartner(); + } + + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldReturnValueOfisNotPoststelleOrEinheitlicherAnsprechpartner(boolean isNotPoststelleOrEinheitlicherAnsprechpartner) { + doReturn(isNotPoststelleOrEinheitlicherAnsprechpartner).when(processor).isNotPoststelleOrEinheitlicherAnsprechpartner(); + + var forwardableByOzgCloud = processor.isForwardableByOzgCloud(newVorgang); + + assertThat(forwardableByOzgCloud).isEqualTo(isNotPoststelleOrEinheitlicherAnsprechpartner); + } } } } + + @Nested + class TestIsNotPoststelleOrEinheitlicherAnsprechpartner { + + private static final String UNKOWN_ROLE = "UNKOWN_ROLE"; + + @BeforeEach + void mock() { + when(userService.hasRole(any())).thenAnswer(invocation -> { + var role = invocation.getArgument(0, String.class); + return role == UserRole.EINHEITLICHER_ANSPRECHPARTNER || role == UserRole.VERWALTUNG_POSTSTELLE; + }); + } + + @Test + void shouldCallUserServiceForCurrentRole() { + processor.isForwardableByEmail(); + + verify(userService).hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER); + } + + @ParameterizedTest + @ValueSource(strings = { UserRole.EINHEITLICHER_ANSPRECHPARTNER, UserRole.VERWALTUNG_POSTSTELLE }) + void shouldReturnFalse(String role) { + var isNotPoststelleOrEinheitlicherAnsprechpartner = processor.isNotPoststelleOrEinheitlicherAnsprechpartner(); + + assertThat(isNotPoststelleOrEinheitlicherAnsprechpartner).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = { UserRole.VERWALTUNG_LOESCHEN, UserRole.VERWALTUNG_USER, UNKOWN_ROLE }) + void shouldReturnTrue(String role) { + var isNotPoststelleOrEinheitlicherAnsprechpartner = processor.isNotPoststelleOrEinheitlicherAnsprechpartner(); + + assertThat(isNotPoststelleOrEinheitlicherAnsprechpartner).isTrue(); + } + } + + @Nested + class TestIsForwardableByEmail { + + @Test + void shouldCallUserServiceForCurrentRole() { + processor.isForwardableByEmail(); + + verify(userService).hasRole(UserRole.EINHEITLICHER_ANSPRECHPARTNER); + } + + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldReturnIsEinheitlicherAnsprechpartner(boolean isEinheitlicherAnsprechpartner) { + when(userService.hasRole(any())).thenReturn(isEinheitlicherAnsprechpartner); + + var isForwardableByEmail = processor.isForwardableByEmail(); + + assertThat(isForwardableByEmail).isEqualTo(isEinheitlicherAnsprechpartner); + } + } }