import test from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import vm from 'node:vm' import { parse, compileScript, compileTemplate } from 'vue/compiler-sfc' const filename = 'src/pages/return-packing/return-packing.vue' const { descriptor } = parse(readFileSync(new URL('../' + filename, import.meta.url), 'utf8')) function instance(api = {}) { let saved = {}, reset = false const component = vm.runInNewContext(descriptor.script.content.replace(/^\s*import .*$/gm, '').replace('export default', 'component ='), { component: null, PortalHeader: {}, ScanTargetInput: {}, ReturnBoxMergeWork: {}, session: {currentUser:{}}, playSuccessSound() {}, updateWarehouseWork(domain, patch) { saved = {...saved,...patch} }, resetWarehouseDomain() { reset = true }, ...api }) const page = {...component.data(), activePlan:{planNo:'P1'}, busy:true} for (const [key, method] of Object.entries(component.methods)) page[key] = method.bind(page) page.loadPlans = () => { page.plans = [{planNo:'P2'}] } return {page, saved:()=>saved, reset:()=>reset} } test('packing completion template compiles without a putaway prerequisite', () => { compileScript(descriptor, {id:'packing'}) assert.deepEqual(compileTemplate({source:descriptor.template.content,filename,id:'packing'}).errors,[]) assert.equal(descriptor.template.content.includes('确认上架'),false) }) test('unified scan resolves an actual carton and passes its SKU contents into box work', async () => { let skuCalls=0 const carton={cartonMark:'BOX1',customerId:'C1',items:[{skuCode:'SKU1',quantity:2}]} const {page,saved}=instance({scanReturnCarton:async()=>carton,findPackingOrders:async()=>{skuCalls++;return {}}}) page.activePlan=null;page.busy=false;page.selectedOrders=[] await page.search('BOX1') assert.equal(page.mode,'BOX');assert.equal(page.initialSource,carton) assert.equal(saved().initialSource.items[0].quantity,2);assert.equal(skuCalls,0) }) test('only carton not-found falls back to customer SKU stock; conflicts do not fall back', async () => { let skuCalls=0, queryError={code:'A0404'} const {page}=instance({scanReturnCarton:async()=>{throw queryError},findPackingOrders:async()=>{skuCalls++;return {customers:[{customerId:'C1',orders:[{returnNo:'R1'}],skus:[{skuCode:'SKU1',availableQuantity:3}]}]}}}) page.activePlan=null;page.busy=false;page.selectedOrders=[];page.searchCode='' page.setError=error=>{page.error=error} await page.search('SKU1') assert.equal(page.mode,'SKU');assert.equal(page.selectedCustomer.skus[0].availableQuantity,3) queryError={code:'A0409',message:'箱库存被占用'} await page.search('LOCKEDBOX') assert.equal(skuCalls,1);assert.equal(page.error.code,'A0409') }) test('existing target immediately clears work and returns to refreshed plans even during completion', () => { const {page,reset}=instance() page.packingCompleted({targetMode:'EXISTING',labels:[{cartonMark:'B'}]}) assert.equal(page.result,null) assert.equal(page.activePlan,null) assert.equal(reset(),true) assert.equal(page.plans[0].planNo,'P2') }) test('new target retains labels for printing and can return without putaway', () => { const {page,saved,reset}=instance() page.packingCompleted({targetMode:'NEW',labels:[{cartonMark:'NEW#1-1'}]}) assert.equal(saved().result.labels[0].cartonMark,'NEW#1-1') assert.equal(reset(),false) page.busy=false; page.nextPacking() assert.equal(page.result,null) assert.equal(reset(),true) })