完成单机TEST统一入口与可靠投递回归收尾

This commit is contained in:
2026-09-29 19:48:34 +08:00
parent 64a70c9f28
commit 6c0a026cc4
89 changed files with 968 additions and 983 deletions
@@ -33,17 +33,17 @@ function blocker(context, name, reason, response = null) {
context.assert(MODULE, `${name}覆盖前置`, response, false, `${reason}; ${trace(response)}`, OPTIONS)
}
async function platform(context, method, name, path, body = undefined) {
const response = await context.requestOverseas(method, path, body)
const response = await context.request(method, path, body)
const data = context.apiSuccess(MODULE, name, response, trace(response), OPTIONS)
return { response, data }
}
async function pda(context, token, method, name, path, body = undefined) {
const response = await context.requestOverseas(method, path, body, {}, token)
const response = await context.request(method, path, body, token, {})
context.addStep(MODULE, name, response, success(response), trace(response), OPTIONS)
return { response, data: success(response) ? response.body?.data : null }
}
async function merchant(context, token, method, name, path, body = undefined) {
const response = await context.requestOverseas(method, path, body, {}, token)
const response = await context.request(method, path, body, token, {})
const data = context.apiSuccess(MODULE, name, response, trace(response), OPTIONS)
return { response, data }
}
@@ -75,7 +75,7 @@ export async function saveReceiptAndComplete(context, delivery, customerId, inde
Number.isInteger(version) && version >= 0, `version=${before.data?.version ?? 'missing'}; ${trace(before.response)}`, OPTIONS)
if (!success(before.response) || !Number.isInteger(version) || version < 0) return null
const uploadResponse = await context.requestOverseasMultipart('POST',
const uploadResponse = await context.requestMultipart('POST',
query(`${LASTLEG_BASE}/delivery-orders/${encodeURIComponent(deliveryNo)}/documents/RECEIPT/files`, { customerId }), {
name: `${context.marker}-${deliveryNo}-receipt.txt`, type: 'text/plain',
content: new TextEncoder().encode(`${context.marker} receipt acceptance for ${deliveryNo}`),
@@ -158,16 +158,16 @@ async function loginMerchant(context, customerId) {
password: credentials.password,
}, '')
const auth = context.apiSuccess(MODULE, '本轮客户工作台账号登录', response, trace(response), OPTIONS)
context.assert(MODULE, '客户登录返回海外访问Token', response, nonBlank(auth?.overseasAccessToken),
`tokenPresent=${Boolean(auth?.overseasAccessToken)}; ${trace(response)}`, OPTIONS)
if (!nonBlank(auth?.accessToken) || !nonBlank(auth?.overseasAccessToken)) return null
context.assert(MODULE, '客户登录返回海外访问Token', response, nonBlank(auth?.accessToken),
`tokenPresent=${Boolean(auth?.accessToken)}; ${trace(response)}`, OPTIONS)
if (!nonBlank(auth?.accessToken) || !nonBlank(auth?.accessToken)) return null
const profileResponse = await context.request('GET', '/api/merchant/v1/iam/tenant/profile', undefined, auth.accessToken)
const profile = context.apiSuccess(MODULE, '回查客户工作台企业身份', profileResponse,
trace(profileResponse), OPTIONS)
context.assert(MODULE, '客户工作台企业与五期履约客户严格一致', profileResponse,
id(profile?.id) === customerId,
`merchantCustomer=${id(profile?.id) || 'missing'}, fulfillmentCustomer=${customerId}; ${trace(profileResponse)}`, OPTIONS)
return id(profile?.id) === customerId ? auth.overseasAccessToken : null
return id(profile?.id) === customerId ? auth.accessToken : null
}
function fixture(context) {
@@ -270,7 +270,7 @@ export async function run(context) {
trace(updated.response), OPTIONS)
if (!success(updated.response)) return
const bol = await context.requestOverseasBinary('GET', `${DISPATCH_BASE}/${encodeURIComponent(dispatchNo)}/prints/bol`)
const bol = await context.requestBinary('GET', `${DISPATCH_BASE}/${encodeURIComponent(dispatchNo)}/prints/bol`)
context.addStep(MODULE, '排车BOL下载为真实PDF而非JSON错误', bol,
bol.http === 200 && /application\/pdf/i.test(bol.contentType || '')
&& new TextDecoder().decode(bol.bytes?.slice(0, 5)) === '%PDF-', trace(bol), OPTIONS)
@@ -310,8 +310,7 @@ export async function run(context) {
&& JSON.stringify(deliveryNumbers(adminReplay.data)) === JSON.stringify(deliveryNos), trace(adminReplay.response), OPTIONS)
const lockedItem = updated.data?.items?.[0]
if (lockedItem?.id) {
const deniedRemove = await context.requestOverseas('DELETE',
`${DISPATCH_BASE}/${encodeURIComponent(dispatchNo)}/items/${encodeURIComponent(id(lockedItem.id))}`)
const deniedRemove = await context.request('DELETE', `${DISPATCH_BASE}/${encodeURIComponent(dispatchNo)}/items/${encodeURIComponent(id(lockedItem.id))}`)
context.addStep(MODULE, '已生成出库单禁止移除排车托盘', deniedRemove, conflict(deniedRemove), trace(deniedRemove), OPTIONS)
const stable = await platform(context, 'GET', '移除拒绝后回查排车托盘零漂移', `${DISPATCH_BASE}/${encodeURIComponent(dispatchNo)}`)
context.assert(MODULE, '移除失败不改变箱数和托盘身份', stable.response,
@@ -323,8 +322,7 @@ export async function run(context) {
context.assert(MODULE, '转派送重放复用同一业务单据', transferReplay.response,
transferReplay.data?.replayed === true && id(transferReplay.data?.outboundNo) === outboundNo
&& JSON.stringify(deliveryNumbers(transferReplay.data)) === JSON.stringify(deliveryNos), trace(transferReplay.response), OPTIONS)
const transferConflict = await context.requestOverseas('POST', query(MERCHANT_DELIVERY_BASE, { dispatchNo }),
{ ...transferBody, idempotencyKey: key(context, 'TRANSFER-DIFFERENT') }, {}, merchantToken)
const transferConflict = await context.request('POST', query(MERCHANT_DELIVERY_BASE, { dispatchNo }), { ...transferBody, idempotencyKey: key(context, 'TRANSFER-DIFFERENT') }, merchantToken, {})
context.addStep(MODULE, '同一排车使用另一幂等键仍返回既有单据', transferConflict,
success(transferConflict) && id(transferConflict.body?.data?.outboundNo) === outboundNo
&& transferConflict.body?.data?.replayed === true
@@ -409,9 +407,7 @@ export async function run(context) {
&& completedDeliveries.every((value) => value?.order?.status === 'DELIVERED'),
`deliveries=${deliveryNos.join(',')}, completed=${completedDeliveries.length}`, OPTIONS)
const removedComplete = await context.requestOverseas('POST',
query(`${LASTLEG_BASE}/delivery-orders/${encodeURIComponent(deliveryNo)}/complete`, { customerId }),
{ status: 'DELIVERED', expectedVersion: 0, remark: `${context.marker}-removed-complete-probe` })
const removedComplete = await context.request('POST', query(`${LASTLEG_BASE}/delivery-orders/${encodeURIComponent(deliveryNo)}/complete`, { customerId }), { status: 'DELIVERED', expectedVersion: 0, remark: `${context.marker}-removed-complete-probe` })
context.addStep(MODULE, '人工确认派送完成接口已移除', removedComplete,
removedComplete?.http === 404 || removedComplete?.http === 405
|| (removedComplete?.http === 200 && ['A0404', 'A0405'].includes(code(removedComplete))),