| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 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)
- })
|