116 lines
3.9 KiB
JavaScript
116 lines
3.9 KiB
JavaScript
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)
|
|
})
|