feat(wcs): add workflow and task step model
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
package com.ruoyi.wcs.domain.task;
|
||||
|
||||
import com.ruoyi.wcs.domain.shared.DomainRuleViolation;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
class WorkflowInstanceTest {
|
||||
|
||||
@Test
|
||||
void exposesOnlyStepsWhoseMandatoryDependenciesSucceeded() {
|
||||
WorkflowInstance workflow = workflow();
|
||||
|
||||
assertEquals(Collections.singletonList("MOVE"), keys(workflow.readySteps()));
|
||||
workflow.step("MOVE").assign("VEH-1", Collections.singletonList("RES-1"));
|
||||
workflow.step("MOVE").start();
|
||||
workflow.step("MOVE").succeed();
|
||||
workflow.onStepSucceeded("MOVE");
|
||||
|
||||
assertEquals(Collections.singletonList("DROP"), keys(workflow.readySteps()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void failedMandatoryDependencyFailsItsSuccessor() {
|
||||
WorkflowInstance workflow = workflow();
|
||||
TaskStep move = workflow.readySteps().get(0);
|
||||
move.fail("PLC rejected command before movement");
|
||||
|
||||
assertEquals(Collections.emptyList(), workflow.readySteps());
|
||||
assertEquals(TaskStepState.FAILED, workflow.step("DROP").getState());
|
||||
}
|
||||
|
||||
@Test
|
||||
void excludedOptionalBranchIsSkippedAndDoesNotBlockRequiredWork() {
|
||||
WorkflowDefinition definition = new WorkflowDefinition(
|
||||
TransportOrderType.INBOUND,
|
||||
Arrays.asList(
|
||||
new WorkflowStepDefinition("MOVE", TaskStepType.MOVE, true,
|
||||
true, Collections.<String>emptyList()),
|
||||
new WorkflowStepDefinition("AUDIT", TaskStepType.INVENTORY_CHECK,
|
||||
false, false, Collections.singletonList("MOVE"))));
|
||||
|
||||
WorkflowInstance workflow = WorkflowInstance.create("WF-2", "ORDER-2", definition);
|
||||
|
||||
assertEquals(TaskStepState.SKIPPED, workflow.step("AUDIT").getState());
|
||||
assertEquals(Collections.singletonList("MOVE"), keys(workflow.readySteps()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void terminalStepRejectsFurtherTransitions() {
|
||||
TaskStep step = workflow().readySteps().get(0);
|
||||
step.cancel();
|
||||
|
||||
assertThrows(DomainRuleViolation.class, step::markReady);
|
||||
}
|
||||
|
||||
private WorkflowInstance workflow() {
|
||||
WorkflowDefinition definition = new WorkflowDefinition(
|
||||
TransportOrderType.INBOUND,
|
||||
Arrays.asList(
|
||||
new WorkflowStepDefinition("MOVE", TaskStepType.MOVE, true,
|
||||
true, Collections.<String>emptyList()),
|
||||
new WorkflowStepDefinition("DROP", TaskStepType.UNLOAD, true,
|
||||
true, Collections.singletonList("MOVE"))));
|
||||
return WorkflowInstance.create("WF-1", "ORDER-1", definition);
|
||||
}
|
||||
|
||||
private List<String> keys(List<TaskStep> steps) {
|
||||
return steps.stream().map(TaskStep::getStepKey).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user