test(firstleg): decouple PDA completion from truck
This commit is contained in:
@@ -120,7 +120,7 @@ test('HTTP chain refreshes after stale inventory and keeps one stable PDA identi
|
||||
assert.doesNotMatch(loading, /\/loading\/complete\?tenantId=/)
|
||||
})
|
||||
|
||||
test('downstream finalizer uses the frozen truck-coupled complete contract', () => {
|
||||
test('downstream finalizer uses the frozen loading complete contract without truck coupling', () => {
|
||||
assert.match(convergence, /loadingPlan\?\.status === 'LOADING'/)
|
||||
assert.match(convergence, /!operations\.some\(\(item\) => item\.actionType === 'COMPLETE_LOADING'\)/)
|
||||
assert.match(customs, /\['AWAITING_REVIEW', 'LOADED'\]/)
|
||||
@@ -136,6 +136,8 @@ test('downstream finalizer uses the frozen truck-coupled complete contract', ()
|
||||
assert.doesNotMatch(finalize, /BLOCKED_CONTRACT/)
|
||||
assert.doesNotMatch(finalize, /truck\?\.finalStatus === 'COMPLETED'/)
|
||||
assert.doesNotMatch(finalize, /\/loading\/complete\?tenantId=/)
|
||||
assert.doesNotMatch(loadingPickService,
|
||||
/TruckAppointmentService|completeLoadingFromPda|completeTruckAfterCommit/)
|
||||
})
|
||||
|
||||
test('PDA complete OpenAPI freezes reliable async acceptance and checkpoint recovery', () => {
|
||||
@@ -215,11 +217,12 @@ test('worker final Firstleg convergence is one short transaction after remote ow
|
||||
'settlementService.settleOwner(',
|
||||
'loadingDeliveryService.completeAfterPdaSettlement(',
|
||||
'completionTransaction.executeWithoutResult',
|
||||
'completeTruckAfterCommit(',
|
||||
])
|
||||
const finalizer = loadingPickService.slice(loadingPickService.indexOf('private void finalizeCompletion'),
|
||||
loadingPickService.indexOf('private void requireColoadConservation'))
|
||||
for (const token of ['COMPLETE_LOADING', 'finishFromPda', 'syncInboundProjections',
|
||||
'publishCompletedEvent', 'completeAccepted', 'completionCommands.complete']) assert.match(finalizer, new RegExp(token))
|
||||
assert.doesNotMatch(finalizer, /settlementService|completeTruckAfterCommit/)
|
||||
assert.doesNotMatch(finalizer, /settlementService/)
|
||||
assert.doesNotMatch(loadingPickService,
|
||||
/TruckAppointmentService|completeLoadingFromPda|completeTruckAfterCommit/)
|
||||
})
|
||||
|
||||
@@ -917,6 +917,9 @@ export async function run(context) {
|
||||
acceptedComplete.http === 200 && codeOf(acceptedComplete) === '200'
|
||||
&& ['PROCESSING', 'FAILED', 'COMPLETED'].includes(acceptedComplete.body?.data?.workflowStatus),
|
||||
`${responseEvidence(acceptedComplete)}, workflow=${acceptedComplete.body?.data?.workflowStatus || 'missing'}`, OPTIONS)
|
||||
context.assert(MODULE, '独立柜未创建拖车单也不阻塞 PDA 装柜完成命令', acceptedComplete,
|
||||
acceptedComplete.http === 200 && codeOf(acceptedComplete) === '200',
|
||||
`containerBookingId=${containerBookingId}, oceanBookingId=${bookingId}, ${responseEvidence(acceptedComplete)}`, OPTIONS)
|
||||
|
||||
let terminalTask = acceptedComplete.body?.data
|
||||
let terminalResponse = acceptedComplete
|
||||
|
||||
@@ -140,6 +140,22 @@ test('late container gate mode proves the final gate without requiring evidence
|
||||
assert.match(value, /nextStage === 'CABINET_EVIDENCE' && nextCode === 'A0409'/)
|
||||
assert.match(value, /!nextMessage\.includes\('集装箱号'\)/)
|
||||
assert.match(value, /context\.createdResources\.phase3LateContainerGate/)
|
||||
assert.match(value, /独立柜未创建拖车单也不阻塞 PDA 装柜完成命令/)
|
||||
})
|
||||
|
||||
test('PDA completion production and HTTP chain never call or gate on truck appointments', () => {
|
||||
const service = source('../../firstleg/src/main/java/com/baiyue/firstleg/service/LoadingPickService.java')
|
||||
const serviceTest = source('../../firstleg/src/test/java/com/baiyue/firstleg/service/LoadingPickServiceTest.java')
|
||||
const loading = source('./phase3-loading.mjs')
|
||||
assert.doesNotMatch(service, /TruckAppointmentService|completeLoadingFromPda|completeTruckAfterCommit/)
|
||||
assert.match(serviceTest, /completionWorkerIsIndependentOfEveryTruckAppointmentState/)
|
||||
for (const state of ['NO_APPOINTMENT', 'DRAFT', 'IN_PROGRESS', 'COMPLETED']) {
|
||||
assert.match(serviceTest, new RegExp(state))
|
||||
}
|
||||
assert.match(serviceTest, /failedSameOperationIdCanResumeWithoutCreatingAnotherCommand[\s\S]*assertNoTruckCoupling/)
|
||||
assert.match(serviceTest, /secondCustomerOwnerReadyFailureLeavesEveryOwnerUnsettledAndUncompleted[\s\S]*assertNoTruckCoupling/)
|
||||
assert.match(serviceTest, /workerRestartResumesFromOwnerCheckpointsWithoutRepeatingSettlements[\s\S]*assertNoTruckCoupling/)
|
||||
assert.doesNotMatch(loading, /\/truck-appointments|completeLoadingFromPda/)
|
||||
})
|
||||
|
||||
test('push replay and both conflict modes preserve the complete pre-PDA snapshot', () => {
|
||||
|
||||
Reference in New Issue
Block a user