| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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, [])
- })
|