import test from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { reactive, ref } from 'vue' import { parse } from '@vue/compiler-sfc' const read = path => readFileSync(new URL(path, import.meta.url), 'utf8') const script = parse(read('../src/views/subSystem/lifeCompany/components/WarningPublishAction.vue')).descriptor.scriptSetup.content .replace(/^import .*\r?\n/gm, '') const person = name => ({ userName: name, nickName: name, deptName: '设备所属公司' }) function setup({ eligible = true, candidates } = {}) { const calls = [], published = [], events = [] const props = reactive({ row: { warningId: 'w1', availableActions: ['PUBLISH'] } }) const api = async query => { calls.push(query) if (candidates) return candidates(query) // 当前用户不在第一页;默认值也必须经过服务端 reviewer 候选校验。 return { data: { records: query.keyword === 'current' ? (eligible ? [person('current')] : []) : [person('other')] } } } const factory = new Function('reactive', 'ref', 'ElMessage', 'useUserStore', 'getWarningParticipants', 'releaseYjxxData', 'defineProps', 'defineEmits', `${script}; return { visible, handler, reviewer, options, open, submit }`) const state = factory(reactive, ref, { warning() {}, error() {}, success() {} }, () => ({ name: 'current' }), api, async (id, data) => { published.push({ id, data }); return { code: 200 } }, () => props, () => event => events.push(event)) return { ...state, props, calls, published, events } } test('有核验资格才默认当前账户,处置人始终明确选择', async () => { for (const eligible of [true, false]) { const s = setup({ eligible }) await s.open() assert.equal(s.handler.value, '') assert.equal(s.reviewer.value, eligible ? 'current' : '') if (eligible) assert.ok(s.options.reviewer.some(p => p.userName === 'current')) assert.ok(s.calls.every(q => q.warningId === 'w1')) } }) test('默认核验人可改选,发布携带实际选择并通知列表刷新', async () => { const s = setup() await s.open() s.handler.value = 'handler' s.reviewer.value = 'other' await s.submit() assert.deepEqual(s.published, [{ id: 'w1', data: { handler: 'handler', reviewer: 'other' } }]) assert.equal(s.visible.value, false) assert.deepEqual(s.events, ['changed']) }) test('异步默认值不会覆盖手工选择,也不会跨预警或跨弹窗回填', async () => { let resolveDefault const s = setup({ candidates: query => query.keyword === 'current' ? new Promise(resolve => { resolveDefault = resolve }) : Promise.resolve({ data: { records: [person('other')] } }) }) const first = s.open() await new Promise(resolve => setImmediate(resolve)) s.reviewer.value = 'other' resolveDefault({ data: { records: [person('current')] } }) await first assert.equal(s.reviewer.value, 'other') const oldSession = s.open() await new Promise(resolve => setImmediate(resolve)) const finishOld = resolveDefault s.visible.value = false s.props.row.warningId = 'w2' const newSession = s.open() await new Promise(resolve => setImmediate(resolve)) finishOld({ data: { records: [person('current')] } }) await oldSession assert.equal(s.reviewer.value, '') resolveDefault({ data: { records: [] } }) await newSession assert.equal(s.reviewer.value, '') }) test('预警发布列表同样只根据服务端核验候选默认当前账户', async () => { const source = parse(read('../src/views/subSystem/lifeCompany/lAlertInformation/LRelease.vue')).descriptor.scriptSetup.content const code = source.slice(source.indexOf('async function handlePublish('), source.indexOf('async function submitPublish(')) for (const eligible of [true, false]) { const form = reactive({ handler: 'old', reviewer: 'old' }) const run = new Function('publishRow', 'publishForm', 'publishVisible', 'currentUser', 'getWarningParticipants', 'ElMessage', `let publishDialogVersion = 0; ${code}; return handlePublish`)(ref(null), form, ref(false), { name: 'current' }, async query => { assert.equal(query.role, 'reviewer'); return { data: { records: eligible ? [person('current')] : [] } } }, { warning() {} }) await run({ warningId: 'w1' }) assert.equal(form.handler, '') assert.equal(form.reviewer, eligible ? 'current' : '') } })