import test from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import vm from 'node:vm' function setup(merge) { const saved = new Map() const context = vm.createContext({ reactive: value => value, PortalHeader: {}, ScanTargetInput: {}, playSuccessSound() {}, playErrorSound() {}, mergeReturnPackingPlan: merge, uni: { setStorageSync: (key, value) => saved.set(key, structuredClone(value)), getStorageSync: key => saved.get(key), removeStorageSync: key => saved.delete(key) } }) const store = readFileSync(new URL('../src/stores/warehouse-work.js', import.meta.url), 'utf8') vm.runInContext(store.replace(/^import .*$/mg, '').replace(/export /g, ''), context) const source = readFileSync(new URL('../src/pages/return-packing/return-packing.vue', import.meta.url), 'utf8') const script = source.match(/]*>([\s\S]*?)<\/script>/)[1] const component = vm.runInContext(script.replace(/^\s*import .*$/mg, '').replace('export default', 'globalThis.component ='), context) vm.runInContext("restoreWarehouseWork('operator:warehouse')", context) const page = Object.assign({}, component.methods, { canCompletePlan: true, busy: false, activePlan: { planNo: 'PLAN-1' }, planBoxes: [{ items: [{ skuCode: ' SKU-1 ', quantity: '2' }], length: 10, width: 20, height: 30, weight: 1 }], async loadPlans() {} }) return { page, restore: scope => vm.runInContext(`restoreWarehouseWork(${JSON.stringify(scope)})`, context), keys: () => vm.runInContext('warehouseWork.returnPackingPlan.pendingKeys', context) } } test('plan completion reaches API and preserves the key across lost responses and draft restore', async () => { const calls = []; let fail = true const fixture = setup(async (plan, payload) => { calls.push({ plan, payload }); if (fail) throw new Error('response lost'); return { labels: [] } }) await fixture.page.completePlan() assert.equal(calls.length, 1) assert.equal(fixture.page.error.message, 'response lost') assert.equal(fixture.page.busy, false) fixture.restore('operator:warehouse') fail = false await fixture.page.completePlan() assert.equal(calls.length, 2) assert.equal(calls[0].payload.idempotencyKey, calls[1].payload.idempotencyKey) assert.equal(calls[1].payload.boxes[0].items[0].skuCode, 'SKU-1') assert.equal(fixture.page.activePlan, null) assert.equal(Object.keys(fixture.keys()).length, 0) }) test('plan completion keys are not reused by another operator or warehouse', async () => { const keys = [] const fixture = setup(async (_plan, payload) => { keys.push(payload.idempotencyKey); throw new Error('response lost') }) await fixture.page.completePlan() fixture.restore('other-operator:warehouse') await fixture.page.completePlan() assert.equal(keys.length, 2) assert.notEqual(keys[0], keys[1]) })