Files
shanxia2.0/web-admin/scripts/vehicle-personnel-save.test.ts

79 lines
2.9 KiB
TypeScript

import assert from 'node:assert/strict'
import test from 'node:test'
import { readFileSync } from 'node:fs'
import ts from 'typescript'
function submitHandler(path: string, context: Record<string, any>) {
const source = readFileSync(new URL(path, import.meta.url), 'utf8')
const script = source.match(/<script[^>]*>([\s\S]*?)<\/script>/)?.[1]
assert.ok(script)
const ast = ts.createSourceFile('page.ts', script, ts.ScriptTarget.Latest, true)
const node = ast.statements.find(
(statement) => ts.isFunctionDeclaration(statement) && statement.name?.text === 'handleSubmit'
)
assert.ok(node)
const js = ts.transpileModule(node.getText(ast), {
compilerOptions: { target: ts.ScriptTarget.ES2022 }
}).outputText
return new Function(...Object.keys(context), `${js}; return handleSubmit`)(
...Object.values(context)
)
}
for (const page of [
'../src/views/pl/vehicle/index.vue',
'../src/views/pl/self-vehicle/index.vue',
'../src/components/business/pl-vehicle-form-dialog/index.vue'
]) {
test(`${page}: saving and clearing personnel remarks preserves identity`, async () => {
const requests: any[] = []
const person = {
personnelId: 'person-existing',
personnelName: '司机',
role: 'driver',
isDefault: 1,
remark: '原备注'
}
const context = {
formRef: { value: { validate: async () => true } },
validateSubTables: () => true,
certFormListRef: { value: null },
photoUploadRef: { value: null },
formData: { id: 'vehicle-existing', licensePlate: '车牌', vehicleType: 'self' },
carrierList: { value: [] },
submitLoading: { value: false },
personnelList: { value: [person] },
certList: { value: [] },
isEdit: { value: true },
dialogVisible: { value: true },
visible: { value: true },
props: { vehicleType: 'self' },
VEHICLE_TYPE_SELF: 'self',
vehicleApi: {
update: async (id: string, payload: any) => {
assert.equal(id, 'vehicle-existing')
requests.push(JSON.parse(JSON.stringify(payload)))
},
get: async () => ({ data: { id: 'vehicle-existing' } })
},
pickBxData: (response: any) => response.data,
ElMessage: { success() {}, warning() {}, error(message: string) { assert.fail(message) } },
emit() {},
fetchData() {}
}
const submit = submitHandler(page, context)
await submit()
person.remark = ''
person.isDefault = 0
await submit()
assert.equal(requests.length, 2)
assert.equal(requests[0].personnelList[0].remark, '原备注')
const saved = requests[1].personnelList[0]
assert.equal(saved.personnelId, 'person-existing')
assert.equal(saved.isDefault, 0)
assert.equal(saved.remark, '', 'explicitly cleared remark must survive JSON serialization')
assert.equal(Object.hasOwn(saved, 'phoneNo'), false, 'omitted read-only phone stays omitted')
assert.equal(context.submitLoading.value, false)
})
}