import { mount, flushPromises, enableAutoUnmount } from '@vue/test-utils' import ElementPlus from 'element-plus' import { afterEach, describe, expect, it, vi } from 'vitest' import RelabelDocumentsPanel from './RelabelDocumentsPanel.vue' import { getRelabelOrder, downloadRelabelDocument, type RelabelDetailDto } from '../api/relabelOrders' vi.mock('../api/relabelOrders', () => ({ getRelabelOrder: vi.fn(), downloadRelabelDocument: vi.fn() })) enableAutoUnmount(afterEach) const detail = { application: { id: '1', relabelNo: 'RL-1', cartonTotalFileId: '11', cartonTotalFileName: '箱唛.pdf', skuTotalFileId: '12', skuTotalFileName: 'SKU.pdf', totalFileId: '12', totalFileName: 'SKU.pdf', shippingLabelFileId: '13', shippingLabelFileName: '面单.pdf' }, items: [{ id: '22', cartonMark: 'BX-1', skuCode: 'SKU-A', relabelFileId: '14', relabelFileName: '明细.pdf' }], history: [] } as RelabelDetailDto const mountPanel = (value = detail) => mount(RelabelDocumentsPanel, { props: { relabelNo: 'RL-1', detail: value }, global: { plugins: [ElementPlus] } }) describe('贴标附件回显', () => { it('分别显示两类总文件、面单与箱明细,兼容总文件不重复', async () => { const wrapper = mountPanel(); await flushPromises() const rows = wrapper.findAll('.el-table__body tbody tr') expect(rows).toHaveLength(4) expect(wrapper.text()).toContain('箱唛贴标文件'); expect(wrapper.text()).toContain('SKU 贴标文件') expect(wrapper.text()).toContain('面单文件'); expect(wrapper.text()).toContain('明细文件') expect(wrapper.text()).not.toContain('BX-1 / SKU-A'); expect(wrapper.text()).not.toContain('文件名称'); expect(wrapper.text()).not.toContain('查看'); expect(wrapper.text()).not.toContain('箱唛.pdf') expect(wrapper.findAll('thead th')).toHaveLength(2) expect(getRelabelOrder).not.toHaveBeenCalled() }) it('下载请求使用申请号、文件分类及明细编号,并可重试失败请求', async () => { vi.mocked(downloadRelabelDocument).mockRejectedValue(new Error('文件暂不可用')) const wrapper = mountPanel(); await flushPromises() const rows = wrapper.findAll('.el-table__body tbody tr') await rows[3]!.findAll('button')[0]!.trigger('click'); await flushPromises() expect(downloadRelabelDocument).toHaveBeenLastCalledWith('RL-1', '14', 'ITEM', '22') expect(rows[3]!.find('button').attributes('disabled')).toBeUndefined() await rows[2]!.findAll('button')[0]!.trigger('click'); await flushPromises() expect(downloadRelabelDocument).toHaveBeenLastCalledWith('RL-1', '13', 'SHIPPING', undefined) }) it('资料加载失败可单独重试,不冒充空附件', async () => { vi.mocked(getRelabelOrder).mockRejectedValueOnce(new Error('资料加载失败')).mockResolvedValueOnce(detail) const wrapper = mount(RelabelDocumentsPanel, { props: { relabelNo: 'RL-1' }, global: { plugins: [ElementPlus] } }); await flushPromises() expect(wrapper.get('[role="alert"]').text()).toContain('资料加载失败') await wrapper.get('[role="alert"] button').trigger('click'); await flushPromises() expect(wrapper.text()).toContain('箱唛贴标文件') }) })