import assert from 'node:assert/strict' import test from 'node:test' import { readFileSync } from 'node:fs' import ts from 'typescript' import * as vue from 'vue' import * as pinia from 'pinia' function compile(path, dependencies) { const source = readFileSync(new URL(path, import.meta.url), 'utf8') const code = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 } }).outputText const exports = {} new Function('require', 'exports', code)(id => { assert.ok(id in dependencies, id); return dependencies[id] }, exports) return exports } function harness(t) { const context = pinia.createPinia(); pinia.setActivePinia(context) t.after(() => pinia.disposePinia(context)) const calls = [] const behavior = { failWrite: false, failRead: false, version: 9, status: 'DRAFT' } const api = compile('../api/firstLeg.ts', { '@/api/http': { apiRequest: async config => { calls.push(structuredClone(config)) if (config.method === 'GET') { if (behavior.failRead) throw new Error('读取失败') return { order: { id: 'one', orderNo: 'FL-ONE', version: behavior.version, status: behavior.status, receivingWarehouseId: 'warehouse', destinationCountryCode: 'US' }, cargoes: [] } } if (behavior.failWrite) throw new Error('响应丢失') } } }) const module = compile('./firstLegOrders.ts', { vue, pinia, '@/modules/first-leg/api/firstLeg': api, '@/modules/first-leg/api/unifiedOrders': { getMerchantUnifiedOrder: async () => ({ summary: { orderId: 'one', mainStatus: null }, order: { order: { id: 'one', status: behavior.status, version: behavior.version, receivingWarehouseId: 'warehouse' } }, timeline: [] }), isUnifiedOrderQueryUnavailable: () => false, }, '@/modules/first-leg/utils/firstLegOrder': { canClientEditFirstLegOrder: status => status === 'DRAFT', getFirstLegStatusLabel: value => value }, '@/modules/first-leg/utils/warehousePagination': {}, }) const store = module.useFirstLegOrdersStore() store.warehouses = [{ id: 'warehouse', name: '国内仓', warehouseType: 'DOMESTIC' }] const draft = { receivingWarehouseId: 'warehouse', destinationType: 'PRIVATE', destinationCountryCode: 'US', items: [], customerRemark: '原草稿' } return { store, api, calls, behavior, draft } } test('raw and unified cancelled detail remain CANCELLED even when unified mainStatus is null', async t => { const h = harness(t) h.behavior.status = 'CANCELLED' const raw = await h.store.loadDraftDetail('one') assert.equal(raw.status, 'CANCELLED') const unified = await h.store.loadDetail('one') assert.equal(unified.status, 'CANCELLED') h.behavior.status = 'APPROVED' const unknown = await h.store.loadDetail('one') assert.notEqual(unknown.status, 'CANCELLED', 'unknown summary must not be reclassified as cancellation') }) test('cancelled detail summary has no pending overseas synchronization entries', () => { const source = readFileSync(new URL('../views/FirstLegOrdersView.vue', import.meta.url), 'utf8') const script = source.match(/