import ElementPlus from 'element-plus' import { createPinia, setActivePinia } from 'pinia' import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils' import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { listPlatformExpressCompanies, type PlatformExpressCompanyResource } from '@/api/platformExpressCompanies' import { useAccessPreviewStore } from '@/stores/accessPreview' import { useAuthStore } from '@/stores/auth' import ExpressCompaniesView from './ExpressCompaniesView.vue' vi.mock('@/api/platformExpressCompanies', () => ({ listPlatformExpressCompanies: vi.fn(), createPlatformExpressCompany: vi.fn(), updatePlatformExpressCompany: vi.fn(), changePlatformExpressCompanyStatus: vi.fn(), })) class ResizeObserverStub implements ResizeObserver { observe() {} unobserve() {} disconnect() {} } function createMemoryStorage(): Storage { const values = new Map() return { get length() { return values.size }, clear: () => values.clear(), getItem: (key) => values.get(key) ?? null, key: (index) => [...values.keys()][index] ?? null, removeItem: (key) => values.delete(key), setItem: (key, value) => values.set(key, value), } } const company: PlatformExpressCompanyResource = { id: '19001', tenantId: 10001, companyCode: 'SF', companyName: '顺丰速运', servicePhone: '95338', website: 'https://www.sf-express.com', trackingUrlTemplate: 'https://example.com/track/{trackingNo}', status: 'ACTIVE', remark: '测试数据', updatedAt: '2026-07-31T10:20:00', } async function mountView() { vi.stubGlobal('localStorage', createMemoryStorage()) vi.stubGlobal('sessionStorage', createMemoryStorage()) const pinia = createPinia() setActivePinia(pinia) const auth = useAuthStore() auth.token = 'token' auth.permissions = ['platform:express:list', 'platform:express:create', 'platform:express:edit', 'platform:express:status'] useAccessPreviewStore().initializeAfterLogin() const wrapper = mount(ExpressCompaniesView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] }, }) await flushPromises() return wrapper } enableAutoUnmount(afterEach) afterAll(() => vi.unstubAllGlobals()) describe('ExpressCompaniesView query and table migration', () => { beforeEach(() => { vi.stubGlobal('ResizeObserver', ResizeObserverStub) document.body.innerHTML = '' vi.mocked(listPlatformExpressCompanies).mockReset().mockResolvedValue({ records: [company], page: 1, size: 20, total: 1, pages: 1, }) }) it('renders the shared toolbar and data table without a summary strip', async () => { const wrapper = await mountView() expect(wrapper.find('.query-toolbar').exists()).toBe(true) expect(wrapper.find('.data-table').exists()).toBe(true) expect(wrapper.text()).toContain('顺丰速运') expect(wrapper.find('.metric-strip').exists()).toBe(false) }) it('does not request with edited filters until search is submitted', async () => { const wrapper = await mountView() await wrapper.find('input[placeholder="快递公司名称或编码"]').setValue('顺丰') await flushPromises() expect(listPlatformExpressCompanies).toHaveBeenCalledTimes(1) const searchButton = wrapper.findAll('button').find((button) => button.text().trim() === '查询') await searchButton?.trigger('click') await flushPromises() expect(listPlatformExpressCompanies).toHaveBeenLastCalledWith(10001, 1, 20, '顺丰', '') }) })