feat(wcs): add transport order state machine
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
package com.ruoyi.wcs.domain.task;
|
||||
|
||||
import com.ruoyi.wcs.domain.shared.DomainRuleViolation;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.time.Instant;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
class TransportOrderTest {
|
||||
|
||||
@Test
|
||||
void completesOnlyThroughPlannedAndExecuting() {
|
||||
TransportOrder order = order();
|
||||
|
||||
order.plan("WF-1");
|
||||
order.start();
|
||||
order.complete();
|
||||
|
||||
assertEquals(TransportOrderState.COMPLETED, order.getState());
|
||||
assertEquals(4, order.getUncommittedEvents().size());
|
||||
assertEquals("OrderCompleted", order.getUncommittedEvents().get(3).getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
void cannotCompleteBeforeExecutionStarts() {
|
||||
TransportOrder order = order();
|
||||
order.plan("WF-1");
|
||||
|
||||
assertThrows(DomainRuleViolation.class, order::complete);
|
||||
}
|
||||
|
||||
@Test
|
||||
void terminalOrderCannotResume() {
|
||||
TransportOrder order = order();
|
||||
order.plan("WF-1");
|
||||
order.cancel();
|
||||
|
||||
assertThrows(DomainRuleViolation.class, order::resumeToPlanned);
|
||||
}
|
||||
|
||||
@Test
|
||||
void successfulTransitionsIncrementVersionAndEventSequenceOnce() {
|
||||
TransportOrder order = order();
|
||||
order.plan("WF-1");
|
||||
order.start();
|
||||
order.suspend("PLC snapshot stale");
|
||||
order.resumeToExecuting();
|
||||
|
||||
assertEquals(4L, order.getStateVersion());
|
||||
assertEquals(5L, order.getUncommittedEvents().get(4).getSequence());
|
||||
|
||||
assertThrows(DomainRuleViolation.class, order::resumeToPlanned);
|
||||
assertEquals(4L, order.getStateVersion());
|
||||
assertEquals(5, order.getUncommittedEvents().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void runningCancellationRequiresTheExplicitConvergenceState() {
|
||||
TransportOrder order = order();
|
||||
order.plan("WF-1");
|
||||
order.start();
|
||||
|
||||
assertThrows(DomainRuleViolation.class, order::cancel);
|
||||
order.requestCancel();
|
||||
order.cancel();
|
||||
|
||||
assertEquals(TransportOrderState.CANCELLED, order.getState());
|
||||
}
|
||||
|
||||
private TransportOrder order() {
|
||||
return TransportOrder.accept(
|
||||
"ORDER-1",
|
||||
"REQ-1",
|
||||
TransportOrderType.INBOUND,
|
||||
"LOAD-1",
|
||||
"PORT-1",
|
||||
"SPACE-1",
|
||||
50,
|
||||
Instant.parse("2026-08-04T00:00:00Z"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user