修复财务页面竞态并整理采购与运输展示
This commit is contained in:
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module'
|
||||
import { enableAutoUnmount, flushPromises, mount, type VueWrapper } from '@vue/test-utils'
|
||||
import { createMemoryHistory, createRouter } from 'vue-router'
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { ApiResponseError } from '@/shared/api/http'
|
||||
import OperationErrorToast from '@/shared/components/OperationErrorToast.vue'
|
||||
import { preferenceStorageKey } from '@/shared/utils/uiLayoutPreference'
|
||||
@@ -295,4 +295,46 @@ describe('formal settlement native dialogs', () => {
|
||||
expect(prompt).toHaveBeenCalledWith('请输入操作原因', expect.stringContaining(current.settlementNo), expect.objectContaining({ customClass: 'admin-density-confirm admin-workbench', inputPattern: /\S+/ }))
|
||||
expect(api.actionFinanceSettlement).toHaveBeenCalledWith(current.id, { action, reason: '测试原因', expectedVersion: current.version })
|
||||
})
|
||||
it('shows a concise reopen conflict message and retains both the voided and replacement receivables', async () => {
|
||||
const voided = { ...ar, status: 'VOIDED' }
|
||||
const replacement = { ...ar, id: '9223372036854775012', settlementNo: 'AR202610200002' }
|
||||
vi.mocked(api.listFinanceReceivableSettlements).mockResolvedValue([voided, replacement])
|
||||
vi.mocked(api.actionFinanceSettlement).mockRejectedValue(new ApiResponseError(
|
||||
'原对账单已生成其他有效应收结算单', 'FIN_409', 409, null, 'reopen-test-request', 'reopen-test-trace',
|
||||
))
|
||||
vi.spyOn(ElMessageBox, 'prompt').mockResolvedValue(Object.assign('confirm', { value: '测试重开', action: 'confirm' as const }))
|
||||
const message = vi.spyOn(ElMessage, 'error')
|
||||
const wrapper = await mountPage('receivable')
|
||||
|
||||
for (let attempt = 1; attempt <= 2; attempt += 1) {
|
||||
await click(wrapper, '重开', '.el-table__body-wrapper button')
|
||||
expect(message).toHaveBeenCalledTimes(attempt)
|
||||
expect(message).toHaveBeenLastCalledWith({ message: '已有新的应收单,无法重开', showClose: true, duration: 4500 })
|
||||
}
|
||||
|
||||
expect(api.actionFinanceSettlement).toHaveBeenLastCalledWith(ar.id, { action: 'REOPEN', reason: '测试重开', expectedVersion: ar.version })
|
||||
expect(errorDetails(wrapper)).toMatchObject({ message: '已有新的应收单,无法重开', code: 'FIN_409', requestId: 'reopen-test-request', traceId: 'reopen-test-trace' })
|
||||
const list = wrapper.get('.el-table__body-wrapper')
|
||||
expect(list.text()).toContain(voided.settlementNo)
|
||||
expect(list.text()).toContain(replacement.settlementNo)
|
||||
expect(wrapper.text()).not.toContain('加载失败')
|
||||
expect(wrapper.text()).not.toContain('reopen-test-request')
|
||||
expect(wrapper.text()).not.toContain('reopen-test-trace')
|
||||
})
|
||||
it.each([
|
||||
['receivable', 'VOID', 'ISSUED'], ['receivable', 'REOPEN', 'VOIDED'],
|
||||
['payable', 'VOID', 'ISSUED'], ['payable', 'REOPEN', 'VOIDED'],
|
||||
] as const)('retains the %s list and original diagnostics when %s fails', async (kind, action, status) => {
|
||||
const current = kind === 'receivable' ? ar : ap
|
||||
if (kind === 'receivable') vi.mocked(api.listFinanceReceivableSettlements).mockResolvedValue([{ ...ar, status }])
|
||||
else vi.mocked(api.listFinancePayableSettlements).mockResolvedValue([{ ...ap, status }])
|
||||
vi.mocked(api.actionFinanceSettlement).mockRejectedValue(failure())
|
||||
vi.spyOn(ElMessageBox, 'prompt').mockResolvedValue(Object.assign('confirm', { value: '测试原因', action: 'confirm' as const }))
|
||||
const wrapper = await mountPage(kind)
|
||||
await click(wrapper, action === 'VOID' ? '作废' : '重开', '.el-table__body-wrapper button')
|
||||
|
||||
expect(errorDetails(wrapper)).toMatchObject({ message: '测试操作失败', code: 'TEST_REJECTED', requestId: 'settlement-test-request' })
|
||||
expect(wrapper.get('.el-table__body-wrapper').text()).toContain(current.settlementNo)
|
||||
expect(wrapper.text()).not.toContain('加载失败')
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user