import assert from 'node:assert/strict' import { existsSync, readFileSync } from 'node:fs' import test from 'node:test' import ts from 'typescript' import * as vue from 'vue' function loadFreightCalc() { const path = new URL('../src/composables/usePlFreightCalc.ts', import.meta.url) assert.ok(existsSync(path), 'usePlFreightCalc must exist') const source = readFileSync(path, 'utf8') const ast = ts.createSourceFile('usePlFreightCalc.ts', source, ts.ScriptTarget.Latest, true) const code = ast.statements .filter((node) => !ts.isImportDeclaration(node)) .map((node) => node.getText(ast)) .join('\n') const compiled = ts.transpileModule(code, { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.CommonJS } }).outputText const module = { exports: {} as Record } const requireStub = () => { throw new Error('unexpected require in freight calc test harness') } // eslint-disable-next-line no-new-func const factory = new Function( 'exports', 'require', 'module', '__filename', '__dirname', 'computed', 'ref', 'watch', compiled + '\nmodule.exports = { usePlFreightCalc, sumProductActualQuantities };' ) factory( module.exports, requireStub, module, 'usePlFreightCalc.ts', '.', vue.computed, vue.ref, vue.watch ) return module.exports as { usePlFreightCalc: typeof import('../src/composables/usePlFreightCalc').usePlFreightCalc } } test('resetFreightCalc re-sums transport qty from existing product actuals', async () => { const { usePlFreightCalc } = loadFreightCalc() const products = vue.ref([{ actualQty: 0.04, unit: '吨' }, { actualQty: 0.04, unit: '吨' }]) const hasFreight = vue.ref(1) const freightType = vue.ref('by_weight') const scope = vue.effectScope() const calc = scope.run(() => usePlFreightCalc({ products, hasFreight, freightType })) assert.ok(calc) await vue.nextTick() assert.equal(calc!.transportQty.value, 0.08) calc!.resetFreightCalc() await vue.nextTick() assert.equal(calc!.transportQtyTouched.value, false) assert.equal( calc!.transportQty.value, 0.08, 'reset after products already loaded must not leave transport qty empty' ) scope.stop() }) test('resetFreightCalc restores product sum after manual transport qty edit', async () => { const { usePlFreightCalc } = loadFreightCalc() const products = vue.ref([{ actualQty: 0.04, unit: '吨' }]) const hasFreight = vue.ref(1) const freightType = vue.ref('by_weight') const scope = vue.effectScope() const calc = scope.run(() => usePlFreightCalc({ products, hasFreight, freightType })) assert.ok(calc) await vue.nextTick() calc!.transportQty.value = 9.9 calc!.markTransportQtyTouched() calc!.resetFreightCalc() await vue.nextTick() assert.equal(calc!.transportQtyTouched.value, false) assert.equal(calc!.transportQty.value, 0.04) scope.stop() })