fix: close shadow activity on legacy failures

This commit is contained in:
zgw
2026-09-03 16:46:54 +08:00
parent ffd3cc04f3
commit af7e00c9a0
4 changed files with 76 additions and 9 deletions

View File

@@ -17,9 +17,12 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.util.HashMap;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -47,6 +50,9 @@ class ToWmsServiceImplShadowTest {
beforeLegacy = inboundJob("TRAY-1", null);
legacyResult = inboundJob("TRAY-1", "SPACE-LEGACY");
when(mydoJobMapper.selectInJobByTaskNo("TASK-1")).thenReturn(beforeLegacy, legacyResult);
}
private void prepareSuccessfulLegacyAllocation() {
doAnswer(invocation -> {
@SuppressWarnings("unchecked")
HashMap<String, Object> parameters = invocation.getArgument(0);
@@ -58,6 +64,7 @@ class ToWmsServiceImplShadowTest {
@Test
void submitsObservationBeforeLegacyAndReturnsTheReloadedLegacyJob() {
prepareSuccessfulLegacyAllocation();
when(shadowObservationGateway.observeInbound("TASK-1", "TRAY-1"))
.thenReturn(shadowCompletion);
@@ -75,6 +82,7 @@ class ToWmsServiceImplShadowTest {
@Test
void shadowExceptionCannotSkipOrReplaceLegacyAllocation() {
prepareSuccessfulLegacyAllocation();
when(shadowObservationGateway.observeInbound("TASK-1", "TRAY-1"))
.thenThrow(new IllegalStateException("shadow unavailable"));
@@ -85,6 +93,21 @@ class ToWmsServiceImplShadowTest {
verify(mydoJobMapper, times(1)).allotInJobSpace(any());
}
@Test
void legacyExceptionClosesShadowActivityAndEscapesUnchanged() {
IllegalStateException legacyFailure = new IllegalStateException("legacy database failure");
when(shadowObservationGateway.observeInbound("TASK-1", "TRAY-1"))
.thenReturn(shadowCompletion);
doThrow(legacyFailure).when(mydoJobMapper).allotInJobSpace(any());
assertThatThrownBy(() -> service.requestEnterByTaskNo(request))
.isSameAs(legacyFailure);
verify(shadowCompletion, times(1)).fail(legacyFailure);
verify(shadowCompletion, never()).complete(any(), any());
verify(mydoJobMapper, times(1)).allotInJobSpace(any());
}
private MydoJob inboundJob(String trayNo, String cargoSpaceId) {
MydoJob job = new MydoJob();
job.setInOrOut("10");

View File

@@ -20,10 +20,13 @@ import java.util.HashMap;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -94,6 +97,22 @@ class OutStockoutServiceImplShadowTest {
verify(outStockoutMapper, times(1)).autoAllot(any());
}
@Test
void autoAllotLegacyExceptionClosesShadowActivityAndEscapesUnchanged() {
IllegalStateException legacyFailure = new IllegalStateException("legacy database failure");
prepareAutoAllot();
when(shadowObservationGateway.observeProjectOutbound("DETAIL-1"))
.thenReturn(shadowCompletion);
doThrow(legacyFailure).when(outStockoutMapper).autoAllot(any());
assertThatThrownBy(() -> service.autoAllot("OUT-1"))
.isSameAs(legacyFailure);
verify(shadowCompletion, times(1)).fail(legacyFailure);
verify(shadowCompletion, never()).complete(any());
verify(outStockoutMapper, times(1)).autoAllot(any());
}
@Test
void missingShadowStockStillRunsManualAllotOncePerSelectedStock() {
OutboundShadowCompletion firstCompletion = mock(OutboundShadowCompletion.class);
@@ -120,6 +139,21 @@ class OutStockoutServiceImplShadowTest {
verify(secondCompletion).complete("10");
}
@Test
void manualAllotLegacyErrorClosesShadowActivityAndEscapesUnchanged() {
AssertionError legacyFailure = new AssertionError("legacy fatal failure");
when(shadowObservationGateway.observeExactStockOutbound("DETAIL-1", "STOCK-1"))
.thenReturn(shadowCompletion);
doThrow(legacyFailure).when(outStockoutMapper).manualAllot(any());
assertThatThrownBy(() -> service.manualAllot(new String[]{"STOCK-1"}, "DETAIL-1"))
.isSameAs(legacyFailure);
verify(shadowCompletion, times(1)).fail(legacyFailure);
verify(shadowCompletion, never()).complete(any());
verify(outStockoutMapper, times(1)).manualAllot(any());
}
private void prepareAutoAllot() {
OutStockout bill = new OutStockout();
bill.setStatus("2");