From ef74579f2c3f521cde3ceafcd36d92096c3229de Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 2 Sep 2026 15:43:11 +0800 Subject: [PATCH] test(overseas): align phase four to five acceptance contracts --- ...4-departure-pickup-chain-contract.test.mjs | 8 +++---- ...hase4-overseas-warehouse-contract.test.mjs | 21 ++++++++++++++----- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/scripts/admin-test-env-modules/phase3-phase4-departure-pickup-chain-contract.test.mjs b/scripts/admin-test-env-modules/phase3-phase4-departure-pickup-chain-contract.test.mjs index 3f767321c..263a1b4ca 100644 --- a/scripts/admin-test-env-modules/phase3-phase4-departure-pickup-chain-contract.test.mjs +++ b/scripts/admin-test-env-modules/phase3-phase4-departure-pickup-chain-contract.test.mjs @@ -17,11 +17,11 @@ test('current-marker departure batch proves operational documents photos customs assert.match(customs, new RegExp(type)) } for (const evidence of ['上传', '回读', '完成']) assert.match(documents, new RegExp(evidence)) - assert.match(customs, /只读复核前置模块已完成的整柜作业资料/) + assert.match(customs, /整柜聚合回显四类当前资料与真实PDA照片证据/) assert.match(customs, /photos\.length >= 5/) assert.match(customs, /\/customs\/loading-plans/) assert.match(customs, /complete-all-buy/) - assert.match(customs, /正式整柜报关聚合必须完成后才允许进入出仓确认/) + assert.match(customs, /四类整柜资料必须完成后才允许进入出仓确认/) assert.match(outbound, /CUSTOMS_CLEARANCE/) assert.match(outbound, /拖车与独立船期仅作聚合参考且不参与出仓门禁/) assert.match(outbound, /\$\{BASE\}\/\$\{encodeURIComponent\(containerBookingId\)\}\/confirm/) @@ -50,8 +50,8 @@ test('outbound-created query supports automated or manual carrier then reaches P assert.match(pda, /last-leg\/inbound-plans\/convert-container/) assert.match(pda, /Number\(summary\?\.missingInboundCodeCount\) === 0/) assert.doesNotMatch(pda, /summary\?\.eligible/) - assert.match(pda, /item\?\.shippingReady === true/) - assert.match(pda, /nonBlank\(item\?\.carrierScheduleQueryId\)/) + assert.match(pda, /item\?\.shippingReady !== false/) + assert.match(pda, /nonBlank\(item\?\.resourceKey\)/) assert.match(pda, /targetCorrelated/) assert.match(pda, /deploymentBlocker: true/) assert.doesNotMatch(pda, /addCoverageGap\([^\n]*PICKUP_READY/) diff --git a/scripts/admin-test-env-modules/phase4-overseas-warehouse-contract.test.mjs b/scripts/admin-test-env-modules/phase4-overseas-warehouse-contract.test.mjs index 261b0e84b..89c045254 100644 --- a/scripts/admin-test-env-modules/phase4-overseas-warehouse-contract.test.mjs +++ b/scripts/admin-test-env-modules/phase4-overseas-warehouse-contract.test.mjs @@ -12,11 +12,19 @@ const source = fs.readFileSync(path.join(here, 'phase4-overseas-warehouse.mjs'), function response(data, code = '200') { return { http: 200, body: { code, message: code === '200' ? 'success' : 'conflict', data }, requestId: 'request-test', traceId: 'trace-test' } } function voidResponse() { return { http: 200, body: { code: '200', message: 'success' }, requestId: 'request-test', traceId: 'trace-test' } } function page(records = []) { return { records, page: 1, size: 20, total: records.length, pages: records.length ? 1 : 0 } } -function contextFixture({ tenants = [{ id: '10001', status: 'ACTIVE' }], warehouseRecords = [{ id: '20001', status: 'ACTIVE', warehouseCode: 'LAX', warehouseName: '洛杉矶仓' }] } = {}) { +function contextFixture({ tenants = [{ id: '10001', status: 'ACTIVE' }], warehouseRecords = [{ id: '20001', status: 'ACTIVE', warehouseType: 'OVERSEAS', warehouseCode: 'LAX', warehouseName: '洛杉矶仓' }] } = {}) { const calls = []; const steps = []; const gaps = []; let createdPallet = null; let createdLocation = null; let createdRelabel = null const context = { context: {}, createdResources: {}, marker: 'ACC-PHASE4-TEST', calls, steps, gaps, - async request(method, requestPath) { calls.push({ channel: 'domestic', method, path: requestPath }); return response(page(tenants)) }, + async request(method, requestPath) { + calls.push({ channel: 'domestic', method, path: requestPath }) + if (method === 'GET' && requestPath.startsWith('/api/platform/v1/iam/tenants?')) return response(page(tenants)) + if (method === 'GET' && requestPath.startsWith('/api/platform/v1/warehouse-admin?')) return response(page(warehouseRecords)) + if (method === 'GET' && requestPath.startsWith('/api/platform/v1/warehouse-admin/20001?')) return response({ warehouse: { id: '20001', warehouseType: 'OVERSEAS', status: 'ACTIVE' } }) + if (method === 'POST' && requestPath === '/api/platform/v1/warehouse-admin') return response('20001') + if (method === 'PATCH' && requestPath.includes('/warehouse-admin/20001/status?')) return voidResponse() + throw new Error(`Unexpected domestic path: ${requestPath}`) + }, async requestOverseas(method, requestPath, body) { calls.push({ channel: 'overseas', method, path: requestPath, body }) if (method === 'POST' && requestPath === '/api/platform/v1/warehouse-admin') return response('20001') @@ -80,8 +88,10 @@ test('既有仓库场景只写本轮库位托盘与换标生命周期', () => { const context = contextFixture() return run(context).then(() => { assert.ok(context.calls.length >= 12) - assert.ok(context.calls.every((call) => ['GET', 'POST', 'PUT', 'DELETE'].includes(call.method))) - assert.equal(context.calls.filter((call) => call.channel === 'domestic').length, 1) + assert.ok(context.calls.every((call) => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(call.method))) + const domesticCalls = context.calls.filter((call) => call.channel === 'domestic') + assert.ok(domesticCalls.length >= 1) + assert.ok(domesticCalls.every((call) => call.method === 'GET')) assert.ok(context.calls.filter((call) => call.channel === 'overseas').every((call) => call.path.startsWith('/api/platform/v1/'))) const writes = context.calls.filter((call) => call.method !== 'GET') assert.ok(writes.some((call) => call.method === 'DELETE' && call.path.includes('/locations/72002'))) @@ -103,9 +113,10 @@ test('既有仓库场景只写本轮库位托盘与换标生命周期', () => { test('覆盖冻结的海外只读列表与有记录才查详情', async () => { const context = contextFixture() await run(context) - for (const pathToken of ['/last-leg/orders?', '/relabel-applications?', '/inbound-plans?', '/inventory/summary?', '/inventory/balances?', '/inventory/ledger?', '/warehouse-admin?', '/locations?', '/pallets?']) { + for (const pathToken of ['/last-leg/orders?', '/relabel-applications?', '/inbound-plans?', '/inventory/summary?', '/inventory/balances?', '/inventory/ledger?', '/locations?', '/pallets?']) { assert.ok(context.calls.some((call) => call.channel === 'overseas' && call.path.includes(pathToken)), pathToken) } + assert.ok(context.calls.some((call) => call.channel === 'domestic' && call.path.includes('/warehouse-admin?')), '/warehouse-admin?') for (const detailToken of ['/orders/30001?', '/relabel-applications/RL-1?', '/inbound-plans/IP-1?', '/balances/60001/positions?', '/warehouse-admin/20001?', '/pallets/70001']) { assert.ok(context.calls.some((call) => call.path.includes(detailToken)), detailToken) }