diff --git a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts index b20cea9b1d2b31d36db3535b7526a8032f1b88ed..c9ea833a1b6086cabc8286b7821531d0b8aac9bb 100644 --- a/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts +++ b/alfa-client/apps/alfa-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts @@ -158,6 +158,8 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { waitforSpinnerToAppear(); waitForSpinnerToDisappear(); + wait(1000, 'Wait for async BE to complete'); + containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); contains( snackBar.getMessage(), @@ -199,6 +201,8 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { waitforSpinnerToAppear(); waitForSpinnerToDisappear(); + wait(1000, 'Wait for async BE to complete'); + notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); contains( snackBar.getMessage(), @@ -229,6 +233,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { const locatorIconDefault: string = 'wiedervorlage-icon-default'; it('back to vorgang list', () => { + wait(1000, 'Wait for async BE to complete'); vorgangPage.getSubnavigation().getBackButton().click(); waitForSpinnerToDisappear(); }); @@ -249,6 +254,8 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { subnavigation.erledigen(); waitForSpinnerToDisappear(); + wait(1000, 'Wait for async BE to complete'); + subnavigation.navigateBack(); waitForSpinnerToDisappear(); }); diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java index 1a5d2ac5fda7dc714f9f2b13514dc22705159219..9e862c4756eb06bfa8aa47591b7d390de442d865 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/Command.java @@ -26,8 +26,6 @@ package de.ozgcloud.alfa.common.command; import java.time.ZonedDateTime; import java.util.Map; -import org.apache.commons.lang3.StringUtils; - import com.fasterxml.jackson.annotation.JsonIgnore; import de.ozgcloud.alfa.common.LinkedUserProfileResource; @@ -76,14 +74,4 @@ public class Command { public CommandOrder getCommandOrder() { return CommandOrder.fromOrder(order); } - - @JsonIgnore - public boolean isFinishedSuccessfully() { - return status == CommandStatus.FINISHED && StringUtils.isEmpty(errorMessage); - } - - @JsonIgnore - public boolean isNotDone() { - return status.isNotDone(); - } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java index da98c4e572fda1d5c7175040bd88eace508555f6..dc573993c67ac660e97502ae4087e66d43ed3928 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java @@ -23,7 +23,6 @@ */ package de.ozgcloud.alfa.common.command; -import java.util.Calendar; import java.util.Optional; import java.util.stream.Stream; @@ -43,8 +42,6 @@ import lombok.RequiredArgsConstructor; public class CommandService { static final long NO_RELATION_VERSION = -1; - private static final int WAIT_TIME_MS = 500; - private static final int COMMAND_REQUEST_THRESHOLD_MILLIS = 10000; private final CommandRemoteService remoteService; @@ -114,25 +111,4 @@ public class CommandService { return remoteService.findCommands(vorgangId, Optional.of(CommandStatus.FINISHED), Optional.empty()); } - public Command waitUntilDone(Command commandToWaitFor) { - var command = commandToWaitFor; - var calendar = Calendar.getInstance(); - var timeout = calendar.getTimeInMillis() + COMMAND_REQUEST_THRESHOLD_MILLIS; - while (command.isNotDone() && calendar.getTimeInMillis() < timeout) { - synchronized (this) { - try { - wait(WAIT_TIME_MS); - command = reloadCommand(command.getId()); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } - return command; - } - - public Command reloadCommand(String commandId) { - return remoteService.getCommand(commandId); - } - } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java index 548107b825bca6aaed64a50f6f24611c9d7a8174..285ebdaae3817652aa5c80b1d9817628fd044e6c 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandStatus.java @@ -23,14 +23,6 @@ */ package de.ozgcloud.alfa.common.command; -import java.util.Set; - public enum CommandStatus { PENDING, FINISHED, ERROR, REVOKE_PENDING, REVOKED; - - private static final Set<CommandStatus> FINAL_STATES = Set.of(FINISHED, ERROR, REVOKED); - - public boolean isNotDone() { - return !FINAL_STATES.contains(this); - } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java index 2cc413979da3622e47fc9d0d5677b804f001cf23..7f068905ec5b2f0c464fe677dc4cfa10634847c2 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandController.java @@ -53,23 +53,26 @@ public class WiedervorlageCommandController { @PathVariable long wiedervorlageVersion) { var wiedervorlage = service.getById(wiedervorlageId); var createdCommand = createCommand(wiedervorlage, command); - var doneCommand = service.updateNextFrist(createdCommand, wiedervorlage.getVorgangId()); - return ResponseEntity.created(linkTo(CommandController.class).slash(doneCommand.getId()).toUri()).build(); + return ResponseEntity.created(linkTo(CommandController.class).slash(createdCommand.getId()).toUri()).build(); } Command createCommand(Wiedervorlage wiedervorlage, CreateCommand command) { switch (command.getOrder()) { case LegacyOrder.WIEDERVORLAGE_ERLEDIGEN: { - return service.erledigen(wiedervorlage); + var changed = wiedervorlage.toBuilder().done(true).build(); + service.updateNextFrist(wiedervorlage.getVorgangId(), changed); + return service.erledigen(changed); } case LegacyOrder.WIEDERVORLAGE_WIEDEREROEFFNEN: { - return service.wiedereroeffnen(wiedervorlage); + var changed = wiedervorlage.toBuilder().done(false).build(); + service.updateNextFrist(wiedervorlage.getVorgangId(), changed); + return service.wiedereroeffnen(changed); } case LegacyOrder.EDIT_WIEDERVORLAGE: { - return service.editWiedervorlage(updateWiedervorlageByCommand(wiedervorlage, (Wiedervorlage) command.getBody()), - wiedervorlage.getId(), - wiedervorlage.getVersion()); + var changed = updateWiedervorlageByCommand(wiedervorlage, (Wiedervorlage) command.getBody()); + service.updateNextFrist(wiedervorlage.getVorgangId(), changed); + return service.editWiedervorlage(changed, wiedervorlage.getId(), wiedervorlage.getVersion()); } default: throw new TechnicalException("Unsupported order " + command.getOrder()); @@ -95,10 +98,12 @@ public class WiedervorlageCommandController { @PostMapping public ResponseEntity<Void> createWiedervorlage(@RequestBody CreateCommand command, @PathVariable String vorgangId) { - var createdCommand = service.createWiedervorlage((Wiedervorlage) command.getBody(), vorgangId); - var doneCommand = service.updateNextFrist(createdCommand, createdCommand.getVorgangId()); + var wiedervorlage = (Wiedervorlage) command.getBody(); + var createdCommand = service.createWiedervorlage(wiedervorlage, vorgangId); - return ResponseEntity.created(linkTo(CommandController.class).slash(doneCommand.getId()).toUri()).build(); + service.updateNextFrist(vorgangId, wiedervorlage); + + return ResponseEntity.created(linkTo(CommandController.class).slash(createdCommand.getId()).toUri()).build(); } } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java index 28f4795c3695c12aa76981ebcb01c2f807fbbbde..c61984151d2b6dd72de917a16391c28aedad325c 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java @@ -33,12 +33,12 @@ import java.util.stream.Stream; import jakarta.validation.Valid; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService; import de.ozgcloud.alfa.common.command.Command; -import de.ozgcloud.alfa.common.command.CommandService; import de.ozgcloud.alfa.common.user.CurrentUserService; import lombok.RequiredArgsConstructor; @@ -52,7 +52,6 @@ class WiedervorlageService { private final WiedervorlageRemoteService remoteService; private final VorgangAttachedItemService vorgangAttachedItemService; private final CurrentUserService currentUserService; - private final CommandService commandService; public Command createWiedervorlage(@Valid Wiedervorlage wiedervorlage, String vorgangId) { return vorgangAttachedItemService.createNewWiedervorlage(addCreated(wiedervorlage), vorgangId); @@ -73,18 +72,14 @@ class WiedervorlageService { return remoteService.getById(wiedervorlageId); } - public Command updateNextFrist(Command command, String vorgangId) { - var doneCommand = commandService.waitUntilDone(command); - if (doneCommand.isFinishedSuccessfully()) { - doUpdateNextFrist(vorgangId); - } - return doneCommand; - } - - void doUpdateNextFrist(String vorgangId) { - var allWiedervorlagen = findByVorgangId(vorgangId); + @Async + public void updateNextFrist(String vorgangId, Wiedervorlage changedOrNewWiedervorlage) { + var persistedWiedervorlagen = findByVorgangId(vorgangId); + var persistedWiedervorlagenExcludingChanged = persistedWiedervorlagen.filter( + wiedervorlage -> !wiedervorlage.getId().equals(changedOrNewWiedervorlage.getId())); - remoteService.updateNextFrist(vorgangId, calculateNextFrist(allWiedervorlagen)); + var wiedervorlagen = Stream.concat(persistedWiedervorlagenExcludingChanged, Stream.of(changedOrNewWiedervorlage)); + remoteService.updateNextFrist(vorgangId, calculateNextFrist(wiedervorlagen)); } Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) { @@ -100,11 +95,11 @@ class WiedervorlageService { return remoteService.findByVorgangId(vorgangId); } - Command erledigen(Wiedervorlage wiedervorlage) { + public Command erledigen(Wiedervorlage wiedervorlage) { return vorgangAttachedItemService.setWiedervorlageDone(wiedervorlage, true); } - Command wiedereroeffnen(Wiedervorlage wiedervorlage) { + public Command wiedereroeffnen(Wiedervorlage wiedervorlage) { return vorgangAttachedItemService.setWiedervorlageDone(wiedervorlage, false); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java index 2bf962ce6cb343babed90d058cbe4549f6acb1b5..95b37ba1901cbd62a954642ee61d4daf09fe4954 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandServiceTest.java @@ -27,7 +27,6 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.util.Calendar; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -40,7 +39,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockedStatic; import org.mockito.Spy; import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung; @@ -299,99 +297,4 @@ class CommandServiceTest { verify(remoteService).findCommands(VorgangHeaderTestFactory.ID, Optional.of(CommandStatus.FINISHED), Optional.empty()); } } - - @Nested - class TestWaitUntilDone { - - private final Command pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); - private final Command finishedCommand = pendingCommand.toBuilder().status(CommandStatus.FINISHED).build(); - - @Nested - class OnFinishedCommand { - - @Test - void shouldReturnFinishedCommand() { - var resultCommand = service.waitUntilDone(finishedCommand); - - assertThat(resultCommand).isEqualTo(finishedCommand); - } - - @Test - void shouldNotReloadCommand() { - service.waitUntilDone(finishedCommand); - - verify(service, never()).reloadCommand(any()); - } - } - - @Nested - class OnPendingCommand { - - @BeforeEach - void setUp() { - doReturn(finishedCommand).when(service).reloadCommand(pendingCommand.getId()); - } - - @Test - void shouldReloadCommand() { - service.waitUntilDone(pendingCommand); - - verify(service).reloadCommand(pendingCommand.getId()); - } - - @Test - void shouldReturnDoneCommand() { - var resultCommand = service.waitUntilDone(pendingCommand); - - assertThat(resultCommand).isEqualTo(finishedCommand); - } - } - - @Nested - class OnTimeoutExceeded { - - @Mock - private Calendar calendar; - - @Test - void shouldReturnPendingCommand() { - try (MockedStatic<Calendar> calendarMockedStatic = mockStatic(Calendar.class)) { - calendarMockedStatic.when(Calendar::getInstance).thenReturn(calendar); - when(calendar.getTimeInMillis()).thenReturn(0L, 15000L); - - var resultCommand = service.waitUntilDone(pendingCommand); - - assertThat(resultCommand).isEqualTo(pendingCommand); - } - } - - @Test - void shouldReloadPendingCommand() { - doReturn(pendingCommand).when(service).reloadCommand(pendingCommand.getId()); - - try (MockedStatic<Calendar> calendarMockedStatic = mockStatic(Calendar.class)) { - calendarMockedStatic.when(Calendar::getInstance).thenReturn(calendar); - when(calendar.getTimeInMillis()).thenReturn(0L, 0L, 15000L); - - service.waitUntilDone(pendingCommand); - - verify(service).reloadCommand(pendingCommand.getId()); - } - } - - @Test - void shouldReturnPendingCommandAfterReload() { - doReturn(pendingCommand).when(service).reloadCommand(pendingCommand.getId()); - - try (MockedStatic<Calendar> calendarMockedStatic = mockStatic(Calendar.class)) { - calendarMockedStatic.when(Calendar::getInstance).thenReturn(calendar); - when(calendar.getTimeInMillis()).thenReturn(0L, 0L, 15000L); - - var resultCommand = service.waitUntilDone(pendingCommand); - - assertThat(resultCommand).isEqualTo(pendingCommand); - } - } - } - } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandStatusTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandStatusTest.java deleted file mode 100644 index f91dc7028af4ca954d1dfc9fae1e70affbdcc066..0000000000000000000000000000000000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandStatusTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.ozgcloud.alfa.common.command; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.EnumSource.Mode; - -class CommandStatusTest { - - @Nested - class TestIsNotDone { - - @ParameterizedTest - @EnumSource(names = { "PENDING", "REVOKE_PENDING" }) - void shouldReturnTrue(CommandStatus status) { - var istNotDone = status.isNotDone(); - - assertThat(istNotDone).isTrue(); - - } - - @ParameterizedTest - @EnumSource(names = { "PENDING", "REVOKE_PENDING" }, mode = Mode.EXCLUDE) - void shouldReturnFalse(CommandStatus status) { - var istNotDone = status.isNotDone(); - - assertThat(istNotDone).isFalse(); - } - - } - -} \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandTest.java deleted file mode 100644 index c838d402226703a6133dc5f8a65b79e7d911373e..0000000000000000000000000000000000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package de.ozgcloud.alfa.common.command; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -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.Mock; - -import com.thedeanda.lorem.LoremIpsum; - -class CommandTest { - - @Nested - class TestIsFinishedSuccessfully { - - @Test - void shouldReturnTrue() { - var command = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); - - var isDoneSuccessfully = command.isFinishedSuccessfully(); - - assertThat(isDoneSuccessfully).isTrue(); - } - - @ParameterizedTest - @EnumSource(names = "FINISHED", mode = Mode.EXCLUDE) - void shouldReturnFalseOnStatusNotFinished(CommandStatus commandStatus) { - var command = CommandTestFactory.createBuilder().status(commandStatus).build(); - - var isDoneSuccessfully = command.isFinishedSuccessfully(); - - assertThat(isDoneSuccessfully).isFalse(); - } - - @ParameterizedTest - @EnumSource - void shouldReturnFalseOnErrorMessage(CommandStatus commandStatus) { - var command = CommandTestFactory.createBuilder().status(commandStatus).errorMessage(LoremIpsum.getInstance().getWords(1)).build(); - - var isDoneSuccessfully = command.isFinishedSuccessfully(); - - assertThat(isDoneSuccessfully).isFalse(); - } - - } - - @Nested - class TestIsNotDone { - - @Mock - private CommandStatus commandStatus; - private Command command; - - @BeforeEach - void setUp() { - command = CommandTestFactory.createBuilder().status(commandStatus).build(); - } - - @Test - void shouldCallIsNotDone() { - command.isNotDone(); - - verify(commandStatus).isNotDone(); - } - - @ParameterizedTest - @ValueSource(booleans = { true, false }) - void shouldReturnIsNotDone(boolean isNotDone) { - when(commandStatus.isNotDone()).thenReturn(isNotDone); - - var result = command.isNotDone(); - - assertThat(result).isEqualTo(isNotDone); - } - - } - -} \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java index ef4a43f95f4ed8458d9be2f37bb190e32bd87e84..f8b56e2cb33333ee2e01cd40d411f201632f79d4 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandByVorgangControllerTest.java @@ -44,13 +44,8 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory; -import de.ozgcloud.alfa.common.command.Command; -import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; -import de.ozgcloud.alfa.common.command.CommandStatus; import de.ozgcloud.alfa.common.command.CommandTestFactory; -import de.ozgcloud.alfa.common.command.CreateCommand; import de.ozgcloud.alfa.common.command.LegacyOrder; -import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.wiedervorlage.WiedervorlageCommandController.WiedervorlageCommandByVorgangController; import lombok.SneakyThrows; @@ -60,15 +55,10 @@ class WiedervorlageCommandByVorgangControllerTest { @Spy @InjectMocks private WiedervorlageCommandByVorgangController controller; - @Mock - private CommandByRelationController commandByRelationController; - @Mock - private CurrentUserService userService; + @Mock private WiedervorlageService service; - @Captor - private ArgumentCaptor<CreateCommand> createCommandCaptor; private MockMvc mockMvc; @BeforeEach @@ -82,15 +72,10 @@ class WiedervorlageCommandByVorgangControllerTest { @Captor private ArgumentCaptor<Wiedervorlage> wiedervorlageCaptor; - private Command createCommand; - private Command doneCommand; @BeforeEach void mockUserService() { - createCommand = CommandTestFactory.create(); - doneCommand = createCommand.toBuilder().status(CommandStatus.FINISHED).build(); - when(service.createWiedervorlage(any(), any())).thenReturn(createCommand); - when(service.updateNextFrist(createCommand, VorgangHeaderTestFactory.ID)).thenReturn(doneCommand); + when(service.createWiedervorlage(any(), any())).thenReturn(CommandTestFactory.create()); } @Nested @@ -105,10 +90,14 @@ class WiedervorlageCommandByVorgangControllerTest { } @Test - void shouldUpdateNextFristOnSuccessfullyDoneCommand() { + void shouldCallServiceToUpdateNextFrist() { doRequest(); - verify(service).updateNextFrist(createCommand, VorgangHeaderTestFactory.ID); + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageCaptor.capture()); + assertThat(wiedervorlageCaptor.getValue()) + .usingRecursiveComparison() + .comparingOnlyFields("betreff", "beschreibung", "frist", "attachments") + .isEqualTo(WiedervorlageTestFactory.create()); } @SneakyThrows diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java index 198f7a00535cfc7dbcc73c53fa65f3d826a2225d..4ab1dcc715ab7ea4234a59cf2cd79dc30f9d57bb 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandControllerTest.java @@ -35,6 +35,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.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -46,7 +48,6 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import de.ozgcloud.alfa.common.binaryfile.FileId; import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandOrder; -import de.ozgcloud.alfa.common.command.CommandStatus; import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.command.CreateCommand; import de.ozgcloud.alfa.common.command.LegacyOrder; @@ -78,18 +79,15 @@ class WiedervorlageCommandControllerTest { @Nested class ControllerMethods { - private Command createCommand; - private Command doneCommand; + @Captor + private ArgumentCaptor<Wiedervorlage> wiedervorlageCaptor; @BeforeEach void init() { when(service.getById(any())).thenReturn(WiedervorlageTestFactory.create()); - createCommand = CommandTestFactory.createBuilder() + when(service.editWiedervorlage(any(), any(), anyLong())).thenReturn(CommandTestFactory.createBuilder() .order(CommandOrder.UPDATE_ATTACHED_ITEM.name()) - .body(WiedervorlageTestFactory.createAsMap()).build(); - doneCommand = createCommand.toBuilder().status(CommandStatus.FINISHED).build(); - when(service.editWiedervorlage(any(), any(), anyLong())).thenReturn(createCommand); - when(service.updateNextFrist(createCommand, VorgangHeaderTestFactory.ID)).thenReturn(doneCommand); + .body(WiedervorlageTestFactory.createAsMap()).build()); } @SneakyThrows @@ -101,10 +99,14 @@ class WiedervorlageCommandControllerTest { } @Test - void shouldUpdateNextFristOnSuccessfullyDoneCommand() { + void shouldCallServiceUpdateNextFrist() { doRequest(); - verify(service).updateNextFrist(createCommand, VorgangHeaderTestFactory.ID); + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageCaptor.capture()); + assertThat(wiedervorlageCaptor.getValue()) + .usingRecursiveComparison() + .comparingOnlyFields("betreff", "beschreibung", "frist", "attachments") + .isEqualTo(WiedervorlageTestFactory.create()); } @SneakyThrows @@ -152,6 +154,9 @@ class WiedervorlageCommandControllerTest { @Nested class TestCreateCommand { + @Captor + private ArgumentCaptor<Wiedervorlage> wiedervorlageArgumentCaptor; + @DisplayName("for order 'erledigen'") @Nested class TestOnErledigenOrder { @@ -162,6 +167,23 @@ class WiedervorlageCommandControllerTest { verify(service).erledigen(any(Wiedervorlage.class)); } + + @Test + void shouldUpdateNextFrist() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_ERLEDIGEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), any(Wiedervorlage.class)); + } + + @Test + void shouldSetWiedervorlageAsDone() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_ERLEDIGEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageArgumentCaptor.capture()); + assertThat(wiedervorlageArgumentCaptor.getValue()) + .usingRecursiveComparison() + .isEqualTo(WiedervorlageTestFactory.createBuilder().done(true).build()); + } } @DisplayName("for order 'wiedereroeffnen'") @@ -174,6 +196,23 @@ class WiedervorlageCommandControllerTest { verify(service).wiedereroeffnen(any(Wiedervorlage.class)); } + + @Test + void shouldUpdateNextFrist() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_WIEDEREROEFFNEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), any(Wiedervorlage.class)); + } + + @Test + void shouldSetWiedervorlageAsOpen() { + callCreateCommand(LegacyOrder.WIEDERVORLAGE_WIEDEREROEFFNEN); + + verify(service).updateNextFrist(eq(VorgangHeaderTestFactory.ID), wiedervorlageArgumentCaptor.capture()); + assertThat(wiedervorlageArgumentCaptor.getValue()) + .usingRecursiveComparison() + .isEqualTo(WiedervorlageTestFactory.createBuilder().done(false).build()); + } } @DisplayName("for order 'edit'") @@ -188,6 +227,16 @@ class WiedervorlageCommandControllerTest { eq(WiedervorlageTestFactory.VERSION)); } + @Test + void shouldUpdateNextFrist() { + var wiedervorlage = WiedervorlageTestFactory.create(); + doReturn(wiedervorlage).when(controller).updateWiedervorlageByCommand(any(), any()); + + callCreateCommand(LegacyOrder.EDIT_WIEDERVORLAGE); + + verify(service).updateNextFrist(VorgangHeaderTestFactory.ID, wiedervorlage); + } + @DisplayName("update wiedervorlage by given command") @Nested class TestUpdateWiedervorlageByCommand { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java index ae7f2e55675bd0ee63bb76f7a1b175b3bec39534..b8ab4843ea90a7148c175f4349f6a23ba62a6d39 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageServiceTest.java @@ -38,7 +38,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -47,7 +46,6 @@ import org.mockito.Spy; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService; import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.CommandService; -import de.ozgcloud.alfa.common.command.CommandStatus; import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; @@ -108,14 +106,14 @@ class WiedervorlageServiceTest { } @Test - void shouldSetCreatedAt() { + void shouldSetCreatedAt() throws Exception { var wiedervorlage = callAddCreated(); assertThat(wiedervorlage.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); } @Test - void shouldSetCreatedBy() { + void shouldSetCreatedBy() throws Exception { var wiedervorlage = callAddCreated(); assertThat(wiedervorlage.getCreatedBy()).isEqualTo(UserProfileTestFactory.ID.toString()); @@ -173,150 +171,95 @@ class WiedervorlageServiceTest { } @Nested - class TestDoUpdateNextFrist { - - @Nested - class ServiceMethod { - - @BeforeEach - void mockService() { - when(remoteService.findByVorgangId(any())).thenReturn(Stream.of(WiedervorlageTestFactory.create())); - } - - @Test - void shoulDoCalculation() { - callUpdateNextFrist(); - - verify(service).calculateNextFrist(ArgumentMatchers.<Stream<Wiedervorlage>>any()); - } - - @Test - void shouldCallFindByVorgangId() { - callUpdateNextFrist(); - - verify(service).findByVorgangId(VorgangHeaderTestFactory.ID); - } - - @Test - void shouldCallRemoteService() { - doReturn(Optional.of(WiedervorlageTestFactory.FRIST)).when(service).calculateNextFrist(any()); + class TestUpdateNextFrist { - callUpdateNextFrist(); + private final Wiedervorlage wiedervorlage = WiedervorlageTestFactory.create(); + private final Wiedervorlage foundWiedervorlage = WiedervorlageTestFactory.create(); - verify(remoteService).updateNextFrist(VorgangHeaderTestFactory.ID, Optional.of(WiedervorlageTestFactory.FRIST)); - } + @Captor + private ArgumentCaptor<Stream<Wiedervorlage>> allWiedervorlagen; - private void callUpdateNextFrist() { - service.doUpdateNextFrist(VorgangHeaderTestFactory.ID); - } + @BeforeEach + void mockService() { + when(remoteService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(foundWiedervorlage)); + doReturn(Optional.of(WiedervorlageTestFactory.FRIST)).when(service).calculateNextFrist(any()); } - @Nested - class Calculation { + @Test + void shouldDoCalculation() { + callUpdateNextFrist(); - @Test - void shouldReturnNullOnAllDone() { - var wiedervorlage = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(true).build(); + verify(service).calculateNextFrist(any()); + } - var nextFrist = calculateNextFrist(Stream.of(wiedervorlage)); + @Test + void shouldAddWiedervorlageToFoundWiedervorlagen() { + callUpdateNextFrist(); - assertThat(nextFrist).isEmpty(); - } + verify(service).calculateNextFrist(allWiedervorlagen.capture()); + assertThat(allWiedervorlagen.getValue()).containsExactly(wiedervorlage); + } - @Test - void shouldReturnEarliestFrist() { - var fristPast2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(2, ChronoUnit.DAYS)).done(false) - .build(); - var fristPast1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(false).build(); - var fristFuture1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) - .build(); - var fristFuture2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(2, ChronoUnit.DAYS)).done(false) - .build(); - - var nextFrist = calculateNextFrist(Stream.of(fristPast2Days, fristPast1Day, fristFuture1Day, fristFuture2Days)); - - assertThat(nextFrist).contains(LocalDate.now().minus(2, ChronoUnit.DAYS)); - } + @Test + void shouldCallFindByVorgangId() { + callUpdateNextFrist(); - @Test - void shouldReturnFristIgnoringDone() { - var fristPast1DayNotDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) - .build(); - var fristPast1DayDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(true) - .build(); + verify(service).findByVorgangId(VorgangHeaderTestFactory.ID); + } - var nextFrist = calculateNextFrist(Stream.of(fristPast1DayNotDone, fristPast1DayDone)); + @Test + void shouldCallRemoteService() { + callUpdateNextFrist(); - assertThat(nextFrist).contains(LocalDate.now().plus(1, ChronoUnit.DAYS)); - } + verify(remoteService).updateNextFrist(VorgangHeaderTestFactory.ID, Optional.of(WiedervorlageTestFactory.FRIST)); + } - private Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) { - return service.calculateNextFrist(wiedervorlagen); - } + private void callUpdateNextFrist() { + service.updateNextFrist(VorgangHeaderTestFactory.ID, wiedervorlage); } } @Nested - class TestUpdateNextFrist { + class TestCalculateNextFrist { @Test - void shouldWaitUntilCommandDone() { - var pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); - var command = CommandTestFactory.create(); - when(commandService.waitUntilDone(command)).thenReturn(pendingCommand); + void shouldReturnNullOnAllDone() { + var wiedervorlage = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(true).build(); - service.updateNextFrist(command, VorgangHeaderTestFactory.ID); + var nextFrist = calculateNextFrist(Stream.of(wiedervorlage)); - verify(commandService).waitUntilDone(command); + assertThat(nextFrist).isEmpty(); } @Test - void shouldReturnDoneCommand() { - var doneCommand = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); - var command = CommandTestFactory.create(); - when(commandService.waitUntilDone(command)).thenReturn(doneCommand); - - var result = service.updateNextFrist(command, VorgangHeaderTestFactory.ID); - - assertThat(result).isEqualTo(doneCommand); + void shouldReturnEarliestFrist() { + var fristPast2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(2, ChronoUnit.DAYS)).done(false) + .build(); + var fristPast1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(false).build(); + var fristFuture1Day = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) + .build(); + var fristFuture2Days = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(2, ChronoUnit.DAYS)).done(false) + .build(); + + var nextFrist = calculateNextFrist(Stream.of(fristPast2Days, fristPast1Day, fristFuture1Day, fristFuture2Days)); + + assertThat(nextFrist).contains(LocalDate.now().minus(2, ChronoUnit.DAYS)); } - @Nested - class OnDoneSuccessfullyCommand { - private final Command command = CommandTestFactory.create(); - private final Command doneCommand = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); - - @BeforeEach - void setUp() { - when(commandService.waitUntilDone(command)).thenReturn(doneCommand); - } + @Test + void shouldReturnFristIgnoringDone() { + var fristPast1DayNotDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().plus(1, ChronoUnit.DAYS)).done(false) + .build(); + var fristPast1DayDone = WiedervorlageTestFactory.createBuilder().frist(LocalDate.now().minus(1, ChronoUnit.DAYS)).done(true) + .build(); - @Test - void shouldUpdateNextFrist() { - service.updateNextFrist(command, VorgangHeaderTestFactory.ID); + var nextFrist = calculateNextFrist(Stream.of(fristPast1DayNotDone, fristPast1DayDone)); - verify(service).doUpdateNextFrist(VorgangHeaderTestFactory.ID); - } + assertThat(nextFrist).contains(LocalDate.now().plus(1, ChronoUnit.DAYS)); } - @Nested - class OnNotDoneSuccessfullyCommand { - private final Command command = CommandTestFactory.create(); - private final Command pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); - - @BeforeEach - void setUp() { - when(commandService.waitUntilDone(command)).thenReturn(pendingCommand); - } - - @Test - void shouldNotUpdateNextFrist() { - service.updateNextFrist(command, VorgangHeaderTestFactory.ID); - - verify(service, never()).doUpdateNextFrist(VorgangHeaderTestFactory.ID); - } + private Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) { + return service.calculateNextFrist(wiedervorlagen); } - } - } \ No newline at end of file