Files
shanxia2.0/web-admin/scripts/vehicle-fuel-card.test.mjs

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