Files
pda-overseas-uniapp/tests/return-packing-completion.test.mjs
2026-10-14 11:43:44 +08:00

76 lines
3.8 KiB
JavaScript

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, ReturnLabelConfirmation: {}, 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('unknown SKU cannot silently choose parcel sources; occupied sources retain the conflict', async () => {
let skuCalls=0, queryError={code:'A0404'}
const {page}=instance({scanReturnCarton:async()=>{throw queryError},findPackingOrders:async()=>{skuCalls++;return {}}})
page.activePlan=null;page.busy=false;page.selectedOrders=[];page.searchCode=''
page.setError=error=>{page.error=error}
await page.search('SKU1')
assert.match(page.error.message,/扫描来源包裹/)
assert.equal(skuCalls,0)
queryError={code:'A0409',message:'箱库存被占用'}
await page.search('BOX1')
assert.equal(page.error.message,'箱库存被占用');assert.equal(skuCalls,0)
})
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(page.busy,false)
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)
})
test('completed packing can return to plans even when the page busy flag is stale', () => {
const {page,reset}=instance()
page.result={labels:[{cartonMark:'NEW#1-1'}]}
page.nextPacking()
assert.equal(page.result,null)
assert.equal(reset(),true)
assert.equal(page.plans[0].planNo,'P2')
assert.doesNotMatch(descriptor.template.content, /<button[^>]*:disabled[^>]*@tap="nextPacking"/)
})