test(phase3): validate multi-owner loaded slices
This commit is contained in:
@@ -136,7 +136,7 @@ test('HTTP finalizer preserves failure evidence and verifies the settled slice',
|
|||||||
'final complete 失败后回查入库单',
|
'final complete 失败后回查入库单',
|
||||||
'结算或版本冲突失败后 task/plan/inbound/operation 全部零写入',
|
'结算或版本冲突失败后 task/plan/inbound/operation 全部零写入',
|
||||||
'结算后回查柜次实际履约分片',
|
'结算后回查柜次实际履约分片',
|
||||||
'结算递增版本后实际完成分片唯一且柜次身份稳定',
|
'结算后每个实装来源分片唯一且柜次身份稳定',
|
||||||
])
|
])
|
||||||
assert.match(finalize, /requestId=\$\{completeResponse\.requestId \|\| 'missing'\}/)
|
assert.match(finalize, /requestId=\$\{completeResponse\.requestId \|\| 'missing'\}/)
|
||||||
assert.match(finalize, /traceId=\$\{completeResponse\.traceId \|\| 'missing'\}/)
|
assert.match(finalize, /traceId=\$\{completeResponse\.traceId \|\| 'missing'\}/)
|
||||||
|
|||||||
@@ -172,12 +172,14 @@ export async function run(context) {
|
|||||||
&& id(item?.sourceOrderId) === id(loadedSlice?.sourceOrderId))
|
&& id(item?.sourceOrderId) === id(loadedSlice?.sourceOrderId))
|
||||||
: null
|
: null
|
||||||
const settlementMode = remainderSlice ? 'PARTIAL' : 'FULL'
|
const settlementMode = remainderSlice ? 'PARTIAL' : 'FULL'
|
||||||
context.assert(MODULE, '结算递增版本后实际完成分片唯一且柜次身份稳定', slicesResponse,
|
const loadedSourceIds = loadedSlices.map((item) => id(item?.sourceOrderId)).filter(Boolean)
|
||||||
loadedSlices.length === 1 && Boolean(loadedSlice)
|
context.assert(MODULE, '结算后每个实装来源分片唯一且柜次身份稳定', slicesResponse,
|
||||||
&& id(loadedSlice?.tenantId) === tenantId
|
loadedSlices.length > 0 && Boolean(loadedSlice)
|
||||||
&& id(loadedSlice?.containerBookingId) === containerBookingId
|
&& new Set(loadedSourceIds).size === loadedSlices.length
|
||||||
&& id(loadedSlice?.loadingPlanId) === loadingPlanId
|
&& loadedSlices.every((item) => id(item?.tenantId) === tenantId
|
||||||
&& Number.isInteger(Number(loadedSlice?.packageCount)) && Number(loadedSlice.packageCount) > 0,
|
&& id(item?.containerBookingId) === containerBookingId
|
||||||
|
&& id(item?.loadingPlanId) === loadingPlanId
|
||||||
|
&& Number.isInteger(Number(item?.packageCount)) && Number(item.packageCount) > 0),
|
||||||
`mode=${settlementMode}, loadedSlices=${loadedSlices.length}, sourceOrderId=${id(loadedSlice?.sourceOrderId) || 'missing'}, childOrderId=${id(loadedSlice?.childOrderId) || 'missing'}, packageCount=${loadedSlice?.packageCount ?? 'missing'}`, OPTIONS)
|
`mode=${settlementMode}, loadedSlices=${loadedSlices.length}, sourceOrderId=${id(loadedSlice?.sourceOrderId) || 'missing'}, childOrderId=${id(loadedSlice?.childOrderId) || 'missing'}, packageCount=${loadedSlice?.packageCount ?? 'missing'}`, OPTIONS)
|
||||||
|
|
||||||
const unifiedDetailPath = `/api/platform/v1/orders/${encodeURIComponent(orderId)}?tenantId=${encodeURIComponent(tenantId)}`
|
const unifiedDetailPath = `/api/platform/v1/orders/${encodeURIComponent(orderId)}?tenantId=${encodeURIComponent(tenantId)}`
|
||||||
@@ -223,9 +225,9 @@ export async function run(context) {
|
|||||||
{ expectedTaskVersion: Number(completed?.version),
|
{ expectedTaskVersion: Number(completed?.version),
|
||||||
operationId: `${context.marker}-pda-final-complete-new-key`.slice(0, 128), remark: `${context.marker}-loaded-new-key` },
|
operationId: `${context.marker}-pda-final-complete-new-key`.slice(0, 128), remark: `${context.marker}-loaded-new-key` },
|
||||||
{ 'Idempotency-Key': `${context.marker}-p3-complete-loaded-new-key`.slice(0, 128) })
|
{ 'Idempotency-Key': `${context.marker}-p3-complete-loaded-new-key`.slice(0, 128) })
|
||||||
context.assert(MODULE, 'LOADED 后使用新键重复 complete 幂等保持终态', completeNewKey,
|
context.assert(MODULE, 'LOADED 后使用新键重复 complete 返回冲突', completeNewKey,
|
||||||
completeNewKey.http === 200 && codeOf(completeNewKey) === '200'
|
completeNewKey.http === 200 && codeOf(completeNewKey) === 'A0409'
|
||||||
&& completeNewKey.body?.data?.taskStatus === 'COMPLETED',
|
&& Boolean(completeNewKey.requestId) && Boolean(completeNewKey.traceId),
|
||||||
`HTTP=${completeNewKey.http}, code=${codeOf(completeNewKey)}, status=${completeNewKey.body?.data?.taskStatus || 'missing'}`, OPTIONS)
|
`HTTP=${completeNewKey.http}, code=${codeOf(completeNewKey)}, status=${completeNewKey.body?.data?.taskStatus || 'missing'}`, OPTIONS)
|
||||||
|
|
||||||
const completeSameKeyDifferentBody = await request(context, 'POST',
|
const completeSameKeyDifferentBody = await request(context, 'POST',
|
||||||
|
|||||||
@@ -613,7 +613,7 @@ test('loading evidence acceptance covers idempotency, reversible missing-type ga
|
|||||||
test('loaded boundary acceptance proves evidence and transport immutability with zero drift', () => {
|
test('loaded boundary acceptance proves evidence and transport immutability with zero drift', () => {
|
||||||
const finalize = source('./phase3-loading-finalize.mjs')
|
const finalize = source('./phase3-loading-finalize.mjs')
|
||||||
assertOrder(finalize, [
|
assertOrder(finalize, [
|
||||||
'LOADED 后使用新键重复 complete 幂等保持终态',
|
'LOADED 后使用新键重复 complete 返回冲突',
|
||||||
'LOADED complete 同键异参返回冲突',
|
'LOADED complete 同键异参返回冲突',
|
||||||
'LOADED 后新增装柜证据被拒绝',
|
'LOADED 后新增装柜证据被拒绝',
|
||||||
'LOADED 后作废装柜证据被拒绝',
|
'LOADED 后作废装柜证据被拒绝',
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ test('default Admin HTTP entry completes settlement before customs consumes load
|
|||||||
assert.ok(finalize.indexOf('const taskPath =')
|
assert.ok(finalize.indexOf('const taskPath =')
|
||||||
< finalize.indexOf('结算递增 inboundVersion 后 final complete 必须使用最新版本'))
|
< finalize.indexOf('结算递增 inboundVersion 后 final complete 必须使用最新版本'))
|
||||||
assert.match(finalize, /结算或版本冲突失败后 task\/plan\/inbound\/operation 全部零写入/)
|
assert.match(finalize, /结算或版本冲突失败后 task\/plan\/inbound\/operation 全部零写入/)
|
||||||
assert.match(finalize, /结算递增版本后实际完成分片唯一且柜次身份稳定/)
|
assert.match(finalize, /结算后每个实装来源分片唯一且柜次身份稳定/)
|
||||||
assert.doesNotMatch(finalize, /truck\?\.finalStatus === 'COMPLETED'/)
|
assert.doesNotMatch(finalize, /truck\?\.finalStatus === 'COMPLETED'/)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user