This commit is contained in:
2026-08-06 15:32:02 +08:00
parent 9e7e1afac8
commit 33a0c48b78
22 changed files with 685 additions and 402 deletions
@@ -0,0 +1,90 @@
import ElementPlus from 'element-plus'
import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils'
import { afterEach, describe, expect, it, vi } from 'vitest'
import BatchImportDialog, { type BatchImportResult } from './BatchImportDialog.vue'
class ResizeObserverStub implements ResizeObserver {
observe() {}
unobserve() {}
disconnect() {}
}
function button(label: string) {
return [...document.body.querySelectorAll('button')].find((item) => item.textContent?.trim() === label)
}
async function chooseFile(file: File) {
const input = document.body.querySelector<HTMLInputElement>('input[type="file"]')!
Object.defineProperty(input, 'files', { configurable: true, value: [file] })
input.dispatchEvent(new Event('change', { bubbles: true }))
await flushPromises()
}
enableAutoUnmount(afterEach)
describe('BatchImportDialog', () => {
afterEach(() => {
document.body.innerHTML = ''
vi.unstubAllGlobals()
})
it('uses the shared two-step flow and submits a validated XLSX file', async () => {
vi.stubGlobal('ResizeObserver', ResizeObserverStub)
const result: BatchImportResult = {
fileName: 'partners.xlsx', totalRows: 2, importedRows: 2, success: true, errors: [],
}
const importFile = vi.fn().mockResolvedValue(result)
const wrapper = mount(BatchImportDialog, {
attachTo: document.body,
props: {
modelValue: true,
title: '批量导入往来单位',
entityLabel: '往来单位',
templateFileName: '往来单位导入模板-v1.xlsx',
downloadTemplate: vi.fn(),
importFile,
},
global: { plugins: [ElementPlus] },
})
await flushPromises()
expect(document.body.textContent).toContain('下载标准模板')
expect(document.body.textContent).toContain('选择填写后的文件')
expect(button('开始导入')?.hasAttribute('disabled')).toBe(true)
const file = new File(['xlsx'], 'partners.xlsx', {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
})
await chooseFile(file)
expect(button('开始导入')?.hasAttribute('disabled')).toBe(false)
button('开始导入')?.click()
await flushPromises()
expect(importFile).toHaveBeenCalledWith(file)
expect(wrapper.emitted('success')?.[0]).toEqual([result])
expect(document.body.textContent).toContain('导入完成:成功新增 2 条往来单位')
})
it('rejects files that do not use the XLSX template format', async () => {
vi.stubGlobal('ResizeObserver', ResizeObserverStub)
const importFile = vi.fn()
mount(BatchImportDialog, {
attachTo: document.body,
props: {
modelValue: true,
title: '批量导入快递公司',
entityLabel: '快递公司',
templateFileName: '快递公司批量导入模板-v1.xlsx',
downloadTemplate: vi.fn(),
importFile,
},
global: { plugins: [ElementPlus] },
})
await flushPromises()
await chooseFile(new File(['csv'], 'companies.csv', { type: 'text/csv' }))
expect(button('开始导入')?.hasAttribute('disabled')).toBe(true)
expect(importFile).not.toHaveBeenCalled()
})
})