import assert from 'node:assert/strict' import { existsSync, readFileSync } from 'node:fs' import test from 'node:test' import { parse } from '@vue/compiler-sfc' import ts from 'typescript' import * as vue from 'vue' const file = new URL('../src/views/pl/vehicle-fuel-card/index.vue', import.meta.url) function setup(api) { assert.ok(existsSync(file), '车油卡页面尚未实现') const source = parse(readFileSync(file, 'utf8')).descriptor.scriptSetup.content const tree = ts.createSourceFile('page.ts', source, ts.ScriptTarget.Latest, true) const code = tree.statements .filter((n) => !ts.isImportDeclaration(n)) .map((n) => n.getText(tree)) .join('\n') const bindings = { ref: vue.ref, reactive: vue.reactive, computed: vue.computed, nextTick: vue.nextTick, onMounted: () => {}, onBeforeUnmount: () => {}, defineOptions: () => {}, useListTableViewportHeight: () => ({ tableHeight: vue.ref(400), recalc: () => {} }), vehicleFuelCardApi: api, ElMessage: { success: () => {}, error: () => {} }, ElMessageBox: { confirm: async () => {} } } return new Function( ...Object.keys(bindings), ts.transpile(code) + ';return { loadData, tableData, pagination, loading, formRef, formData, editingId, handleSubmit, dialogVisible, submitLoading, handleEdit, handleDelete }' )(...Object.values(bindings)) } const deferred = () => { let resolve, reject const promise = new Promise((a, b) => { resolve = a reject = b }) return { promise, resolve, reject } } test('新列表结果不被旧请求覆盖,旧请求不提前结束新请求 loading', async () => { const requests = [deferred(), deferred(), deferred(), deferred()] let i = 0 const page = setup({ list: () => requests[i++].promise }) const a = page.loadData(), b = page.loadData() requests[1].resolve({ list: [{ id: 'new' }], total: 1 }) await b requests[0].resolve({ list: [{ id: 'old' }], total: 8 }) await a assert.equal(page.tableData.value[0].id, 'new') assert.equal(page.pagination.total, 1) const c = page.loadData(), d = page.loadData() requests[2].resolve({ list: [], total: 0 }) await c assert.equal(page.loading.value, true) requests[3].reject(new Error('offline')) await d assert.equal(page.loading.value, false) assert.deepEqual(page.tableData.value, []) }) test('编辑完整提交所有字段,长卡号与前导零保持原样,空备注可清除', async () => { let payload const row = { id: '1', licensePlate: '沪A12345', cardNo: '000100001234567890123456789012345', remark: '旧备注' } const page = setup({ get: async () => row, update: async (id, data) => { payload = data return { ...row, ...data } }, list: async () => ({ list: [], total: 0 }) }) await page.handleEdit(row) assert.equal(page.formData.remark, '旧备注') assert.equal(page.formData.cardNo, row.cardNo) page.formData.remark = '' page.formRef.value = { validate: async () => true } await page.handleSubmit() assert.deepEqual(payload, { licensePlate: row.licensePlate, cardNo: row.cardNo, remark: null }) assert.equal(page.dialogVisible.value, false) }) test('保存失败保留输入与弹窗并恢复按钮,校验失败不提交', async () => { let calls = 0 const page = setup({ create: async () => { calls++ throw new Error('offline') } }) page.dialogVisible.value = true page.formData.licensePlate = '沪A12345' page.formData.cardNo = '00123' page.formRef.value = { validate: async () => true } await page.handleSubmit() assert.equal(calls, 1) assert.equal(page.dialogVisible.value, true) assert.equal(page.submitLoading.value, false) assert.equal(page.formData.cardNo, '00123') page.formRef.value = { validate: async () => { throw new Error('invalid') } } await page.handleSubmit() assert.equal(calls, 1) assert.equal(page.submitLoading.value, false) })