test(return): align parcel counts and physical carton assertions

This commit is contained in:
2026-10-21 11:18:02 +08:00
parent 7a9ab27fd2
commit 6b2df287bd
2 changed files with 7 additions and 6 deletions
@@ -118,7 +118,7 @@ test('真实退货验收使用TH及RR和RB日流水并保留原箱码与重放
assert.ok(source.includes(`/^${prefix}[0-9]{12}$/`), prefix) assert.ok(source.includes(`/^${prefix}[0-9]{12}$/`), prefix)
} }
assert.ok(source.includes('data.order.lastlegOrderNo === data.order.returnNo')) assert.ok(source.includes('data.order.lastlegOrderNo === data.order.returnNo'))
assert.ok(source.includes('/^RC-[0-9A-Z]{25}$/')) assert.ok(source.includes('/^BX-[0-9A-Z]+$/'))
assert.ok(source.includes('同键并发合箱后重试仍返回原箱')) assert.ok(source.includes('同键并发合箱后重试仍返回原箱'))
assert.ok(source.includes('签收重放不重复产生流水')) assert.ok(source.includes('签收重放不重复产生流水'))
}) })
@@ -262,11 +262,12 @@ export async function runReturnBoundaries(context, { merchantToken, warehouse, p
check('三件库存同时各取两件仅一次成功', partialResponses[0], partialOutcome.successes === 1 check('三件库存同时各取两件仅一次成功', partialResponses[0], partialOutcome.successes === 1
&& partialOutcome.conflicts === 1 && partialOutcome.unexpected === 0, JSON.stringify(partialOutcome)) && partialOutcome.conflicts === 1 && partialOutcome.unexpected === 0, JSON.stringify(partialOutcome))
const [partialState] = await snapshot([partial]) const [partialState] = await snapshot([partial])
// PARCEL 不计纸箱数;剩余包裹和新 BOX 是两个库存单元,但只有一个纸箱。
check('并发部分合箱保持原箱一件新箱两件总量三件', null, Number(partialState.cartons.total) === 2 check('并发部分合箱保持原箱一件新箱两件总量三件', null, Number(partialState.cartons.total) === 2
&& rows(partialState.cartons).every(row => row.status === 'AVAILABLE') && rows(partialState.cartons).every(row => row.status === 'AVAILABLE')
&& rows(partialState.cartons).some(row => row.cartonMark === partial.cartonMark && Number(row.totalQuantity) === 1) && rows(partialState.cartons).some(row => row.cartonMark === partial.cartonMark && Number(row.totalQuantity) === 1)
&& rows(partialState.cartons).some(row => row.cartonMark !== partial.cartonMark && Number(row.totalQuantity) === 2) && rows(partialState.cartons).some(row => row.cartonMark !== partial.cartonMark && Number(row.totalQuantity) === 2)
&& rows(partialState.summary).some(row => row.skuCode === partial.sku && Number(row.availableQuantity) === 3 && Number(row.cartonQuantity) === 2)) && rows(partialState.summary).some(row => row.skuCode === partial.sku && Number(row.availableQuantity) === 3 && Number(row.cartonQuantity) === 1))
} }
}) })
@@ -309,7 +310,7 @@ export async function runReturnBoundaries(context, { merchantToken, warehouse, p
...mergeBody([order], skuA, 1), items: [{ skuCode: skuA, quantity: 1 }, { skuCode: secondSku, quantity }] }), [409]) ...mergeBody([order], skuA, 1), items: [{ skuCode: skuA, quantity: 1 }, { skuCode: secondSku, quantity }] }), [409])
} }
const [state] = await snapshot([order]) const [state] = await snapshot([order])
check('混合失败后两SKU均保持两件且各自一个来源箱', null, Number(state.cartons.total) === 2 check('混合失败后两SKU各两件且保留同一原包裹', null, Number(state.cartons.total) === 1
&& [state.summary, ...state.additionalSummaries].every(page => rows(page).length === 1 && Number(rows(page)[0].availableQuantity) === 2)) && [state.summary, ...state.additionalSummaries].every(page => rows(page).length === 1 && Number(rows(page)[0].availableQuantity) === 2))
}) })
@@ -321,11 +322,11 @@ export async function runReturnBoundaries(context, { merchantToken, warehouse, p
const responses = await Promise.all([1, 2].map(() => request(picker.token, 'POST', MERGE, body))) const responses = await Promise.all([1, 2].map(() => request(picker.token, 'POST', MERGE, body)))
for (const [index, response] of responses.entries()) check(`同键并发合箱请求${index + 1}成功`, response, ok(response)) for (const [index, response] of responses.entries()) check(`同键并发合箱请求${index + 1}成功`, response, ok(response))
check('同键并发合箱复用同一目标箱', responses[0], responses.every(ok) check('同键并发合箱复用同一目标箱', responses[0], responses.every(ok)
&& /^RC-[0-9A-Z]{25}$/.test(responses[0].body.data?.cartonMark) && responses[0].body.data.cartonMark === responses[1].body.data.cartonMark) && /^BX-[0-9A-Z]+$/.test(responses[0].body.data?.cartonMark) && responses[0].body.data.cartonMark === responses[1].body.data.cartonMark)
const [state] = await snapshot([order]) const [state] = await snapshot([order])
check('同键并发合箱只扣一次且原箱新箱各一件', null, Number(state.cartons.total) === 2 check('同键并发合箱只扣一次且原箱新箱各一件', null, Number(state.cartons.total) === 2
&& rows(state.cartons).every(row => Number(row.totalQuantity) === 1 && row.status === 'AVAILABLE') && rows(state.cartons).every(row => Number(row.totalQuantity) === 1 && row.status === 'AVAILABLE')
&& rows(state.summary).some(row => row.skuCode === order.sku && Number(row.availableQuantity) === 2 && Number(row.cartonQuantity) === 2)) && rows(state.summary).some(row => row.skuCode === order.sku && Number(row.availableQuantity) === 2 && Number(row.cartonQuantity) === 1))
const original = responses.find(ok)?.body.data?.cartonMark const original = responses.find(ok)?.body.data?.cartonMark
const replay = await request(picker.token, 'POST', MERGE, body) const replay = await request(picker.token, 'POST', MERGE, body)
check('同键并发合箱后重试仍返回原箱', replay, ok(replay) && Boolean(original) && replay.body.data?.cartonMark === original) check('同键并发合箱后重试仍返回原箱', replay, ok(replay) && Boolean(original) && replay.body.data?.cartonMark === original)
@@ -355,7 +356,7 @@ export async function runReturnBoundaries(context, { merchantToken, warehouse, p
skuCode: sku, overseasWarehouseId: order.warehouseId, page: 1, size: 20 })) skuCode: sku, overseasWarehouseId: order.warehouseId, page: 1, size: 20 }))
check('同码库存只返回当前客户当前仓的准确数量', null, Number(data.total) === 1 && rows(data).length === 1 check('同码库存只返回当前客户当前仓的准确数量', null, Number(data.total) === 1 && rows(data).length === 1
&& rows(data)[0].skuCode === sku && String(rows(data)[0].overseasWarehouseId) === String(order.warehouseId) && rows(data)[0].skuCode === sku && String(rows(data)[0].overseasWarehouseId) === String(order.warehouseId)
&& Number(rows(data)[0].availableQuantity) === order.quantity && Number(rows(data)[0].cartonQuantity) === 1) && Number(rows(data)[0].availableQuantity) === order.quantity && Number(rows(data)[0].cartonQuantity) === 0)
} }
for (const [token, expected] of [[merchantToken, [a, c]], [tokenB, [b]]]) { for (const [token, expected] of [[merchantToken, [a, c]], [tokenB, [b]]]) {
const data = await good(token, 'GET', '客户按同码查询自己全部退货单', url(ORDERS, { skuCode: sku, page: 1, size: 20 })) const data = await good(token, 'GET', '客户按同码查询自己全部退货单', url(ORDERS, { skuCode: sku, page: 1, size: 20 }))