import { describe, it, expect, vi, beforeEach } from 'vitest' // vi.hoisted 确保 mock 函数在 vi.mock 提升后可用 const { mockGet, mockPost, mockPut, mockDelete } = vi.hoisted(() => ({ mockGet: vi.fn(), mockPost: vi.fn(), mockPut: vi.fn(), mockDelete: vi.fn() })) vi.mock('../request', () => ({ default: { get: mockGet, post: mockPost, put: mockPut, delete: mockDelete } })) import { resourcePageApi, resourceDetailApi, resourceSaveApi, resourceDeleteApi, resourceRelateApi, resourceUnrelateApi, costStatByProjectApi, costStatByTypeApi, resourceExportApi, resourceRenewApi, resourceRenewalsApi, resourceDeleteRenewalApi, procurementCostApi, procurementCostExportApi } from '../resource' describe('resource API', () => { beforeEach(() => { vi.clearAllMocks() }) it('resourcePageApi 调用 GET /resource/page 并传入分页参数', async () => { mockGet.mockResolvedValue({ code: 200, data: { records: [], total: 0 } }) const params = { pageNum: 1, pageSize: 10 } await resourcePageApi(params) expect(mockGet).toHaveBeenCalledWith('/resource/page', { params }) }) it('resourceDetailApi 调用 GET /resource/:id', async () => { mockGet.mockResolvedValue({ code: 200, data: {} }) await resourceDetailApi(42) expect(mockGet).toHaveBeenCalledWith('/resource/42') }) it('resourceSaveApi 调用 POST /resource', async () => { mockPost.mockResolvedValue({ code: 200 }) const data = { name: 'test-resource' } await resourceSaveApi(data) expect(mockPost).toHaveBeenCalledWith('/resource', data) }) it('resourceDeleteApi 调用 DELETE /resource/:id', async () => { mockDelete.mockResolvedValue({ code: 200 }) await resourceDeleteApi(7) expect(mockDelete).toHaveBeenCalledWith('/resource/7') }) it('resourceRelateApi 调用 POST /resource/relate', async () => { mockPost.mockResolvedValue({ code: 200 }) const data = { projectId: 1, resourceIds: [10, 20] } await resourceRelateApi(data) expect(mockPost).toHaveBeenCalledWith('/resource/relate', data) }) it('resourceUnrelateApi 调用 DELETE /resource/unrelate 带查询参数', async () => { mockDelete.mockResolvedValue({ code: 200 }) await resourceUnrelateApi(1, 10) expect(mockDelete).toHaveBeenCalledWith('/resource/unrelate', { params: { projectId: 1, resourceId: 10 } }) }) it('costStatByProjectApi 调用 GET /resource/cost-stat/project', async () => { mockGet.mockResolvedValue({ code: 200, data: [] }) await costStatByProjectApi('month') expect(mockGet).toHaveBeenCalledWith('/resource/cost-stat/project', { params: { range: 'month' } }) }) it('costStatByTypeApi 调用 GET /resource/cost-stat/type', async () => { mockGet.mockResolvedValue({ code: 200, data: [] }) await costStatByTypeApi('quarter') expect(mockGet).toHaveBeenCalledWith('/resource/cost-stat/type', { params: { range: 'quarter' } }) }) it('resourceExportApi 调用 GET /resource/export 并设置 responseType blob', async () => { mockGet.mockResolvedValue(new Blob()) const params = { name: 'test' } await resourceExportApi(params) expect(mockGet).toHaveBeenCalledWith('/resource/export', { params, responseType: 'blob' }) }) it('resourceRenewApi 调用 POST /resource/:id/renew', async () => { mockPost.mockResolvedValue({ code: 200 }) const data = { cost: 100, durationCode: 5 } await resourceRenewApi(42, data) expect(mockPost).toHaveBeenCalledWith('/resource/42/renew', data) }) it('resourceRenewalsApi 调用 GET /resource/:id/renewals', async () => { mockGet.mockResolvedValue({ code: 200, data: [] }) await resourceRenewalsApi(42) expect(mockGet).toHaveBeenCalledWith('/resource/42/renewals') }) it('resourceDeleteRenewalApi 调用 DELETE /resource/:id/renewals/:renewalId', async () => { mockDelete.mockResolvedValue({ code: 200 }) await resourceDeleteRenewalApi(42, 99) expect(mockDelete).toHaveBeenCalledWith('/resource/42/renewals/99') }) it('procurementCostApi 调用 GET /resource/procurement-cost', async () => { mockGet.mockResolvedValue({ code: 200, data: {} }) const params = { pageNum: 1, pageSize: 20 } await procurementCostApi(params) expect(mockGet).toHaveBeenCalledWith('/resource/procurement-cost', { params }) }) it('procurementCostExportApi 调用 GET /resource/procurement-cost/export 带 blob', async () => { mockGet.mockResolvedValue(new Blob()) const params = { month: '2026-08' } await procurementCostExportApi(params) expect(mockGet).toHaveBeenCalledWith('/resource/procurement-cost/export', { params, responseType: 'blob' }) }) })