vehicle-fuel-card.test.mjs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import assert from 'node:assert/strict'
  2. import { existsSync, readFileSync } from 'node:fs'
  3. import test from 'node:test'
  4. import { parse } from '@vue/compiler-sfc'
  5. import ts from 'typescript'
  6. import * as vue from 'vue'
  7. const file = new URL('../src/views/pl/vehicle-fuel-card/index.vue', import.meta.url)
  8. function setup(api) {
  9. assert.ok(existsSync(file), '车油卡页面尚未实现')
  10. const source = parse(readFileSync(file, 'utf8')).descriptor.scriptSetup.content
  11. const tree = ts.createSourceFile('page.ts', source, ts.ScriptTarget.Latest, true)
  12. const code = tree.statements
  13. .filter((n) => !ts.isImportDeclaration(n))
  14. .map((n) => n.getText(tree))
  15. .join('\n')
  16. const bindings = {
  17. ref: vue.ref,
  18. reactive: vue.reactive,
  19. computed: vue.computed,
  20. nextTick: vue.nextTick,
  21. onMounted: () => {},
  22. onBeforeUnmount: () => {},
  23. defineOptions: () => {},
  24. useListTableViewportHeight: () => ({ tableHeight: vue.ref(400), recalc: () => {} }),
  25. vehicleFuelCardApi: api,
  26. ElMessage: { success: () => {}, error: () => {} },
  27. ElMessageBox: { confirm: async () => {} }
  28. }
  29. return new Function(
  30. ...Object.keys(bindings),
  31. ts.transpile(code) +
  32. ';return { loadData, tableData, pagination, loading, formRef, formData, editingId, handleSubmit, dialogVisible, submitLoading, handleEdit, handleDelete }'
  33. )(...Object.values(bindings))
  34. }
  35. const deferred = () => {
  36. let resolve, reject
  37. const promise = new Promise((a, b) => {
  38. resolve = a
  39. reject = b
  40. })
  41. return { promise, resolve, reject }
  42. }
  43. test('新列表结果不被旧请求覆盖,旧请求不提前结束新请求 loading', async () => {
  44. const requests = [deferred(), deferred(), deferred(), deferred()]
  45. let i = 0
  46. const page = setup({ list: () => requests[i++].promise })
  47. const a = page.loadData(),
  48. b = page.loadData()
  49. requests[1].resolve({ list: [{ id: 'new' }], total: 1 })
  50. await b
  51. requests[0].resolve({ list: [{ id: 'old' }], total: 8 })
  52. await a
  53. assert.equal(page.tableData.value[0].id, 'new')
  54. assert.equal(page.pagination.total, 1)
  55. const c = page.loadData(),
  56. d = page.loadData()
  57. requests[2].resolve({ list: [], total: 0 })
  58. await c
  59. assert.equal(page.loading.value, true)
  60. requests[3].reject(new Error('offline'))
  61. await d
  62. assert.equal(page.loading.value, false)
  63. assert.deepEqual(page.tableData.value, [])
  64. })
  65. test('编辑完整提交所有字段,长卡号与前导零保持原样,空备注可清除', async () => {
  66. let payload
  67. const row = {
  68. id: '1',
  69. licensePlate: '沪A12345',
  70. cardNo: '000100001234567890123456789012345',
  71. remark: '旧备注'
  72. }
  73. const page = setup({
  74. get: async () => row,
  75. update: async (id, data) => {
  76. payload = data
  77. return { ...row, ...data }
  78. },
  79. list: async () => ({ list: [], total: 0 })
  80. })
  81. await page.handleEdit(row)
  82. assert.equal(page.formData.remark, '旧备注')
  83. assert.equal(page.formData.cardNo, row.cardNo)
  84. page.formData.remark = ''
  85. page.formRef.value = { validate: async () => true }
  86. await page.handleSubmit()
  87. assert.deepEqual(payload, { licensePlate: row.licensePlate, cardNo: row.cardNo, remark: null })
  88. assert.equal(page.dialogVisible.value, false)
  89. })
  90. test('保存失败保留输入与弹窗并恢复按钮,校验失败不提交', async () => {
  91. let calls = 0
  92. const page = setup({
  93. create: async () => {
  94. calls++
  95. throw new Error('offline')
  96. }
  97. })
  98. page.dialogVisible.value = true
  99. page.formData.licensePlate = '沪A12345'
  100. page.formData.cardNo = '00123'
  101. page.formRef.value = { validate: async () => true }
  102. await page.handleSubmit()
  103. assert.equal(calls, 1)
  104. assert.equal(page.dialogVisible.value, true)
  105. assert.equal(page.submitLoading.value, false)
  106. assert.equal(page.formData.cardNo, '00123')
  107. page.formRef.value = {
  108. validate: async () => {
  109. throw new Error('invalid')
  110. }
  111. }
  112. await page.handleSubmit()
  113. assert.equal(calls, 1)
  114. assert.equal(page.submitLoading.value, false)
  115. })