camera.spec.ts 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import { describe, it, expect, vi, beforeEach } from 'vitest'
  2. import {
  3. listCameras,
  4. getCamera,
  5. switchChannel,
  6. getCurrentChannel,
  7. ptzStart,
  8. ptzStop,
  9. adminListCameras,
  10. adminGetCamera,
  11. adminAddCamera,
  12. adminUpdateCamera,
  13. adminDeleteCamera,
  14. adminCheckCamera
  15. } from '@/api/camera'
  16. import * as request from '@/utils/request'
  17. vi.mock('@/utils/request', () => ({
  18. get: vi.fn(),
  19. post: vi.fn()
  20. }))
  21. describe('Camera API', () => {
  22. beforeEach(() => {
  23. vi.clearAllMocks()
  24. })
  25. describe('Controller APIs', () => {
  26. describe('listCameras', () => {
  27. it('should call GET /camera/list', async () => {
  28. const mockResponse = {
  29. code: 200,
  30. data: [
  31. {
  32. cameraId: 'cam-001',
  33. name: '摄像头1',
  34. machineId: 'machine-001',
  35. status: 'ONLINE',
  36. capability: 'ptz_enabled',
  37. ptzSupported: true,
  38. channels: []
  39. }
  40. ]
  41. }
  42. vi.mocked(request.get).mockResolvedValue(mockResponse)
  43. const result = await listCameras()
  44. expect(request.get).toHaveBeenCalledWith('/camera/list', undefined)
  45. expect(result.data).toHaveLength(1)
  46. })
  47. it('should call with machineId filter', async () => {
  48. vi.mocked(request.get).mockResolvedValue({ code: 200, data: [] })
  49. await listCameras('machine-001')
  50. expect(request.get).toHaveBeenCalledWith('/camera/list', { machineId: 'machine-001' })
  51. })
  52. })
  53. describe('getCamera', () => {
  54. it('should call GET /camera/:id', async () => {
  55. const mockResponse = {
  56. code: 200,
  57. data: { cameraId: 'cam-001', name: '摄像头1' }
  58. }
  59. vi.mocked(request.get).mockResolvedValue(mockResponse)
  60. const result = await getCamera('cam-001')
  61. expect(request.get).toHaveBeenCalledWith('/camera/cam-001')
  62. expect(result.data.cameraId).toBe('cam-001')
  63. })
  64. })
  65. describe('switchChannel', () => {
  66. it('should call POST /camera/switch', async () => {
  67. const mockResponse = {
  68. code: 200,
  69. data: { channelId: 'ch-001', name: '通道1' }
  70. }
  71. vi.mocked(request.post).mockResolvedValue(mockResponse)
  72. const result = await switchChannel({ machineId: 'machine-001', channelId: 'ch-001' })
  73. expect(request.post).toHaveBeenCalledWith('/camera/switch', {
  74. machineId: 'machine-001',
  75. channelId: 'ch-001'
  76. })
  77. expect(result.data.channelId).toBe('ch-001')
  78. })
  79. })
  80. describe('getCurrentChannel', () => {
  81. it('should call GET /camera/current', async () => {
  82. const mockResponse = {
  83. code: 200,
  84. data: { channelId: 'ch-001', name: '当前通道' }
  85. }
  86. vi.mocked(request.get).mockResolvedValue(mockResponse)
  87. const result = await getCurrentChannel('machine-001')
  88. expect(request.get).toHaveBeenCalledWith('/camera/current', { machineId: 'machine-001' })
  89. expect(result.data.channelId).toBe('ch-001')
  90. })
  91. })
  92. describe('ptzStart', () => {
  93. it('should call POST /camera/:id/ptz/start', async () => {
  94. const mockResponse = { code: 200, data: null }
  95. vi.mocked(request.post).mockResolvedValue(mockResponse)
  96. await ptzStart('cam-001', 'up', 50)
  97. expect(request.post).toHaveBeenCalledWith('/camera/cam-001/ptz/start', undefined, {
  98. params: { action: 'up', speed: 50 }
  99. })
  100. })
  101. })
  102. describe('ptzStop', () => {
  103. it('should call POST /camera/:id/ptz/stop', async () => {
  104. const mockResponse = { code: 200, data: null }
  105. vi.mocked(request.post).mockResolvedValue(mockResponse)
  106. await ptzStop('cam-001')
  107. expect(request.post).toHaveBeenCalledWith('/camera/cam-001/ptz/stop')
  108. })
  109. })
  110. })
  111. describe('Admin APIs', () => {
  112. describe('adminListCameras', () => {
  113. it('should call GET /admin/cameras/list', async () => {
  114. const mockResponse = {
  115. code: 200,
  116. data: [{ id: 1, cameraId: 'cam-001', name: '摄像头1' }]
  117. }
  118. vi.mocked(request.get).mockResolvedValue(mockResponse)
  119. const result = await adminListCameras()
  120. expect(request.get).toHaveBeenCalledWith('/admin/cameras/list', undefined)
  121. expect(result.data).toHaveLength(1)
  122. })
  123. })
  124. describe('adminGetCamera', () => {
  125. it('should call GET /admin/cameras/detail', async () => {
  126. const mockResponse = {
  127. code: 200,
  128. data: { id: 1, cameraId: 'cam-001' }
  129. }
  130. vi.mocked(request.get).mockResolvedValue(mockResponse)
  131. const result = await adminGetCamera(1)
  132. expect(request.get).toHaveBeenCalledWith('/admin/cameras/detail', { id: 1 })
  133. expect(result.data.id).toBe(1)
  134. })
  135. })
  136. describe('adminAddCamera', () => {
  137. it('should call POST /admin/cameras/add', async () => {
  138. const mockResponse = {
  139. code: 200,
  140. data: { id: 1, cameraId: 'cam-002', name: '新摄像头' }
  141. }
  142. vi.mocked(request.post).mockResolvedValue(mockResponse)
  143. const addData = {
  144. cameraId: 'cam-002',
  145. name: '新摄像头',
  146. ip: '192.168.1.100',
  147. port: 80
  148. }
  149. const result = await adminAddCamera(addData)
  150. expect(request.post).toHaveBeenCalledWith('/admin/cameras/add', addData)
  151. expect(result.data.cameraId).toBe('cam-002')
  152. })
  153. })
  154. describe('adminUpdateCamera', () => {
  155. it('should call POST /admin/cameras/update', async () => {
  156. const mockResponse = {
  157. code: 200,
  158. data: { id: 1, name: '更新后名称' }
  159. }
  160. vi.mocked(request.post).mockResolvedValue(mockResponse)
  161. const updateData = { id: 1, name: '更新后名称' }
  162. const result = await adminUpdateCamera(updateData)
  163. expect(request.post).toHaveBeenCalledWith('/admin/cameras/update', updateData)
  164. expect(result.data.name).toBe('更新后名称')
  165. })
  166. })
  167. describe('adminDeleteCamera', () => {
  168. it('should call POST /admin/cameras/delete', async () => {
  169. const mockResponse = { code: 200, data: null }
  170. vi.mocked(request.post).mockResolvedValue(mockResponse)
  171. await adminDeleteCamera(1)
  172. expect(request.post).toHaveBeenCalledWith('/admin/cameras/delete', undefined, {
  173. params: { id: 1 }
  174. })
  175. })
  176. })
  177. describe('adminCheckCamera', () => {
  178. it('should call POST /admin/cameras/check', async () => {
  179. const mockResponse = { code: 200, data: true }
  180. vi.mocked(request.post).mockResolvedValue(mockResponse)
  181. const result = await adminCheckCamera(1)
  182. expect(request.post).toHaveBeenCalledWith('/admin/cameras/check', undefined, {
  183. params: { id: 1 }
  184. })
  185. expect(result.data).toBe(true)
  186. })
  187. })
  188. })
  189. })