resource.test.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { describe, it, expect, vi, beforeEach } from 'vitest'
  2. // vi.hoisted 确保 mock 函数在 vi.mock 提升后可用
  3. const { mockGet, mockPost, mockPut, mockDelete } = vi.hoisted(() => ({
  4. mockGet: vi.fn(),
  5. mockPost: vi.fn(),
  6. mockPut: vi.fn(),
  7. mockDelete: vi.fn()
  8. }))
  9. vi.mock('../request', () => ({
  10. default: {
  11. get: mockGet,
  12. post: mockPost,
  13. put: mockPut,
  14. delete: mockDelete
  15. }
  16. }))
  17. import {
  18. resourcePageApi,
  19. resourceDetailApi,
  20. resourceSaveApi,
  21. resourceDeleteApi,
  22. resourceRelateApi,
  23. resourceUnrelateApi,
  24. costStatByProjectApi,
  25. costStatByTypeApi,
  26. resourceExportApi,
  27. resourceRenewApi,
  28. resourceRenewalsApi,
  29. resourceDeleteRenewalApi,
  30. procurementCostApi,
  31. procurementCostExportApi
  32. } from '../resource'
  33. describe('resource API', () => {
  34. beforeEach(() => {
  35. vi.clearAllMocks()
  36. })
  37. it('resourcePageApi 调用 GET /resource/page 并传入分页参数', async () => {
  38. mockGet.mockResolvedValue({ code: 200, data: { records: [], total: 0 } })
  39. const params = { pageNum: 1, pageSize: 10 }
  40. await resourcePageApi(params)
  41. expect(mockGet).toHaveBeenCalledWith('/resource/page', { params })
  42. })
  43. it('resourceDetailApi 调用 GET /resource/:id', async () => {
  44. mockGet.mockResolvedValue({ code: 200, data: {} })
  45. await resourceDetailApi(42)
  46. expect(mockGet).toHaveBeenCalledWith('/resource/42')
  47. })
  48. it('resourceSaveApi 调用 POST /resource', async () => {
  49. mockPost.mockResolvedValue({ code: 200 })
  50. const data = { name: 'test-resource' }
  51. await resourceSaveApi(data)
  52. expect(mockPost).toHaveBeenCalledWith('/resource', data)
  53. })
  54. it('resourceDeleteApi 调用 DELETE /resource/:id', async () => {
  55. mockDelete.mockResolvedValue({ code: 200 })
  56. await resourceDeleteApi(7)
  57. expect(mockDelete).toHaveBeenCalledWith('/resource/7')
  58. })
  59. it('resourceRelateApi 调用 POST /resource/relate', async () => {
  60. mockPost.mockResolvedValue({ code: 200 })
  61. const data = { projectId: 1, resourceIds: [10, 20] }
  62. await resourceRelateApi(data)
  63. expect(mockPost).toHaveBeenCalledWith('/resource/relate', data)
  64. })
  65. it('resourceUnrelateApi 调用 DELETE /resource/unrelate 带查询参数', async () => {
  66. mockDelete.mockResolvedValue({ code: 200 })
  67. await resourceUnrelateApi(1, 10)
  68. expect(mockDelete).toHaveBeenCalledWith('/resource/unrelate', { params: { projectId: 1, resourceId: 10 } })
  69. })
  70. it('costStatByProjectApi 调用 GET /resource/cost-stat/project', async () => {
  71. mockGet.mockResolvedValue({ code: 200, data: [] })
  72. await costStatByProjectApi('month')
  73. expect(mockGet).toHaveBeenCalledWith('/resource/cost-stat/project', { params: { range: 'month' } })
  74. })
  75. it('costStatByTypeApi 调用 GET /resource/cost-stat/type', async () => {
  76. mockGet.mockResolvedValue({ code: 200, data: [] })
  77. await costStatByTypeApi('quarter')
  78. expect(mockGet).toHaveBeenCalledWith('/resource/cost-stat/type', { params: { range: 'quarter' } })
  79. })
  80. it('resourceExportApi 调用 GET /resource/export 并设置 responseType blob', async () => {
  81. mockGet.mockResolvedValue(new Blob())
  82. const params = { name: 'test' }
  83. await resourceExportApi(params)
  84. expect(mockGet).toHaveBeenCalledWith('/resource/export', { params, responseType: 'blob' })
  85. })
  86. it('resourceRenewApi 调用 POST /resource/:id/renew', async () => {
  87. mockPost.mockResolvedValue({ code: 200 })
  88. const data = { cost: 100, durationCode: 5 }
  89. await resourceRenewApi(42, data)
  90. expect(mockPost).toHaveBeenCalledWith('/resource/42/renew', data)
  91. })
  92. it('resourceRenewalsApi 调用 GET /resource/:id/renewals', async () => {
  93. mockGet.mockResolvedValue({ code: 200, data: [] })
  94. await resourceRenewalsApi(42)
  95. expect(mockGet).toHaveBeenCalledWith('/resource/42/renewals')
  96. })
  97. it('resourceDeleteRenewalApi 调用 DELETE /resource/:id/renewals/:renewalId', async () => {
  98. mockDelete.mockResolvedValue({ code: 200 })
  99. await resourceDeleteRenewalApi(42, 99)
  100. expect(mockDelete).toHaveBeenCalledWith('/resource/42/renewals/99')
  101. })
  102. it('procurementCostApi 调用 GET /resource/procurement-cost', async () => {
  103. mockGet.mockResolvedValue({ code: 200, data: {} })
  104. const params = { pageNum: 1, pageSize: 20 }
  105. await procurementCostApi(params)
  106. expect(mockGet).toHaveBeenCalledWith('/resource/procurement-cost', { params })
  107. })
  108. it('procurementCostExportApi 调用 GET /resource/procurement-cost/export 带 blob', async () => {
  109. mockGet.mockResolvedValue(new Blob())
  110. const params = { month: '2026-08' }
  111. await procurementCostExportApi(params)
  112. expect(mockGet).toHaveBeenCalledWith('/resource/procurement-cost/export', { params, responseType: 'blob' })
  113. })
  114. })