import test from 'node:test' import assert from 'node:assert/strict' import { confirmReturnReceipt, findReturnSkuCandidates, normalizeReturnReceiptResult, normalizeReturnReceiptStart, normalizeReturnSkuCandidates, startReturnReceipt } from '../src/api/return-receipt.js' import { session } from '../src/stores/session.js' test('return receipt start normalization keeps only stable business facts', () => { assert.deepEqual(normalizeReturnReceiptStart({ returnNo: 'RT-001', status: 'PENDING_RECEIPT', expectedItems: [{ skuCode: 'SKU-1', productNameZh: '商品', expectedQuantity: '5', receivedQuantity: 2 }] }), { returnNo: 'RT-001', status: 'PENDING_RECEIPT', expectedItems: [{ skuCode: 'SKU-1', productNameZh: '商品', expectedQuantity: 5, receivedQuantity: 2 }], completedPallets: [], photos: [] }) }) test('SKU candidates do not expose the backend customer identifier to the page', () => { const value = normalizeReturnSkuCandidates({ skuCode: 'SKU-1', candidates: [{ returnNo: 'RT-001', customerId: '100', customerReferenceNo: 'REF-1', status: 'PARTIALLY_RECEIVED', skuExpectedQuantity: 5, skuReceivedQuantity: 1, orderExpectedQuantity: 8, orderReceivedQuantity: 2 }] }) assert.equal(value.candidates[0].returnNo, 'RT-001') assert.equal(value.candidates[0].customerReferenceNo, 'REF-1') assert.equal('customerId' in value.candidates[0], false) }) test('confirmed receipt normalization preserves generated carton and batch references', () => { assert.deepEqual(normalizeReturnReceiptResult({ returnNo: 'RT-001', receiptNo: 'RR-1', receiptBatchNo: 'RB-1', palletCode: 'PLT-1', orderStatus: 'COMPLETED', fullyMatched: true, expectedQuantity: 5, receivedQuantity: 5, signedAt: '2026-09-10T10:00:00' }), { returnNo: 'RT-001', receiptNo: 'RR-1', receiptBatchNo: 'RB-1', palletCode: 'PLT-1', orderStatus: 'COMPLETED', fullyMatched: true, expectedQuantity: 5, receivedQuantity: 5, signedAt: '2026-09-10T10:00:00' }) }) test('return receipt API calls only the dedicated PDA routes and preserves the receipt payload', async () => { const calls = [] session.apiBase = '/api'; session.token = 'return-token' globalThis.uni = { request(options) { calls.push({ method: options.method, url: options.url, data: options.data, authorization: options.header.Authorization }) let data if (options.url.endsWith('/start')) data = { returnNo: 'RT-001', status: 'PENDING_RECEIPT', expectedItems: [] } else if (options.url.endsWith('/sku-candidates')) data = { skuCode: 'SKU-1', candidates: [] } else data = { returnNo: 'RT-001', receiptNo: 'RR-1', receiptBatchNo: 'RB-1', palletCode: 'PLT-1', orderStatus: 'PARTIALLY_RECEIVED', fullyMatched: false, expectedQuantity: 5, receivedQuantity: 2 } options.success({ statusCode: 200, data: { code: '200', data }, header: {} }) } } await startReturnReceipt(' RT-001 ') await findReturnSkuCandidates(' SKU-1 ') const confirm = { returnNo: 'RT-001', trackingNo: 'TRACK-1', startedBy: 'SKU', palletCode: 'PLT-1', items: [{ skuCode: 'SKU-1', receivedQuantity: 2 }], idempotencyKey: 'return-key' } await confirmReturnReceipt(confirm) assert.deepEqual(calls.map((item) => item.url), [ '/api/pda/v1/last-leg/return-receipts/start', '/api/pda/v1/last-leg/return-receipts/sku-candidates', '/api/pda/v1/last-leg/return-receipts/confirm' ]) assert.deepEqual(calls[0].data, { returnNo: 'RT-001' }) assert.deepEqual(calls[1].data, { skuCode: 'SKU-1' }) assert.deepEqual(calls[2].data, confirm) assert.ok(calls.every((item) => item.authorization === 'Bearer return-token')) assert.ok(calls.every((item) => !Object.hasOwn(item.data || {}, 'customerId') && !Object.hasOwn(item.data || {}, 'warehouseId'))) }) test('return receipt lookup treats A0404 and HTTP 404 as empty results', async () => { session.apiBase = '/api'; session.token = 'return-token' let requestCount = 0 globalThis.uni = { request(options) { requestCount += 1 if (requestCount === 1) options.success({ statusCode: 404, data: { code: 'A0404', message: '当前仓没有待签收或签收中的退货单' }, header: {} }) else options.success({ statusCode: 404, data: {}, header: {} }) } } assert.equal(await startReturnReceipt('MISSING-RETURN'), null) assert.deepEqual(await findReturnSkuCandidates('MISSING-SKU'), { skuCode: 'MISSING-SKU', candidates: [] }) }) test('return receipt lookup still rejects real service errors', async () => { session.apiBase = '/api'; session.token = 'return-token' globalThis.uni = { request(options) { options.success({ statusCode: 500, data: { code: 'B0500', message: '服务暂不可用' }, header: {} }) } } await assert.rejects(() => startReturnReceipt('RT-001'), (error) => error.code === 'B0500') })