user.spec.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import { describe, it, expect, vi, beforeEach } from 'vitest'
  2. import { listUsers, getUser, createUser, updateUser, deleteUser, resetPassword } from '@/api/user'
  3. import * as request from '@/utils/request'
  4. // Mock request module
  5. vi.mock('@/utils/request', () => ({
  6. get: vi.fn(),
  7. post: vi.fn(),
  8. put: vi.fn(),
  9. del: vi.fn()
  10. }))
  11. describe('User API', () => {
  12. beforeEach(() => {
  13. vi.clearAllMocks()
  14. })
  15. describe('listUsers', () => {
  16. it('应该调用正确的 API 端点', async () => {
  17. const mockResponse = {
  18. code: 200,
  19. data: { rows: [], total: 0 }
  20. }
  21. vi.mocked(request.get).mockResolvedValue(mockResponse)
  22. await listUsers()
  23. expect(request.get).toHaveBeenCalledWith('/users', undefined)
  24. })
  25. it('应该传递查询参数', async () => {
  26. const mockResponse = {
  27. code: 200,
  28. data: { rows: [], total: 0 }
  29. }
  30. vi.mocked(request.get).mockResolvedValue(mockResponse)
  31. const params = { page: 1, pageSize: 10, search: 'admin', role: 'admin' as const }
  32. await listUsers(params)
  33. expect(request.get).toHaveBeenCalledWith('/users', params)
  34. })
  35. it('应该返回用户列表数据', async () => {
  36. const mockUsers = [
  37. { id: '1', username: 'admin', role: 'admin' },
  38. { id: '2', username: 'user1', role: 'viewer' }
  39. ]
  40. const mockResponse = {
  41. code: 200,
  42. data: { rows: mockUsers, total: 2 }
  43. }
  44. vi.mocked(request.get).mockResolvedValue(mockResponse)
  45. const result = await listUsers()
  46. expect(result.data.rows).toEqual(mockUsers)
  47. expect(result.data.total).toBe(2)
  48. })
  49. })
  50. describe('getUser', () => {
  51. it('应该调用正确的 API 端点', async () => {
  52. const mockResponse = {
  53. code: 200,
  54. data: { id: '1', username: 'admin', role: 'admin' }
  55. }
  56. vi.mocked(request.get).mockResolvedValue(mockResponse)
  57. await getUser('1')
  58. expect(request.get).toHaveBeenCalledWith('/users/1')
  59. })
  60. it('应该返回用户详情', async () => {
  61. const mockUser = { id: '1', username: 'admin', role: 'admin' }
  62. const mockResponse = {
  63. code: 200,
  64. data: mockUser
  65. }
  66. vi.mocked(request.get).mockResolvedValue(mockResponse)
  67. const result = await getUser('1')
  68. expect(result.data).toEqual(mockUser)
  69. })
  70. })
  71. describe('createUser', () => {
  72. it('应该调用正确的 API 端点', async () => {
  73. const mockResponse = {
  74. code: 200,
  75. data: { id: '1', username: 'newuser', role: 'viewer' }
  76. }
  77. vi.mocked(request.post).mockResolvedValue(mockResponse)
  78. const userData = { username: 'newuser', password: '123456', role: 'viewer' as const }
  79. await createUser(userData)
  80. expect(request.post).toHaveBeenCalledWith('/users', userData)
  81. })
  82. it('应该返回创建的用户', async () => {
  83. const mockUser = { id: '1', username: 'newuser', role: 'viewer' }
  84. const mockResponse = {
  85. code: 200,
  86. data: mockUser
  87. }
  88. vi.mocked(request.post).mockResolvedValue(mockResponse)
  89. const userData = { username: 'newuser', password: '123456', role: 'viewer' as const }
  90. const result = await createUser(userData)
  91. expect(result.data).toEqual(mockUser)
  92. })
  93. })
  94. describe('updateUser', () => {
  95. it('应该调用正确的 API 端点', async () => {
  96. const mockResponse = {
  97. code: 200,
  98. data: { id: '1', username: 'admin', role: 'admin' }
  99. }
  100. vi.mocked(request.put).mockResolvedValue(mockResponse)
  101. const updateData = { role: 'operator' as const }
  102. await updateUser('1', updateData)
  103. expect(request.put).toHaveBeenCalledWith('/users/1', updateData)
  104. })
  105. it('应该返回更新后的用户', async () => {
  106. const mockUser = { id: '1', username: 'admin', role: 'operator' }
  107. const mockResponse = {
  108. code: 200,
  109. data: mockUser
  110. }
  111. vi.mocked(request.put).mockResolvedValue(mockResponse)
  112. const updateData = { role: 'operator' as const }
  113. const result = await updateUser('1', updateData)
  114. expect(result.data).toEqual(mockUser)
  115. })
  116. })
  117. describe('deleteUser', () => {
  118. it('应该调用正确的 API 端点', async () => {
  119. const mockResponse = {
  120. code: 200,
  121. data: null
  122. }
  123. vi.mocked(request.del).mockResolvedValue(mockResponse)
  124. await deleteUser('1')
  125. expect(request.del).toHaveBeenCalledWith('/users/1')
  126. })
  127. it('应该返回成功响应', async () => {
  128. const mockResponse = {
  129. code: 200,
  130. data: null,
  131. message: 'success'
  132. }
  133. vi.mocked(request.del).mockResolvedValue(mockResponse)
  134. const result = await deleteUser('1')
  135. expect(result.code).toBe(200)
  136. })
  137. })
  138. describe('resetPassword', () => {
  139. it('应该调用正确的 API 端点', async () => {
  140. const mockResponse = {
  141. code: 200,
  142. data: null
  143. }
  144. vi.mocked(request.post).mockResolvedValue(mockResponse)
  145. await resetPassword('1', 'newpassword')
  146. expect(request.post).toHaveBeenCalledWith('/users/1/reset-password', { password: 'newpassword' })
  147. })
  148. it('应该返回成功响应', async () => {
  149. const mockResponse = {
  150. code: 200,
  151. data: null,
  152. message: 'success'
  153. }
  154. vi.mocked(request.post).mockResolvedValue(mockResponse)
  155. const result = await resetPassword('1', 'newpassword')
  156. expect(result.code).toBe(200)
  157. })
  158. })
  159. describe('错误处理', () => {
  160. it('API 错误应该被正确传递', async () => {
  161. const error = new Error('Network Error')
  162. vi.mocked(request.get).mockRejectedValue(error)
  163. await expect(listUsers()).rejects.toThrow('Network Error')
  164. })
  165. it('应该处理 API 返回的错误响应', async () => {
  166. const mockResponse = {
  167. code: 400,
  168. message: '用户名已存在',
  169. data: null
  170. }
  171. vi.mocked(request.post).mockResolvedValue(mockResponse)
  172. const userData = { username: 'existinguser', password: '123456', role: 'viewer' as const }
  173. const result = await createUser(userData)
  174. expect(result.code).toBe(400)
  175. expect(result.message).toBe('用户名已存在')
  176. })
  177. })
  178. })