import test from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { computed, nextTick, reactive, ref } from 'vue' import { parse } from '@vue/compiler-sfc' import AsyncValidator from 'async-validator' const read = path => readFileSync(new URL(path, import.meta.url), 'utf8') const script = parse(read('../src/views/subSystem/lifeCompany/components/WarningReviewAction.vue')).descriptor.scriptSetup.content .replace(/^import .*\r?\n/gm, '') const workflowSource = read('../src/views/subSystem/lifeCompany/warningWorkflow.js') const workflowActions = new Function(`${workflowSource.slice(workflowSource.indexOf('export function workflowActions')).replace('export ', '')}; return workflowActions`)() const Validator = AsyncValidator.default || AsyncValidator // Execute the component's setup with real Vue reactivity and the form validator; // replace only browser stores, messages and network requests. function setup({ permission = 'warning:warning:audit', row = {}, request } = {}) { const user = reactive({ name: 'reviewer', permissions: [permission] }) const props = reactive({ row: { warningId: 'w1', status: 'HANDLED', handler: 'handler', reviewer: 'reviewer', ...row } }) const calls = [], messages = [], events = [] const api = kind => async data => { calls.push({ kind, data }) return request ? request() : { code: 200 } } const auth = new Function('useUserStore', read('../src/plugins/auth.js') .replace(/^import .*\r?\n/gm, '').replace('export default', 'return'))(() => user) const factory = new Function('computed', 'nextTick', 'reactive', 'ref', 'ElMessage', 'auth', 'useUserStore', 'clearWarningData', 'returnWarningData', 'workflowActions', 'defineProps', 'defineEmits', `${script}; return { canReview, visible, busy, formRef, form, rules, open, submit, close }`) const state = factory(computed, nextTick, reactive, ref, { success: text => messages.push(text), error: text => messages.push(text), warning: text => messages.push(text) }, auth, () => user, api('clear'), api('return'), workflowActions, () => props, () => event => events.push(event)) state.formRef.value = { clearValidate() {}, validate: () => new Validator(state.rules).validate(state.form).then(() => true) } return { ...state, user, props, calls, messages, events } } test('核验仅对指定核验人、已处置状态及核验权限开放,处置权限不能替代', () => { assert.equal(setup().canReview.value, true) assert.equal(setup({ permission: 'warning:warning:handle' }).canReview.value, false) assert.equal(setup({ row: { reviewer: 'someone-else' } }).canReview.value, false) assert.equal(setup({ permission: '*:*:*', row: { reviewer: 'someone-else' } }).canReview.value, false) assert.equal(setup({ row: { status: 'PROCESSING' } }).canReview.value, false) assert.equal(setup({ row: { todo_type: 'DONE' } }).canReview.value, false) assert.equal(setup({ row: { reviewer: '', publisher: 'reviewer' } }).canReview.value, true) }) test('每次打开清空结果和意见,未选结果或空白意见不能提交', async () => { const s = setup() await s.open() assert.equal(s.form.result, '') await s.submit() s.form.result = 'CLEAR' s.form.opinion = ' ' await s.submit() assert.deepEqual(s.calls, []) s.form.opinion = '旧意见' await s.open() assert.deepEqual({ ...s.form }, { result: '', opinion: '' }) }) test('核查解除与退回办理分别调用既有接口,成功后关闭并刷新', async () => { for (const [result, kind, field] of [['CLEAR', 'clear', 'clearRemark'], ['RETURN', 'return', 'disposalContent']]) { const s = setup() await s.open() s.form.result = result s.form.opinion = ' 核验意见 ' await s.submit() assert.deepEqual(s.calls, [{ kind, data: { warningId: 'w1', [field]: '核验意见' } }]) assert.equal(s.visible.value, false) assert.deepEqual(s.events, ['changed']) } }) test('接口失败保留表单,提交期间禁止重复提交或关闭', async () => { let resolveRequest const s = setup({ request: () => new Promise(resolve => { resolveRequest = resolve }) }) await s.open() s.form.result = 'RETURN' s.form.opinion = '需要补充处置' const first = s.submit() await nextTick() await new Promise(resolve => setImmediate(resolve)) assert.equal(s.busy.value, true) await s.submit() let closed = false s.close(() => { closed = true }) assert.equal(closed, false) assert.equal(s.calls.length, 1) resolveRequest({ code: 500, msg: '状态已经改变' }) await first assert.equal(s.busy.value, false) assert.equal(s.visible.value, true) assert.equal(s.form.opinion, '需要补充处置') assert.deepEqual(s.events, []) })