import test from 'node:test' import assert from 'node:assert/strict' import { readFile } from 'node:fs/promises' const page = await readFile(new URL('../src/pages/relabel/relabel.vue', import.meta.url), 'utf8') const helper = await readFile(new URL('../src/utils/return-relabel.js', import.meta.url), 'utf8') const { returnDeductions, requiresReturnPack, returnPackFacts } = await import('data:text/javascript;base64,' + Buffer.from(helper).toString('base64')) const body = page.split('')[0].replace(/^\s*import .*$/gm, '').replace('export default', 'return') const component = new Function('PortalHeader', 'RelabelPalletWork', 'ScanTargetInput', 'ReturnRelabelPackWork', 'requiresReturnPack', 'returnPackFacts', body)({}, {}, {}, {}, requiresReturnPack, returnPackFacts) test('return carton and normal SKU use single scans; explicit source scan is reserved for bulk quantities', () => { assert.doesNotMatch(page, /退货箱唛换标必须先确认同一来源包裹\/箱/) assert.doesNotMatch(page, /v-if="isReturnTask && taskTab !== 'carton'"/) assert.match(page, /v-if="isReturnBulk" class="section-gap">先扫描来源/) assert.match(page, /this.activeTarget = value === 'carton' \? 'quick-carton'/) assert.match(page, /this\.taskTab === 'carton' \? 'quick-carton' : 'quick-sku'/) }) test('whole carton and full SKU relabel hide new box dimensions; partial SKU keeps isolation form', () => { const value = { isReturnTask: true, current: { items: [{ returnCartonId: '1', cartonMark: 'C1', operationType: 'CARTON_LABEL', returnQuantity: 15 }], history: [] } } assert.equal(component.computed.showReturnPack.call(value), false) value.current.items[0].operationType = 'SKU_LABEL' value.current.items[0].skuItems = [{ skuCode: 'A', quantity: 15 }] assert.equal(component.computed.showReturnPack.call(value), false) value.current.items[0].skuItems[0].quantity = 5 assert.equal(component.computed.showReturnPack.call(value), true) assert.match(page, /ReturnRelabelPackWork v-if="showReturnPack"/) }) test('one return carton scan saves label stage without a prior source scan; unrelated carton is rejected', async () => { const calls = [] const item = { itemId: 'I1', cartonMark: 'C1', operationType: 'CARTON_LABEL', fbaCartonMark: 'FBA1' } const result = { relabelNo: 'RL1', version: 1, items: [{ ...item, relabelledPackages: 1 }] } const subject = new Function('PortalHeader', 'RelabelPalletWork', 'ScanTargetInput', 'ReturnRelabelPackWork', 'scanRelabelCarton', 'warehouseIdempotencyKey', 'releaseWarehouseKey', 'uni', body)( {}, {}, {}, {}, async (no, payload) => { calls.push({ no, payload }); return result }, () => ({ value: 'KEY', signature: 'SIG' }), () => {}, { showModal: options => options.complete() } ) const value = { busy: false, current: { relabelNo: 'RL1', version: 0, items: [item] }, verifiedReturnCarton: '', run: async (action, work) => work(), applyCurrent(task) { this.current = task }, setError(error) { this.error = error.message } } await subject.methods.submitCarton.call(value, ' C1\n') assert.deepEqual(calls, [{ no: 'RL1', payload: { cartonMark: 'C1', expectedVersion: 0, idempotencyKey: 'KEY' } }]) assert.equal(value.current.version, 1) assert.equal(value.lastCarton.fbaCartonMark, 'FBA1') await subject.methods.submitCarton.call(value, 'OTHER') assert.equal(calls.length, 1) assert.match(value.error, /不属于本单/) }) test('mixed return carton keeps one physical package while SKU deductions use pieces', () => { const task={items:[{returnCartonId:'1',cartonMark:'P1',operationType:'CARTON_AND_SKU',returnQuantity:5,skuItems:[{skuCode:'S',quantity:5}]}]} assert.deepEqual(returnDeductions(task),[{cartonMark:'P1',skuCode:'S',quantity:5}]) })