mockAreaClient.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /**
  2. * areaClient 测试mock工具
  3. * 用于在测试中模拟areaClient API调用
  4. */
  5. import { vi } from 'vitest';
  6. import { mockAllAreas, filterAreas, getPaginatedData, type AreaTestData } from './mockAreaData';
  7. // 完整的mock响应对象 - 按照用户UI包规范
  8. export const createMockResponse = (status: number, data?: any) => ({
  9. status,
  10. ok: status >= 200 && status < 300,
  11. body: null,
  12. bodyUsed: false,
  13. statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : status === 204 ? 'No Content' : 'Error',
  14. headers: new Headers(),
  15. url: '',
  16. redirected: false,
  17. type: 'basic' as ResponseType,
  18. json: async () => data || {},
  19. text: async () => '',
  20. blob: async () => new Blob(),
  21. arrayBuffer: async () => new ArrayBuffer(0),
  22. formData: async () => new FormData(),
  23. clone: function() { return this; }
  24. });
  25. // 创建mock的areaClient
  26. export const createMockAreaClient = (customData?: AreaTestData[]) => {
  27. const areas = customData || mockAllAreas;
  28. // 模拟 $get 方法
  29. const mockGet = vi.fn(async (options?: { query?: any }) => {
  30. const { query = {} } = options || {};
  31. const { page = 1, pageSize = 10, filters = '{}', sortBy = 'id', sortOrder = 'ASC' } = query;
  32. // 解析filters
  33. let parsedFilters = {};
  34. try {
  35. parsedFilters = JSON.parse(filters);
  36. } catch {
  37. parsedFilters = {};
  38. }
  39. // 筛选数据
  40. let filteredAreas = [...areas];
  41. // 应用筛选条件
  42. if (parsedFilters) {
  43. filteredAreas = filterAreas(areas, parsedFilters);
  44. }
  45. // 排序
  46. filteredAreas.sort((a, b) => {
  47. const aValue = a[sortBy as keyof AreaTestData];
  48. const bValue = b[sortBy as keyof AreaTestData];
  49. if (typeof aValue === 'number' && typeof bValue === 'number') {
  50. return sortOrder === 'ASC' ? aValue - bValue : bValue - aValue;
  51. }
  52. if (typeof aValue === 'string' && typeof bValue === 'string') {
  53. return sortOrder === 'ASC'
  54. ? aValue.localeCompare(bValue)
  55. : bValue.localeCompare(aValue);
  56. }
  57. return 0;
  58. });
  59. // 分页
  60. const paginated = getPaginatedData(filteredAreas, page, pageSize);
  61. return Promise.resolve(createMockResponse(200, paginated));
  62. });
  63. // 模拟 $post 方法
  64. const mockPost = vi.fn(async (options?: { json?: any }) => {
  65. const { json = {} } = options || {};
  66. const newId = Math.max(...areas.map(a => a.id)) + 1;
  67. const newArea: AreaTestData = {
  68. id: newId,
  69. name: json.name || '新地区',
  70. level: json.level || 1,
  71. parentId: json.parentId,
  72. isDisabled: json.isDisabled || 0,
  73. sort: json.sort || 0,
  74. };
  75. areas.push(newArea);
  76. return Promise.resolve(createMockResponse(201, newArea));
  77. });
  78. // 模拟 $put 方法
  79. const mockPut = vi.fn(async (options?: { param?: any; json?: any }) => {
  80. const { param = {}, json = {} } = options || {};
  81. const id = param.id ? parseInt(param.id) : 0;
  82. const index = areas.findIndex(area => area.id === id);
  83. if (index === -1) {
  84. return Promise.resolve(createMockResponse(404, { error: '地区不存在' }));
  85. }
  86. areas[index] = { ...areas[index], ...json };
  87. return Promise.resolve(createMockResponse(200, areas[index]));
  88. });
  89. // 模拟 $delete 方法
  90. const mockDelete = vi.fn(async (options?: { param?: any }) => {
  91. const { param = {} } = options || {};
  92. const id = param.id ? parseInt(param.id) : 0;
  93. const index = areas.findIndex(area => area.id === id);
  94. if (index === -1) {
  95. return Promise.resolve(createMockResponse(404, { error: '地区不存在' }));
  96. }
  97. areas.splice(index, 1);
  98. return Promise.resolve(createMockResponse(204));
  99. });
  100. return {
  101. index: {
  102. $get: mockGet,
  103. $post: mockPost,
  104. },
  105. ':id': {
  106. $put: mockPut,
  107. $delete: mockDelete,
  108. },
  109. };
  110. };
  111. // 创建mock的areaClientManager
  112. export const createMockAreaClientManager = (customData?: AreaTestData[]) => {
  113. const mockClient = createMockAreaClient(customData);
  114. return {
  115. getInstance: vi.fn(() => ({
  116. get: vi.fn(() => mockClient),
  117. reset: vi.fn(),
  118. })),
  119. get: vi.fn(() => mockClient),
  120. reset: vi.fn(),
  121. };
  122. };
  123. // 完整的mock配置(用于vi.mock)
  124. export const createAreaClientMock = (customData?: AreaTestData[]) => {
  125. const mockClient = createMockAreaClient(customData);
  126. const mockManager = createMockAreaClientManager(customData);
  127. return {
  128. areaClient: mockClient,
  129. areaClientManager: mockManager,
  130. };
  131. };
  132. // 预设的mock配置(快速使用)
  133. export const presetMocks = {
  134. // 基本成功mock
  135. success: () => createAreaClientMock(),
  136. // 空数据mock
  137. empty: () => createAreaClientMock([]),
  138. // 错误mock
  139. error: (errorType: 'network' | 'server' | 'notFound' = 'server') => {
  140. const mockClient = {
  141. index: {
  142. $get: vi.fn(() => {
  143. if (errorType === 'network') {
  144. return Promise.reject(new Error('Network Error'));
  145. }
  146. return Promise.resolve(createMockResponse(500, { error: '服务器错误' }));
  147. }),
  148. $post: vi.fn(() => Promise.resolve(createMockResponse(500, { error: '创建失败' }))),
  149. },
  150. ':id': {
  151. $put: vi.fn(() => {
  152. if (errorType === 'notFound') {
  153. return Promise.resolve(createMockResponse(404, { error: '地区不存在' }));
  154. }
  155. return Promise.resolve(createMockResponse(500, { error: '更新失败' }));
  156. }),
  157. $delete: vi.fn(() => {
  158. if (errorType === 'notFound') {
  159. return Promise.resolve(createMockResponse(404, { error: '地区不存在' }));
  160. }
  161. return Promise.resolve(createMockResponse(500, { error: '删除失败' }));
  162. }),
  163. },
  164. };
  165. const mockManager = {
  166. getInstance: vi.fn(() => ({
  167. get: vi.fn(() => mockClient),
  168. reset: vi.fn(),
  169. })),
  170. get: vi.fn(() => mockClient),
  171. reset: vi.fn(),
  172. };
  173. return {
  174. areaClient: mockClient,
  175. areaClientManager: mockManager,
  176. };
  177. },
  178. };