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

Merge pull request 'OZG-6335-fix-wiedervorlage-update-next-frist' (#714) from...

Merge pull request 'OZG-6335-fix-wiedervorlage-update-next-frist' (#714) from OZG-6335-fix-wiedervorlage-update-next-frist into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/alfa/pulls/714


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents bd661242 ad6b5b03
No related branches found
No related tags found
No related merge requests found
Showing
with 406 additions and 60 deletions
...@@ -33,7 +33,7 @@ import { WiedervorlageInVorgangE2EComponent } from '../../../components/wiedervo ...@@ -33,7 +33,7 @@ import { WiedervorlageInVorgangE2EComponent } from '../../../components/wiedervo
import { WiedervorlageE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-page.e2e.component'; import { WiedervorlageE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-page.e2e.component';
import { WiedervorlageSubnavigationE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-subnavigation'; import { WiedervorlageSubnavigationE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-subnavigation';
import { WiedervorlagenInVorgangE2EComponent } from '../../../components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component'; import { WiedervorlagenInVorgangE2EComponent } from '../../../components/wiedervorlage/wiedervorlagen-in-vorgang.e2e.component';
import { VorgangE2E } from '../../../model/vorgang'; import { ClientAttributeNameE2E, VorgangE2E } from '../../../model/vorgang';
import { WiedervorlageE2E } from '../../../model/wiedervorlage'; import { WiedervorlageE2E } from '../../../model/wiedervorlage';
import { import {
MainPage, MainPage,
...@@ -51,12 +51,20 @@ import { ...@@ -51,12 +51,20 @@ import {
notExist, notExist,
} from '../../../support/cypress.util'; } from '../../../support/cypress.util';
import { loginAsSabine } from '../../../support/user-util'; import { loginAsSabine } from '../../../support/user-util';
import { createVorgang, initVorgang, objectIds } from '../../../support/vorgang-util'; import {
createAlfaClientAttributes,
createNextWiedervorlageFristClientAttribute,
createVorgang,
initVorgang,
objectIds,
} from '../../../support/vorgang-util';
import { import {
createWiedervorlageAttachedItem, createWiedervorlageAttachedItem,
createWiedervorlageItem, createWiedervorlageItem,
} from '../../../support/wiedervorlage-util'; } from '../../../support/wiedervorlage-util';
const wiedervorlageItemFixture: WiedervorlageE2E = require('../../../fixtures/wiedervorlage/wiedervorlage.json');
describe('Wiedervorlage erledigen/wiedereroeffnen', () => { describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
const mainPage: MainPage = new MainPage(); const mainPage: MainPage = new MainPage();
...@@ -76,7 +84,13 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { ...@@ -76,7 +84,13 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
const wiedervorlageContainer: WiedervorlageE2EComponent = const wiedervorlageContainer: WiedervorlageE2EComponent =
wiedervorlagePage.getWiedervorlageContainer(); wiedervorlagePage.getWiedervorlageContainer();
const vorgang: VorgangE2E = createVorgang(); const vorgang: VorgangE2E = {
...createVorgang(),
clientAttributes: createAlfaClientAttributes(
ClientAttributeNameE2E.NEXT_WIEDERVORLAGE_FRIST,
createNextWiedervorlageFristClientAttribute(wiedervorlageItemFixture.frist),
),
};
const wiedervorlageZumErledigen: WiedervorlageE2E = { const wiedervorlageZumErledigen: WiedervorlageE2E = {
...createWiedervorlageItem('WiedervorlageZumErledigen'), ...createWiedervorlageItem('WiedervorlageZumErledigen'),
...@@ -144,8 +158,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { ...@@ -144,8 +158,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
waitforSpinnerToAppear(); waitforSpinnerToAppear();
waitForSpinnerToDisappear(); waitForSpinnerToDisappear();
wait(1000, 'Wait for async BE to complete');
containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); containClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
contains( contains(
snackBar.getMessage(), snackBar.getMessage(),
...@@ -187,8 +199,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { ...@@ -187,8 +199,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
waitforSpinnerToAppear(); waitforSpinnerToAppear();
waitForSpinnerToDisappear(); waitForSpinnerToDisappear();
wait(1000, 'Wait for async BE to complete');
notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt');
contains( contains(
snackBar.getMessage(), snackBar.getMessage(),
...@@ -219,7 +229,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { ...@@ -219,7 +229,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
const locatorIconDefault: string = 'wiedervorlage-icon-default'; const locatorIconDefault: string = 'wiedervorlage-icon-default';
it('back to vorgang list', () => { it('back to vorgang list', () => {
wait(3000, 'Wait for async BE to complete');
vorgangPage.getSubnavigation().getBackButton().click(); vorgangPage.getSubnavigation().getBackButton().click();
waitForSpinnerToDisappear(); waitForSpinnerToDisappear();
}); });
...@@ -240,8 +249,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { ...@@ -240,8 +249,6 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => {
subnavigation.erledigen(); subnavigation.erledigen();
waitForSpinnerToDisappear(); waitForSpinnerToDisappear();
wait(3000, 'Wait for async BE to complete');
subnavigation.navigateBack(); subnavigation.navigateBack();
waitForSpinnerToDisappear(); waitForSpinnerToDisappear();
}); });
......
...@@ -26,6 +26,8 @@ package de.ozgcloud.alfa.common.command; ...@@ -26,6 +26,8 @@ package de.ozgcloud.alfa.common.command;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import de.ozgcloud.alfa.common.LinkedUserProfileResource; import de.ozgcloud.alfa.common.LinkedUserProfileResource;
...@@ -74,4 +76,14 @@ public class Command { ...@@ -74,4 +76,14 @@ public class Command {
public CommandOrder getCommandOrder() { public CommandOrder getCommandOrder() {
return CommandOrder.fromOrder(order); 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
...@@ -23,27 +23,30 @@ ...@@ -23,27 +23,30 @@
*/ */
package de.ozgcloud.alfa.common.command; package de.ozgcloud.alfa.common.command;
import java.util.Calendar;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung; import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Validated @Validated
@Service @Service
public class CommandService { public class CommandService {
static final long NO_RELATION_VERSION = -1; static final long NO_RELATION_VERSION = -1;
private static final int WAIT_TIME_MS = 500;
private static final int COMMAND_REQUEST_THRESHOLD_MILLIS = 10000;
@Autowired private final CommandRemoteService remoteService;
private CommandRemoteService remoteService;
/** /**
* @deprecated use {@link #createCommand(CreateCommand)} instead * @deprecated use {@link #createCommand(CreateCommand)} instead
...@@ -111,4 +114,25 @@ public class CommandService { ...@@ -111,4 +114,25 @@ public class CommandService {
return remoteService.findCommands(vorgangId, Optional.of(CommandStatus.FINISHED), Optional.empty()); 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
...@@ -23,6 +23,14 @@ ...@@ -23,6 +23,14 @@
*/ */
package de.ozgcloud.alfa.common.command; package de.ozgcloud.alfa.common.command;
import java.util.Set;
public enum CommandStatus { public enum CommandStatus {
PENDING, FINISHED, ERROR, REVOKE_PENDING, REVOKED; 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);
}
} }
...@@ -53,10 +53,9 @@ public class WiedervorlageCommandController { ...@@ -53,10 +53,9 @@ public class WiedervorlageCommandController {
@PathVariable long wiedervorlageVersion) { @PathVariable long wiedervorlageVersion) {
var wiedervorlage = service.getById(wiedervorlageId); var wiedervorlage = service.getById(wiedervorlageId);
var createdCommand = createCommand(wiedervorlage, command); var createdCommand = createCommand(wiedervorlage, command);
var doneCommand = service.updateNextFrist(createdCommand, wiedervorlage.getVorgangId());
service.updateNextFrist(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) { Command createCommand(Wiedervorlage wiedervorlage, CreateCommand command) {
...@@ -97,10 +96,9 @@ public class WiedervorlageCommandController { ...@@ -97,10 +96,9 @@ public class WiedervorlageCommandController {
@PostMapping @PostMapping
public ResponseEntity<Void> createWiedervorlage(@RequestBody CreateCommand command, @PathVariable String vorgangId) { public ResponseEntity<Void> createWiedervorlage(@RequestBody CreateCommand command, @PathVariable String vorgangId) {
var createdCommand = service.createWiedervorlage((Wiedervorlage) command.getBody(), vorgangId); var createdCommand = service.createWiedervorlage((Wiedervorlage) command.getBody(), vorgangId);
var doneCommand = service.updateNextFrist(createdCommand, createdCommand.getVorgangId());
service.updateNextFrist(vorgangId); return ResponseEntity.created(linkTo(CommandController.class).slash(doneCommand.getId()).toUri()).build();
return ResponseEntity.created(linkTo(CommandController.class).slash(createdCommand.getId()).toUri()).build();
} }
} }
} }
\ No newline at end of file
...@@ -33,27 +33,26 @@ import java.util.stream.Stream; ...@@ -33,27 +33,26 @@ import java.util.stream.Stream;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService;
import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.Command;
import de.ozgcloud.alfa.common.command.CommandService;
import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.CurrentUserService;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Validated @Validated
@Service @Service
class WiedervorlageService { class WiedervorlageService {
private static final Predicate<Wiedervorlage> IS_NOT_DONE = wiedervorlage -> !wiedervorlage.isDone(); private static final Predicate<Wiedervorlage> IS_NOT_DONE = wiedervorlage -> !wiedervorlage.isDone();
@Autowired private final WiedervorlageRemoteService remoteService;
private WiedervorlageRemoteService remoteService; private final VorgangAttachedItemService vorgangAttachedItemService;
@Autowired private final CurrentUserService currentUserService;
private VorgangAttachedItemService vorgangAttachedItemService; private final CommandService commandService;
@Autowired
private CurrentUserService currentUserService;
public Command createWiedervorlage(@Valid Wiedervorlage wiedervorlage, String vorgangId) { public Command createWiedervorlage(@Valid Wiedervorlage wiedervorlage, String vorgangId) {
return vorgangAttachedItemService.createNewWiedervorlage(addCreated(wiedervorlage), vorgangId); return vorgangAttachedItemService.createNewWiedervorlage(addCreated(wiedervorlage), vorgangId);
...@@ -74,8 +73,15 @@ class WiedervorlageService { ...@@ -74,8 +73,15 @@ class WiedervorlageService {
return remoteService.getById(wiedervorlageId); return remoteService.getById(wiedervorlageId);
} }
@Async public Command updateNextFrist(Command command, String vorgangId) {
public void updateNextFrist(String vorgangId) { var doneCommand = commandService.waitUntilDone(command);
if (doneCommand.isFinishedSuccessfully()) {
doUpdateNextFrist(vorgangId);
}
return doneCommand;
}
void doUpdateNextFrist(String vorgangId) {
var allWiedervorlagen = findByVorgangId(vorgangId); var allWiedervorlagen = findByVorgangId(vorgangId);
remoteService.updateNextFrist(vorgangId, calculateNextFrist(allWiedervorlagen)); remoteService.updateNextFrist(vorgangId, calculateNextFrist(allWiedervorlagen));
......
...@@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.*; ...@@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.util.Calendar;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
...@@ -39,6 +40,7 @@ import org.mockito.ArgumentCaptor; ...@@ -39,6 +40,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Captor; import org.mockito.Captor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.Spy; import org.mockito.Spy;
import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung; import de.ozgcloud.alfa.loeschanforderung.DeleteLoeschAnforderung;
...@@ -297,4 +299,99 @@ class CommandServiceTest { ...@@ -297,4 +299,99 @@ class CommandServiceTest {
verify(remoteService).findCommands(VorgangHeaderTestFactory.ID, Optional.of(CommandStatus.FINISHED), Optional.empty()); 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
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
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
...@@ -44,7 +44,9 @@ import org.springframework.test.web.servlet.ResultActions; ...@@ -44,7 +44,9 @@ import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory; 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.CommandController.CommandByRelationController;
import de.ozgcloud.alfa.common.command.CommandStatus;
import de.ozgcloud.alfa.common.command.CommandTestFactory; import de.ozgcloud.alfa.common.command.CommandTestFactory;
import de.ozgcloud.alfa.common.command.CreateCommand; import de.ozgcloud.alfa.common.command.CreateCommand;
import de.ozgcloud.alfa.common.command.LegacyOrder; import de.ozgcloud.alfa.common.command.LegacyOrder;
...@@ -80,10 +82,15 @@ class WiedervorlageCommandByVorgangControllerTest { ...@@ -80,10 +82,15 @@ class WiedervorlageCommandByVorgangControllerTest {
@Captor @Captor
private ArgumentCaptor<Wiedervorlage> wiedervorlageCaptor; private ArgumentCaptor<Wiedervorlage> wiedervorlageCaptor;
private Command createCommand;
private Command doneCommand;
@BeforeEach @BeforeEach
void mockUserService() { void mockUserService() {
when(service.createWiedervorlage(any(), any())).thenReturn(CommandTestFactory.create()); 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);
} }
@Nested @Nested
...@@ -98,10 +105,10 @@ class WiedervorlageCommandByVorgangControllerTest { ...@@ -98,10 +105,10 @@ class WiedervorlageCommandByVorgangControllerTest {
} }
@Test @Test
void shouldCallServiceToUpdateNextFrist() { void shouldUpdateNextFristOnSuccessfullyDoneCommand() {
doRequest(); doRequest();
verify(service).updateNextFrist(VorgangHeaderTestFactory.ID); verify(service).updateNextFrist(createCommand, VorgangHeaderTestFactory.ID);
} }
@SneakyThrows @SneakyThrows
......
...@@ -46,7 +46,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; ...@@ -46,7 +46,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import de.ozgcloud.alfa.common.binaryfile.FileId; import de.ozgcloud.alfa.common.binaryfile.FileId;
import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.Command;
import de.ozgcloud.alfa.common.command.CommandOrder; import de.ozgcloud.alfa.common.command.CommandOrder;
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.command.CommandTestFactory;
import de.ozgcloud.alfa.common.command.CreateCommand; import de.ozgcloud.alfa.common.command.CreateCommand;
import de.ozgcloud.alfa.common.command.LegacyOrder; import de.ozgcloud.alfa.common.command.LegacyOrder;
...@@ -60,8 +60,6 @@ class WiedervorlageCommandControllerTest { ...@@ -60,8 +60,6 @@ class WiedervorlageCommandControllerTest {
@InjectMocks @InjectMocks
private WiedervorlageCommandController controller; private WiedervorlageCommandController controller;
@Mock @Mock
private CommandService commandService;
@Mock
private WiedervorlageService service; private WiedervorlageService service;
private MockMvc mockMvc; private MockMvc mockMvc;
...@@ -80,12 +78,18 @@ class WiedervorlageCommandControllerTest { ...@@ -80,12 +78,18 @@ class WiedervorlageCommandControllerTest {
@Nested @Nested
class ControllerMethods { class ControllerMethods {
private Command createCommand;
private Command doneCommand;
@BeforeEach @BeforeEach
void init() { void init() {
when(service.getById(any())).thenReturn(WiedervorlageTestFactory.create()); when(service.getById(any())).thenReturn(WiedervorlageTestFactory.create());
when(service.editWiedervorlage(any(), any(), anyLong())).thenReturn(CommandTestFactory.createBuilder() createCommand = CommandTestFactory.createBuilder()
.order(CommandOrder.UPDATE_ATTACHED_ITEM.name()) .order(CommandOrder.UPDATE_ATTACHED_ITEM.name())
.body(WiedervorlageTestFactory.createAsMap()).build()); .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);
} }
@SneakyThrows @SneakyThrows
...@@ -97,10 +101,10 @@ class WiedervorlageCommandControllerTest { ...@@ -97,10 +101,10 @@ class WiedervorlageCommandControllerTest {
} }
@Test @Test
void shouldCallServiceUpdateNextFrist() { void shouldUpdateNextFristOnSuccessfullyDoneCommand() {
doRequest(); doRequest();
verify(service).updateNextFrist(VorgangHeaderTestFactory.ID); verify(service).updateNextFrist(createCommand, VorgangHeaderTestFactory.ID);
} }
@SneakyThrows @SneakyThrows
......
...@@ -47,6 +47,7 @@ import org.mockito.Spy; ...@@ -47,6 +47,7 @@ import org.mockito.Spy;
import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService; import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemService;
import de.ozgcloud.alfa.common.command.Command; import de.ozgcloud.alfa.common.command.Command;
import de.ozgcloud.alfa.common.command.CommandService; 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.command.CommandTestFactory;
import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
...@@ -107,14 +108,14 @@ class WiedervorlageServiceTest { ...@@ -107,14 +108,14 @@ class WiedervorlageServiceTest {
} }
@Test @Test
void shouldSetCreatedAt() throws Exception { void shouldSetCreatedAt() {
var wiedervorlage = callAddCreated(); var wiedervorlage = callAddCreated();
assertThat(wiedervorlage.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); assertThat(wiedervorlage.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS));
} }
@Test @Test
void shouldSetCreatedBy() throws Exception { void shouldSetCreatedBy() {
var wiedervorlage = callAddCreated(); var wiedervorlage = callAddCreated();
assertThat(wiedervorlage.getCreatedBy()).isEqualTo(UserProfileTestFactory.ID.toString()); assertThat(wiedervorlage.getCreatedBy()).isEqualTo(UserProfileTestFactory.ID.toString());
...@@ -172,7 +173,7 @@ class WiedervorlageServiceTest { ...@@ -172,7 +173,7 @@ class WiedervorlageServiceTest {
} }
@Nested @Nested
class TestUpdateNextFrist { class TestDoUpdateNextFrist {
@Nested @Nested
class ServiceMethod { class ServiceMethod {
...@@ -206,7 +207,7 @@ class WiedervorlageServiceTest { ...@@ -206,7 +207,7 @@ class WiedervorlageServiceTest {
} }
private void callUpdateNextFrist() { private void callUpdateNextFrist() {
service.updateNextFrist(VorgangHeaderTestFactory.ID); service.doUpdateNextFrist(VorgangHeaderTestFactory.ID);
} }
} }
...@@ -254,4 +255,68 @@ class WiedervorlageServiceTest { ...@@ -254,4 +255,68 @@ class WiedervorlageServiceTest {
} }
} }
} }
@Nested
class TestUpdateNextFrist {
@Test
void shouldWaitUntilCommandDone() {
var pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build();
var command = CommandTestFactory.create();
when(commandService.waitUntilDone(command)).thenReturn(pendingCommand);
service.updateNextFrist(command, VorgangHeaderTestFactory.ID);
verify(commandService).waitUntilDone(command);
}
@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);
}
@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 shouldUpdateNextFrist() {
service.updateNextFrist(command, VorgangHeaderTestFactory.ID);
verify(service).doUpdateNextFrist(VorgangHeaderTestFactory.ID);
}
}
@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);
}
}
}
} }
\ 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