warningPublishAction.test.mjs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import test from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import { readFileSync } from 'node:fs'
  4. import { reactive, ref } from 'vue'
  5. import { parse } from '@vue/compiler-sfc'
  6. const read = path => readFileSync(new URL(path, import.meta.url), 'utf8')
  7. const script = parse(read('../src/views/subSystem/lifeCompany/components/WarningPublishAction.vue')).descriptor.scriptSetup.content
  8. .replace(/^import .*\r?\n/gm, '')
  9. const person = name => ({ userName: name, nickName: name, deptName: '设备所属公司' })
  10. function setup({ eligible = true, candidates } = {}) {
  11. const calls = [], published = [], events = []
  12. const props = reactive({ row: { warningId: 'w1', availableActions: ['PUBLISH'] } })
  13. const api = async query => {
  14. calls.push(query)
  15. if (candidates) return candidates(query)
  16. // 当前用户不在第一页;默认值也必须经过服务端 reviewer 候选校验。
  17. return { data: { records: query.keyword === 'current' ? (eligible ? [person('current')] : []) : [person('other')] } }
  18. }
  19. const factory = new Function('reactive', 'ref', 'ElMessage', 'useUserStore', 'getWarningParticipants',
  20. 'releaseYjxxData', 'defineProps', 'defineEmits',
  21. `${script}; return { visible, handler, reviewer, options, open, submit }`)
  22. const state = factory(reactive, ref, { warning() {}, error() {}, success() {} }, () => ({ name: 'current' }),
  23. api, async (id, data) => { published.push({ id, data }); return { code: 200 } },
  24. () => props, () => event => events.push(event))
  25. return { ...state, props, calls, published, events }
  26. }
  27. test('有核验资格才默认当前账户,处置人始终明确选择', async () => {
  28. for (const eligible of [true, false]) {
  29. const s = setup({ eligible })
  30. await s.open()
  31. assert.equal(s.handler.value, '')
  32. assert.equal(s.reviewer.value, eligible ? 'current' : '')
  33. if (eligible) assert.ok(s.options.reviewer.some(p => p.userName === 'current'))
  34. assert.ok(s.calls.every(q => q.warningId === 'w1'))
  35. }
  36. })
  37. test('默认核验人可改选,发布携带实际选择并通知列表刷新', async () => {
  38. const s = setup()
  39. await s.open()
  40. s.handler.value = 'handler'
  41. s.reviewer.value = 'other'
  42. await s.submit()
  43. assert.deepEqual(s.published, [{ id: 'w1', data: { handler: 'handler', reviewer: 'other' } }])
  44. assert.equal(s.visible.value, false)
  45. assert.deepEqual(s.events, ['changed'])
  46. })
  47. test('异步默认值不会覆盖手工选择,也不会跨预警或跨弹窗回填', async () => {
  48. let resolveDefault
  49. const s = setup({ candidates: query => query.keyword === 'current'
  50. ? new Promise(resolve => { resolveDefault = resolve }) : Promise.resolve({ data: { records: [person('other')] } }) })
  51. const first = s.open()
  52. await new Promise(resolve => setImmediate(resolve))
  53. s.reviewer.value = 'other'
  54. resolveDefault({ data: { records: [person('current')] } })
  55. await first
  56. assert.equal(s.reviewer.value, 'other')
  57. const oldSession = s.open()
  58. await new Promise(resolve => setImmediate(resolve))
  59. const finishOld = resolveDefault
  60. s.visible.value = false
  61. s.props.row.warningId = 'w2'
  62. const newSession = s.open()
  63. await new Promise(resolve => setImmediate(resolve))
  64. finishOld({ data: { records: [person('current')] } })
  65. await oldSession
  66. assert.equal(s.reviewer.value, '')
  67. resolveDefault({ data: { records: [] } })
  68. await newSession
  69. assert.equal(s.reviewer.value, '')
  70. })
  71. test('预警发布列表同样只根据服务端核验候选默认当前账户', async () => {
  72. const source = parse(read('../src/views/subSystem/lifeCompany/lAlertInformation/LRelease.vue')).descriptor.scriptSetup.content
  73. const code = source.slice(source.indexOf('async function handlePublish('), source.indexOf('async function submitPublish('))
  74. for (const eligible of [true, false]) {
  75. const form = reactive({ handler: 'old', reviewer: 'old' })
  76. const run = new Function('publishRow', 'publishForm', 'publishVisible', 'currentUser', 'getWarningParticipants', 'ElMessage',
  77. `let publishDialogVersion = 0; ${code}; return handlePublish`)(ref(null), form, ref(false), { name: 'current' },
  78. async query => { assert.equal(query.role, 'reviewer'); return { data: { records: eligible ? [person('current')] : [] } } }, { warning() {} })
  79. await run({ warningId: 'w1' })
  80. assert.equal(form.handler, '')
  81. assert.equal(form.reviewer, eligible ? 'current' : '')
  82. }
  83. })