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

OZG-4713 OZG-4927 replace status change evaluation logic

parent 36c03b20
No related branches found
No related tags found
No related merge requests found
Showing
with 81 additions and 311 deletions
package de.ozgcloud.alfa.historie;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
class FixedVorgangStatusFinder implements VorgangStatusFinder {
private final String vorgangStatus;
@Override
public Optional<String> findVorgangStatus(CommandWithPrevious commandWithPrevious) {
return Optional.of(vorgangStatus);
}
}
package de.ozgcloud.alfa.historie;
import java.util.Optional;
class PreviousCommandChangedToStatusFinder implements VorgangStatusFinder {
@Override
public Optional<String> findVorgangStatus(CommandWithPrevious commandWithPrevious) {
return commandWithPrevious.previous().flatMap(this::getChangedToStatus);
}
private Optional<String> getChangedToStatus(CommandWithPrevious commandWithPrevious) {
var statusChangeInfo = StatusChangeInfo.getStatusChangeInfoFor(commandWithPrevious);
return statusChangeInfo.getChangedToStatus(commandWithPrevious);
}
}
package de.ozgcloud.alfa.historie;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
import de.ozgcloud.alfa.common.command.Command;
import de.ozgcloud.alfa.vorgang.Vorgang;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.alfa.common.command.CommandOrder;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class StatusChangeHistoryBuilder extends ChangeHistoryBuilder<StatusChangeHistoryBuilder> {
static final String GELOESCHT_NAME = "Gelöscht";
static final Map<VorgangStatus, String> VORGANG_STATUS_TO_NAME = Map.of(
VorgangStatus.NEU, "Neu",
VorgangStatus.ANGENOMMEN, "Angenommen",
VorgangStatus.VERWORFEN, "Verworfen",
VorgangStatus.IN_BEARBEITUNG, "In Bearbeitung",
VorgangStatus.BESCHIEDEN, "Beschieden",
VorgangStatus.ABGESCHLOSSEN, "Abgeschlossen",
VorgangStatus.WEITERGELEITET, "Weitergeleitet",
VorgangStatus.ZU_LOESCHEN, "Zu Löschen"
);
static final Set<CommandOrder> STATUS_CHANGE_COMMAND_ORDER = Set.of(
CommandOrder.VORGANG_ANNEHMEN,
CommandOrder.VORGANG_VERWERFEN,
CommandOrder.VORGANG_ZURUECKHOLEN,
CommandOrder.VORGANG_BEARBEITEN,
CommandOrder.VORGANG_BESCHEIDEN,
CommandOrder.VORGANG_ABSCHLIESSEN,
CommandOrder.VORGANG_ZUM_LOESCHEN_MARKIEREN,
CommandOrder.VORGANG_LOESCHEN,
CommandOrder.VORGANG_ZURUECKSTELLEN);
public static StatusChangeHistoryBuilder builder() {
return new StatusChangeHistoryBuilder();
}
......@@ -21,24 +45,36 @@ public class StatusChangeHistoryBuilder extends ChangeHistoryBuilder<StatusChang
}
boolean isStatusChangeCommand(Command command) {
return StatusChangeInfo.isStatusChangeOrder(command.getOrder());
return STATUS_CHANGE_COMMAND_ORDER.contains(command.getOrder());
}
@Override
CommandWithChangeValues toCommandWithChangeValues(CommandWithPrevious commandWithPrevious) {
var statusChangeInfo = StatusChangeInfo.getStatusChangeInfoFor(commandWithPrevious);
return new CommandWithChangeValues(
commandWithPrevious.command(),
getStatusBeforeChange(commandWithPrevious, statusChangeInfo),
getStatusAfterChange(commandWithPrevious, statusChangeInfo));
return new CommandWithChangeValues(commandWithPrevious.command(),
getStatusBeforeChange(commandWithPrevious),
getStatusAfterChange(commandWithPrevious));
}
String getStatusBeforeChange(CommandWithPrevious commandWithPrevious) {
return commandWithPrevious.previous().map(CommandWithPrevious::command).map(this::getStatus)
.orElse(VORGANG_STATUS_TO_NAME.get(VorgangStatus.NEU));
}
String getStatusBeforeChange(CommandWithPrevious commandWithPrevious, StatusChangeInfo statusChangeInfo) {
return statusChangeInfo.getChangedFromStatus(commandWithPrevious).orElse(Vorgang.VorgangStatus.NEU.name());
String getStatusAfterChange(CommandWithPrevious commandWithPrevious) {
return getStatus(commandWithPrevious.command());
}
String getStatusAfterChange(CommandWithPrevious commandWithPrevious, StatusChangeInfo statusChangeInfo) {
return statusChangeInfo.getChangedToStatus(commandWithPrevious)
.orElseThrow(() -> new TechnicalException("Unknown status after change for command " + commandWithPrevious.command().getId()));
String getStatus(Command command) {
return switch (command.getOrder()) {
case VORGANG_ANNEHMEN, VORGANG_ZURUECKSTELLEN -> VORGANG_STATUS_TO_NAME.get(VorgangStatus.ANGENOMMEN);
case VORGANG_VERWERFEN -> VORGANG_STATUS_TO_NAME.get(VorgangStatus.VERWORFEN);
case VORGANG_ZURUECKHOLEN -> VORGANG_STATUS_TO_NAME.get(VorgangStatus.NEU);
case VORGANG_BEARBEITEN, VORGANG_WIEDEREROEFFNEN -> VORGANG_STATUS_TO_NAME.get(VorgangStatus.IN_BEARBEITUNG);
case VORGANG_BESCHEIDEN -> VORGANG_STATUS_TO_NAME.get(VorgangStatus.BESCHIEDEN);
case VORGANG_ABSCHLIESSEN -> VORGANG_STATUS_TO_NAME.get(VorgangStatus.ABGESCHLOSSEN);
case VORGANG_ZUM_LOESCHEN_MARKIEREN -> VORGANG_STATUS_TO_NAME.get(VorgangStatus.ZU_LOESCHEN);
case VORGANG_LOESCHEN -> GELOESCHT_NAME;
default -> throw new IllegalArgumentException("Unexpected or unknown command order " + command.getOrder());
};
}
}
package de.ozgcloud.alfa.historie;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import de.ozgcloud.alfa.common.command.CommandOrder;
import de.ozgcloud.alfa.vorgang.Vorgang;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
class StatusChangeInfo {
private final VorgangStatusFinder changedFromFinder;
private final VorgangStatusFinder changedToFinder;
public static StatusChangeInfo getStatusChangeInfoFor(CommandWithPrevious commandWithPrevious) {
return STATUS_CHANGE_ORDERS.get(commandWithPrevious.command().getOrder());
}
public Optional<String> getChangedFromStatus(CommandWithPrevious commandWithPrevious) {
return changedFromFinder.findVorgangStatus(commandWithPrevious);
}
public Optional<String> getChangedToStatus(CommandWithPrevious commandWithPrevious) {
return changedToFinder.findVorgangStatus(commandWithPrevious);
}
public static boolean isStatusChangeOrder(CommandOrder commandOrder) {
return STATUS_CHANGE_ORDERS.containsKey(commandOrder);
}
private static final Map<CommandOrder, StatusChangeInfo> STATUS_CHANGE_ORDERS = new HashMap<>();
static {
addStatusChangeInfo(CommandOrder.VORGANG_ANNEHMEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.ANGENOMMEN.name()));
addStatusChangeInfo(CommandOrder.VORGANG_VERWERFEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.VERWORFEN.name()));
addStatusChangeInfo(CommandOrder.VORGANG_ZURUECKHOLEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.NEU.name()));
addStatusChangeInfo(CommandOrder.VORGANG_BEARBEITEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.IN_BEARBEITUNG.name()));
addStatusChangeInfo(CommandOrder.VORGANG_ZURUECKSTELLEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.ANGENOMMEN.name()));
addStatusChangeInfo(CommandOrder.VORGANG_BESCHEIDEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.BESCHIEDEN.name()));
addStatusChangeInfo(CommandOrder.VORGANG_WIEDEREROEFFNEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.IN_BEARBEITUNG.name()));
addStatusChangeInfo(CommandOrder.VORGANG_ABSCHLIESSEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.ABGESCHLOSSEN.name()));
addStatusChangeInfo(CommandOrder.VORGANG_ZUM_LOESCHEN_MARKIEREN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder(Vorgang.VorgangStatus.ZU_LOESCHEN.name()));
addStatusChangeInfo(CommandOrder.VORGANG_LOESCHEN,
new PreviousCommandChangedToStatusFinder(),
new FixedVorgangStatusFinder("GELOESCHT"));
}
private static void addStatusChangeInfo(CommandOrder commandOrder, VorgangStatusFinder changedFromFinder,
VorgangStatusFinder changedToFinder) {
STATUS_CHANGE_ORDERS.put(commandOrder, new StatusChangeInfo(changedFromFinder, changedToFinder));
}
}
package de.ozgcloud.alfa.historie;
import java.util.Optional;
interface VorgangStatusFinder {
Optional<String> findVorgangStatus(CommandWithPrevious commandWithPrevious);
}
package de.ozgcloud.alfa.historie;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import de.ozgcloud.alfa.vorgang.Vorgang;
public class FixedVorgangStatusFinderTest {
@Test
void shouldReturnVorgangStatus() {
var status = Vorgang.VorgangStatus.IN_BEARBEITUNG.name();
var statusFinder = new FixedVorgangStatusFinder(status);
var returnedStatus = statusFinder.findVorgangStatus(mock(CommandWithPrevious.class));
assertThat(returnedStatus).isPresent().get().isEqualTo(status);
}
}
package de.ozgcloud.alfa.historie;
import static org.mockito.Mockito.*;
import java.util.Optional;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import de.ozgcloud.alfa.common.command.CommandTestFactory;
public abstract class PreviousCommandBasedStatusFinderTest {
MockedStatic<StatusChangeInfo> staticStatusChangeInfo;
@Mock
StatusChangeInfo statusChangeInfo;
CommandWithPrevious previousCommand;
CommandWithPrevious command;
@BeforeEach
void init() {
staticStatusChangeInfo = mockStatic(StatusChangeInfo.class);
initPreviousCommand();
initStatusChangeInfoOfPreviousCommand();
}
@AfterEach
void cleanup() {
staticStatusChangeInfo.close();
}
private void initPreviousCommand() {
previousCommand = new CommandWithPrevious(CommandTestFactory.create(), Optional.empty());
}
private void initStatusChangeInfoOfPreviousCommand() {
staticStatusChangeInfo.when(() -> StatusChangeInfo.getStatusChangeInfoFor(previousCommand)).thenReturn(statusChangeInfo);
}
}
package de.ozgcloud.alfa.historie;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import de.ozgcloud.alfa.common.command.CommandTestFactory;
public class PreviousCommandChangedToStatusFinderTest extends PreviousCommandBasedStatusFinderTest {
@Test
void shouldReturnChangedToStatusFromPreviousCommand() {
var expectedVorgangStatus = "EXPECTED_VORGANG_STATUS";
when(statusChangeInfo.getChangedToStatus(previousCommand)).thenReturn(Optional.of(expectedVorgangStatus));
command = new CommandWithPrevious(CommandTestFactory.create(), Optional.of(previousCommand));
var foundStatus = new PreviousCommandChangedToStatusFinder().findVorgangStatus(command);
assertThat(foundStatus).isPresent().get().isEqualTo(expectedVorgangStatus);
}
@Test
void shouldReturnEmptyIfThereIsNoPreviousCommand() {
command = new CommandWithPrevious(CommandTestFactory.create(), Optional.empty());
var foundStatus = new PreviousCommandChangedToStatusFinder().findVorgangStatus(command);
assertThat(foundStatus).isEmpty();
}
}
......@@ -9,20 +9,20 @@ import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.junit.jupiter.api.AfterEach;
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.ValueSource;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.EnumSource.Mode;
import org.mockito.Spy;
import com.thedeanda.lorem.LoremIpsum;
import de.ozgcloud.alfa.common.command.Command;
import de.ozgcloud.alfa.vorgang.Vorgang;
import de.ozgcloud.alfa.common.command.CommandOrder;
import de.ozgcloud.alfa.common.command.CommandTestFactory;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.common.errorhandling.TechnicalException;
public class StatusChangeHistoryBuilderTest {
......@@ -66,33 +66,22 @@ public class StatusChangeHistoryBuilderTest {
@Nested
class TestIsStatusChangeCommand {
private MockedStatic<StatusChangeInfo> statusChangeInfo;
@BeforeEach
void init() {
statusChangeInfo = mockStatic(StatusChangeInfo.class);
}
@AfterEach
void cleanup() {
statusChangeInfo.close();
}
@Test
void shouldDelegateToStatusChangeInfo() {
builder.isStatusChangeCommand(command0105);
@EnumSource(mode = Mode.INCLUDE, names = { "VORGANG_ANNEHMEN", "VORGANG_VERWERFEN", "VORGANG_ZURUECKHOLEN", "VORGANG_BEARBEITEN",
"VORGANG_BESCHEIDEN", "VORGANG_ABSCHLIESSEN", "VORGANG_ZUM_LOESCHEN_MARKIEREN", "VORGANG_LOESCHEN", "VORGANG_ZURUECKSTELLEN" })
@ParameterizedTest
void shouldReturnTrue(CommandOrder order) {
var isStatusChangeCommand = builder.isStatusChangeCommand(CommandTestFactory.createBuilder().order(order).build());
statusChangeInfo.verify(() -> StatusChangeInfo.isStatusChangeOrder(command0105.getOrder()));
assertThat(isStatusChangeCommand).isTrue();
}
@EnumSource(mode = Mode.EXCLUDE, names = { "VORGANG_ANNEHMEN", "VORGANG_VERWERFEN", "VORGANG_ZURUECKHOLEN", "VORGANG_BEARBEITEN",
"VORGANG_BESCHEIDEN", "VORGANG_ABSCHLIESSEN", "VORGANG_ZUM_LOESCHEN_MARKIEREN", "VORGANG_LOESCHEN", "VORGANG_ZURUECKSTELLEN" })
@ParameterizedTest
@ValueSource(booleans = { false, true })
void shouldReturnValueFromStatusChangeInfo(boolean expectedValue) {
statusChangeInfo.when(() -> StatusChangeInfo.isStatusChangeOrder(command0105.getOrder())).thenReturn(expectedValue);
void shouldReturnFalse(CommandOrder order) {
var isStatusChangeCommand = builder.isStatusChangeCommand(CommandTestFactory.createBuilder().order(order).build());
var result = builder.isStatusChangeCommand(command0105);
assertThat(result).isEqualTo(expectedValue);
assertThat(isStatusChangeCommand).isTrue();
}
}
......@@ -102,21 +91,10 @@ public class StatusChangeHistoryBuilderTest {
private static final String EXPECTED_STATUS_BEFORE_CHANGE = LoremIpsum.getInstance().getWords(2);
private static final String EXPECTED_STATUS_AFTER_CHANGE = LoremIpsum.getInstance().getWords(2);
private MockedStatic<StatusChangeInfo> staticStatusChangeInfo;
@Mock
private StatusChangeInfo statusChangeInfo;
@BeforeEach
void init() {
staticStatusChangeInfo = mockStatic(StatusChangeInfo.class);
staticStatusChangeInfo.when(() -> StatusChangeInfo.getStatusChangeInfoFor(command0106WithPrevious)).thenReturn(statusChangeInfo);
doReturn(EXPECTED_STATUS_BEFORE_CHANGE).when(builder).getStatusBeforeChange(command0106WithPrevious, statusChangeInfo);
doReturn(EXPECTED_STATUS_AFTER_CHANGE).when(builder).getStatusAfterChange(command0106WithPrevious, statusChangeInfo);
}
@AfterEach
void cleanup() {
staticStatusChangeInfo.close();
doReturn(EXPECTED_STATUS_BEFORE_CHANGE).when(builder).getStatusBeforeChange(command0106WithPrevious);
doReturn(EXPECTED_STATUS_AFTER_CHANGE).when(builder).getStatusAfterChange(command0106WithPrevious);
}
@Test
......@@ -148,28 +126,27 @@ public class StatusChangeHistoryBuilderTest {
@Nested
class TestGetStatusBeforeChange {
private final CommandWithPrevious commandWithPrevious = new CommandWithPrevious(command0105, Optional.empty());
@Mock
private StatusChangeInfo statusChangeInfo;
private final Command command = CommandTestFactory.create();
private final Command previousCommand = CommandTestFactory.create();
private final CommandWithPrevious commandWithPrevious = new CommandWithPrevious(
command,
Optional.of(new CommandWithPrevious(previousCommand, Optional.empty())));
@Test
void shouldReturnChangedFromStatus() {
var expectedStatus = LoremIpsum.getInstance().getWords(2);
when(statusChangeInfo.getChangedFromStatus(commandWithPrevious)).thenReturn(Optional.of(expectedStatus));
void shouldReturnStatusBeforeChange() {
var status = "Status";
doReturn(status).when(builder).getStatus(previousCommand);
var status = builder.getStatusBeforeChange(commandWithPrevious, statusChangeInfo);
var statusBeforeChange = builder.getStatusBeforeChange(commandWithPrevious);
assertThat(status).isEqualTo(expectedStatus);
assertThat(statusBeforeChange).isEqualTo(status);
}
@Test
void shouldReturnDefaultValue() {
when(statusChangeInfo.getChangedFromStatus(commandWithPrevious)).thenReturn(Optional.empty());
var status = builder.getStatusBeforeChange(commandWithPrevious, statusChangeInfo);
var status = builder.getStatusBeforeChange(commandWithPrevious);
assertThat(status).isEqualTo(Vorgang.VorgangStatus.NEU.name());
assertThat(status).isEqualTo(StatusChangeHistoryBuilder.VORGANG_STATUS_TO_NAME.get(VorgangStatus.NEU));
}
}
......@@ -178,25 +155,18 @@ public class StatusChangeHistoryBuilderTest {
private final CommandWithPrevious commandWithPrevious = new CommandWithPrevious(command0105, Optional.empty());
@Mock
private StatusChangeInfo statusChangeInfo;
@Test
void shouldReturnChangedFromStatus() {
var expectedStatus = LoremIpsum.getInstance().getWords(2);
when(statusChangeInfo.getChangedToStatus(commandWithPrevious)).thenReturn(Optional.of(expectedStatus));
var status = builder.getStatusAfterChange(commandWithPrevious, statusChangeInfo);
var status = builder.getStatusAfterChange(commandWithPrevious);
assertThat(status).isEqualTo(expectedStatus);
}
@Test
void shouldThrowExceptionIfStatusIsEmpty() {
when(statusChangeInfo.getChangedToStatus(commandWithPrevious)).thenReturn(Optional.empty());
assertThatExceptionOfType(TechnicalException.class).isThrownBy(
() -> builder.getStatusAfterChange(commandWithPrevious, statusChangeInfo))
assertThatExceptionOfType(TechnicalException.class).isThrownBy(() -> builder.getStatusAfterChange(commandWithPrevious))
.withMessageStartingWith("Unknown status after change for command " + command0105.getId());
}
}
......
package de.ozgcloud.alfa.historie;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import de.ozgcloud.alfa.common.command.CommandOrder;
public class StatusChangeInfoTest {
@Nested
class TestIsStatusChangeOrder {
@Test
void shouldReturnTrueForOrderCorrespondingToStatusChange() {
var result = StatusChangeInfo.isStatusChangeOrder(CommandOrder.VORGANG_BESCHEIDEN);
assertThat(result).isTrue();
}
@Test
void shouldReturnFalseIfOrderIsNotConnectedToStatusChange() {
var result = StatusChangeInfo.isStatusChangeOrder(CommandOrder.ASSIGN_USER);
assertThat(result).isFalse();
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment