import { beforeEach, describe, expect, it, vi } from 'vitest' describe('InitInterface', () => { const postMock = vi.fn() const getMock = vi.fn() const putMock = vi.fn() const deleteMock = vi.fn() const downloadMock = vi.fn() const buildURLMock = vi.fn() const getItemMock = vi.fn() const loadInitInterface = async () => { vi.resetModules() vi.doMock('../../../index', () => ({ __getItem: getItemMock, Http: { post: postMock, get: getMock, put: putMock, delete: deleteMock, download: downloadMock }, buildURL: buildURLMock })) return import('../../../hooks/InitInterface') } beforeEach(() => { vi.clearAllMocks() getItemMock.mockImplementation((key: string) => { if (key === 'serveConfig') return { token: 'X-Token' } if (key === 'x-auth-token') return 'token-value' return undefined }) }) it('submitApproval 会调用正确的 post URL 和参数', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { status: 'online', ids: ['1', '2'] } api.submitApproval(params as any) expect(postMock).toHaveBeenCalledWith('/demo/submitApproval/online', ['1', '2']) }) it('cancelApproval 会调用正确的 post URL 和参数', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') api.cancelApproval(['1', '2']) expect(postMock).toHaveBeenCalledWith('/demo/cancelApproval', ['1', '2']) }) it('queryPage 会调用 page 接口', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { current: 1, size: 10 } api.queryPage(params as any) expect(postMock).toHaveBeenCalledWith('/demo/page', params) }) it('add 会调用基础 post 接口', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { name: '新增' } api.add(params as any) expect(postMock).toHaveBeenCalledWith('/demo', params) }) it('del 会调用 delete 并透传对象参数', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { ids: ['1'] } api.del(params as any) expect(deleteMock).toHaveBeenCalledWith('/demo', params) }) it('delOnly 会调用带 id 的 delete 接口', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') api.delOnly('100') expect(deleteMock).toHaveBeenCalledWith('/demo/100') }) it('edit 会调用带 id 的 put 接口', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { id: '10', name: '编辑' } api.edit(params as any) expect(putMock).toHaveBeenCalledWith('/demo/10', params) }) it('editTree 会调用基础 put 接口', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { id: '10', parentId: '1' } api.editTree(params as any) expect(putMock).toHaveBeenCalledWith('/demo', params) }) it('detail 会调用带 id 的 get 接口', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') api.detail('8') expect(getMock).toHaveBeenCalledWith('/demo/8') }) it('enabled 会调用 enabled put 接口', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { ids: ['1'], enabled: true } api.enabled(params as any) expect(putMock).toHaveBeenCalledWith('/demo/enabled', params) }) it('tree 会调用 tree get 接口并透传查询参数', async () => { const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') const params = { id: '1', orgId: '2' } api.tree(params as any) expect(getMock).toHaveBeenCalledWith('/demo/tree', params) }) it('template 会生成带 header token 的下载地址并触发下载', async () => { buildURLMock.mockReturnValue('/demo/template?X-Token=token-value') const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') api.template() expect(downloadMock).toHaveBeenCalledWith('/demo/template?X-Token=token-value') }) it('export 会在缺少 serveConfig.token 时使用默认 Authorization 下载', async () => { getItemMock.mockImplementation((key: string) => { if (key === 'serveConfig') return undefined if (key === 'x-auth-token') return 'token-value' return undefined }) buildURLMock.mockReturnValue('/demo/export?Authorization=token-value') const { InitInterface } = await loadInitInterface() const api = new InitInterface('/demo') api.export() expect(downloadMock).toHaveBeenCalledWith('/demo/export?Authorization=token-value') }) })