get.test.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { describe, it, expect } from 'vitest'
  2. import { testClient } from 'hono/testing'
  3. import { dashRoutes } from '@/server/api'
  4. import {
  5. setupIntegrationDatabaseHooks,
  6. } from '~/utils/server/integration-test-db'
  7. // 设置集成测试钩子
  8. setupIntegrationDatabaseHooks()
  9. describe('财务数据API集成测试', () => {
  10. const client = testClient(dashRoutes).api.v1
  11. describe('GET /outlook - 获取财务数据', () => {
  12. it('应该成功返回财务数据结构', async () => {
  13. const response = await client.dash.outlook.$get()
  14. expect(response.status).toBe(200)
  15. if (response.status === 200) {
  16. const responseData = await response.json()
  17. // 验证响应结构
  18. expect(responseData).toHaveProperty('code', 200)
  19. expect(responseData).toHaveProperty('msg', '查询成功')
  20. expect(responseData).toHaveProperty('rows')
  21. expect(Array.isArray(responseData.rows)).toBe(true)
  22. // 验证第一个数据行的结构
  23. const firstRow = responseData.rows[0]
  24. expect(firstRow).toHaveProperty('assetTotalNet')
  25. expect(firstRow).toHaveProperty('profitTotalNet')
  26. expect(firstRow).toHaveProperty('incomeStatement')
  27. expect(firstRow).toHaveProperty('assetLiabilityRatio')
  28. // 验证资产总额与资产净额数据结构
  29. expect(Array.isArray(firstRow.assetTotalNet)).toBe(true)
  30. if (firstRow.assetTotalNet.length > 0) {
  31. const assetData = firstRow.assetTotalNet[0]
  32. expect(assetData).toHaveProperty('id')
  33. expect(assetData).toHaveProperty('year')
  34. expect(assetData).toHaveProperty('assetTotal')
  35. expect(assetData).toHaveProperty('assetNet')
  36. expect(assetData).toHaveProperty('dataDeadline')
  37. expect(assetData).toHaveProperty('createTime')
  38. expect(assetData).toHaveProperty('updateTime')
  39. }
  40. // 验证利润总额与净利润数据结构
  41. expect(Array.isArray(firstRow.profitTotalNet)).toBe(true)
  42. if (firstRow.profitTotalNet.length > 0) {
  43. const profitData = firstRow.profitTotalNet[0]
  44. expect(profitData).toHaveProperty('id')
  45. expect(profitData).toHaveProperty('year')
  46. expect(profitData).toHaveProperty('profitTotal')
  47. expect(profitData).toHaveProperty('profitNet')
  48. expect(profitData).toHaveProperty('dataDeadline')
  49. expect(profitData).toHaveProperty('createTime')
  50. expect(profitData).toHaveProperty('updateTime')
  51. }
  52. // 验证收入数据结构
  53. expect(Array.isArray(firstRow.incomeStatement)).toBe(true)
  54. if (firstRow.incomeStatement.length > 0) {
  55. const incomeData = firstRow.incomeStatement[0]
  56. expect(incomeData).toHaveProperty('id')
  57. expect(incomeData).toHaveProperty('year')
  58. expect(incomeData).toHaveProperty('income')
  59. expect(incomeData).toHaveProperty('dataDeadline')
  60. expect(incomeData).toHaveProperty('createTime')
  61. expect(incomeData).toHaveProperty('updateTime')
  62. }
  63. // 验证资产负债率数据结构
  64. expect(Array.isArray(firstRow.assetLiabilityRatio)).toBe(true)
  65. if (firstRow.assetLiabilityRatio.length > 0) {
  66. const ratioData = firstRow.assetLiabilityRatio[0]
  67. expect(ratioData).toHaveProperty('id')
  68. expect(ratioData).toHaveProperty('year')
  69. expect(ratioData).toHaveProperty('assetLiabilityRatio')
  70. expect(ratioData).toHaveProperty('dataDeadline')
  71. expect(ratioData).toHaveProperty('createTime')
  72. expect(ratioData).toHaveProperty('updateTime')
  73. }
  74. }
  75. })
  76. it('应该返回正确的mock数据值', async () => {
  77. const response = await client.dash.outlook.$get()
  78. expect(response.status).toBe(200)
  79. if (response.status === 200) {
  80. const responseData = await response.json()
  81. const firstRow = responseData.rows[0]
  82. // 验证资产数据值
  83. const assetData = firstRow.assetTotalNet[0]
  84. expect(assetData.assetTotal).toBe(150000000)
  85. expect(assetData.assetNet).toBe(120000000)
  86. expect(assetData.year).toBe(2024)
  87. // 验证利润数据值
  88. const profitData = firstRow.profitTotalNet[0]
  89. expect(profitData.profitTotal).toBe(25000000)
  90. expect(profitData.profitNet).toBe(20000000)
  91. expect(profitData.year).toBe(2024)
  92. // 验证收入数据值
  93. const incomeData = firstRow.incomeStatement[0]
  94. expect(incomeData.income).toBe(80000000)
  95. expect(incomeData.year).toBe(2024)
  96. // 验证资产负债率数据值
  97. const ratioData = firstRow.assetLiabilityRatio[0]
  98. expect(ratioData.assetLiabilityRatio).toBe(45.2)
  99. expect(ratioData.year).toBe(2024)
  100. }
  101. })
  102. it('应该包含多个年份的数据', async () => {
  103. const response = await client.dash.outlook.$get()
  104. expect(response.status).toBe(200)
  105. if (response.status === 200) {
  106. const responseData = await response.json()
  107. const firstRow = responseData.rows[0]
  108. // 验证每个数据模块都包含多个年份的数据
  109. expect(firstRow.assetTotalNet.length).toBeGreaterThan(1)
  110. expect(firstRow.profitTotalNet.length).toBeGreaterThan(1)
  111. expect(firstRow.incomeStatement.length).toBeGreaterThan(1)
  112. expect(firstRow.assetLiabilityRatio.length).toBeGreaterThan(1)
  113. // 验证年份数据
  114. const assetYears = firstRow.assetTotalNet.map((item: any) => item.year)
  115. expect(assetYears).toContain(2024)
  116. expect(assetYears).toContain(2023)
  117. const profitYears = firstRow.profitTotalNet.map((item: any) => item.year)
  118. expect(profitYears).toContain(2024)
  119. expect(profitYears).toContain(2023)
  120. const incomeYears = firstRow.incomeStatement.map((item: any) => item.year)
  121. expect(incomeYears).toContain(2024)
  122. expect(incomeYears).toContain(2023)
  123. const ratioYears = firstRow.assetLiabilityRatio.map((item: any) => item.year)
  124. expect(ratioYears).toContain(2024)
  125. expect(ratioYears).toContain(2023)
  126. }
  127. })
  128. it('应该正确处理错误场景', async () => {
  129. // 由于这是一个简单的mock API,主要测试正常流程
  130. // 错误处理在路由中已有基本实现
  131. const response = await client.dash.outlook.$get()
  132. expect(response.status).toBe(200)
  133. })
  134. })
  135. describe('API性能测试', () => {
  136. it('响应时间应小于100ms', async () => {
  137. const startTime = Date.now()
  138. const response = await client.dash.outlook.$get()
  139. const endTime = Date.now()
  140. const responseTime = endTime - startTime
  141. expect(response.status).toBe(200)
  142. expect(responseTime).toBeLessThan(100) // 响应时间应小于100ms
  143. })
  144. })
  145. })