Files
workspace/code/fms/fms-vue/tests/unit/delete-confirm-regression.spec.js
T
2026-09-03 17:30:39 +08:00

152 lines
5.3 KiB
JavaScript

import { mount } from '@vue/test-utils'
import { describe, expect, it, vi, beforeAll, beforeEach } from 'vitest'
import { createPinia, setActivePinia } from 'pinia'
import { nextTick } from 'vue'
import { registerFeature, useAreaSelection } from 'stk-table-vue'
import ModuleQueryConfigPanel from '@/views/module/module-management/ModuleQueryConfigPanel.vue'
import ModuleI18nPanel from '@/views/module/module-management/ModuleI18nPanel.vue'
registerFeature(useAreaSelection)
beforeAll(() => {
Object.defineProperty(HTMLElement.prototype, 'clientWidth', {
configurable: true,
get() { return 5000 }
})
})
vi.mock('@/services/api', () => ({
loadDataApi: vi.fn(async () => ({ data: [] })),
saveObjectApi: vi.fn(),
nextIdApi: vi.fn(),
describeApi: vi.fn(),
}))
const fields = [
{ b_id: '1', b_name: '姓名', b_field: 'name', b_type: 'input', b_canuse: 1 }
]
describe('module-management 删除(单个无确认弹窗 + 批量)', () => {
beforeEach(() => setActivePinia(createPinia()))
async function settle() {
await nextTick()
await new Promise((r) => setTimeout(r, 50))
}
async function clickDelete(wrapper) {
const trs = wrapper.findAll('.stk-tbody-main tr')
expect(trs.length).toBeGreaterThan(0)
const delBtn = trs[0].find('button.fms-action-btn')
expect(delBtn, '行内删除按钮应存在').toBeTruthy()
await delBtn.trigger('click')
await settle()
}
async function checkNoModal() {
expect(document.body.querySelector('.fms-modal'), '删除不应弹出确认弹窗').toBeNull()
}
async function selectRowCheckbox(wrapper, index = 0) {
const trs = wrapper.findAll('.stk-tbody-main tr')
expect(trs.length).toBeGreaterThan(0)
const checkbox = trs[index].find('input[type="checkbox"]')
expect(checkbox, '行复选框应存在').toBeTruthy()
await checkbox.setValue(true)
await settle()
}
async function clickToolbarBatch(wrapper) {
const btn = wrapper.findAll('button').find((b) => b.text().includes('批量删除'))
expect(btn, '批量删除按钮应存在').toBeTruthy()
await btn.trigger('click')
await settle()
}
it('查询面板:单个删除不弹弹窗且行被移除', async () => {
const wrapper = mount(ModuleQueryConfigPanel, {
props: { moduleId: 'm1', queryConfig: [], fields, loading: false },
attachTo: document.body,
})
await settle()
await wrapper.findAll('button').find((b) => b.text().includes('新增查询条件')).trigger('click')
await settle()
expect(wrapper.findAll('.stk-tbody-main tr').length).toBe(1)
await clickDelete(wrapper)
await checkNoModal()
expect(wrapper.findAll('.stk-tbody-main tr').length, '单个删除后行应被移除').toBe(0)
wrapper.unmount()
})
it('查询面板:批量删除选中多行', async () => {
const wrapper = mount(ModuleQueryConfigPanel, {
props: { moduleId: 'm1', queryConfig: [], fields, loading: false },
attachTo: document.body,
})
await settle()
for (let i = 0; i < 2; i++) {
await wrapper.findAll('button').find((b) => b.text().includes('新增查询条件')).trigger('click')
await settle()
}
expect(wrapper.findAll('.stk-tbody-main tr').length).toBe(2)
await selectRowCheckbox(wrapper, 0)
await selectRowCheckbox(wrapper, 1)
await clickToolbarBatch(wrapper)
await checkNoModal()
expect(wrapper.findAll('.stk-tbody-main tr').length, '批量删除后应无行').toBe(0)
wrapper.unmount()
})
it('多语言面板:单个删除不弹弹窗且行被移除', async () => {
const wrapper = mount(ModuleI18nPanel, {
props: {
moduleId: 'm1',
rows: [],
languages: [
{ code: 'zh-CN', name: '简体中文', default: true },
{ code: 'en-US', name: 'English', default: false },
],
loading: false,
},
attachTo: document.body,
})
await settle()
await wrapper.findAll('button').find((b) => b.text().includes('新增多语言')).trigger('click')
await settle()
const before = wrapper.findAll('.stk-tbody-main tr').length
expect(before).toBeGreaterThan(0)
await clickDelete(wrapper)
await checkNoModal()
expect(wrapper.findAll('.stk-tbody-main tr').length, '单个删除后行应减少').toBe(before - 1)
wrapper.unmount()
})
it('多语言面板:批量删除选中多行', async () => {
const wrapper = mount(ModuleI18nPanel, {
props: {
moduleId: 'm1',
rows: [],
languages: [
{ code: 'zh-CN', name: '简体中文', default: true },
{ code: 'en-US', name: 'English', default: false },
],
loading: false,
},
attachTo: document.body,
})
await settle()
const before = wrapper.findAll('.stk-tbody-main tr').length
for (let i = 0; i < 2; i++) {
await wrapper.findAll('button').find((b) => b.text().includes('新增多语言')).trigger('click')
await settle()
}
const total = wrapper.findAll('.stk-tbody-main tr').length
expect(total).toBeGreaterThanOrEqual(before + 2)
await selectRowCheckbox(wrapper, 0)
await selectRowCheckbox(wrapper, 1)
await clickToolbarBatch(wrapper)
await checkNoModal()
expect(wrapper.findAll('.stk-tbody-main tr').length, '批量删除后应只剩受管行').toBe(before)
wrapper.unmount()
})
})