basic.test.tsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. import { render, screen, fireEvent } from '@testing-library/react'
  2. import OrderListPage from '@/pages/order-list/index'
  3. import OrderCard from '@/components/order/OrderCard'
  4. import OrderButtonBar from '@/components/order/OrderButtonBar'
  5. import { mockGetEnv, mockGetCurrentInstance } from '~/__mocks__/taroMock'
  6. // Mock React Query
  7. jest.mock('@tanstack/react-query', () => ({
  8. useInfiniteQuery: jest.fn(() => ({
  9. data: {
  10. pages: [
  11. {
  12. data: [
  13. {
  14. id: 1,
  15. orderNo: 'ORDER001',
  16. payState: 0,
  17. state: 0,
  18. payAmount: 99.99,
  19. goodsDetail: JSON.stringify([
  20. {
  21. name: '测试商品1',
  22. price: 49.99,
  23. num: 2,
  24. image: 'test-image.jpg'
  25. }
  26. ])
  27. }
  28. ],
  29. pagination: {
  30. current: 1,
  31. pageSize: 10,
  32. total: 1
  33. }
  34. }
  35. ]
  36. },
  37. isLoading: false,
  38. isFetchingNextPage: false,
  39. fetchNextPage: jest.fn(),
  40. hasNextPage: false,
  41. refetch: jest.fn()
  42. })),
  43. useMutation: jest.fn(() => ({
  44. mutate: jest.fn(),
  45. mutateAsync: jest.fn(),
  46. isLoading: false,
  47. isError: false,
  48. isSuccess: false,
  49. error: null,
  50. data: null
  51. })),
  52. useQueryClient: jest.fn(() => ({
  53. invalidateQueries: jest.fn()
  54. }))
  55. }))
  56. // Mock Auth Hook
  57. jest.mock('@/utils/auth', () => ({
  58. useAuth: jest.fn(() => ({
  59. user: { id: 1, name: '测试用户' }
  60. }))
  61. }))
  62. describe('OrderListPage', () => {
  63. beforeEach(() => {
  64. jest.clearAllMocks()
  65. // 设置 Taro mock 返回值
  66. mockGetEnv.mockReturnValue('WEB')
  67. mockGetCurrentInstance.mockReturnValue({ router: { params: {} } })
  68. })
  69. it('应该正确渲染订单列表页面', () => {
  70. render(<OrderListPage />)
  71. // 验证页面标题
  72. expect(screen.getByText('我的订单')).toBeDefined()
  73. // 验证标签栏
  74. expect(screen.getByText('全部')).toBeDefined()
  75. expect(screen.getByText('待付款')).toBeDefined()
  76. expect(screen.getByText('待收货')).toBeDefined()
  77. expect(screen.getByText('已完成')).toBeDefined()
  78. })
  79. it('应该显示订单卡片', () => {
  80. render(<OrderListPage />)
  81. // 验证订单信息显示
  82. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  83. expect(screen.getByText('测试商品1')).toBeDefined()
  84. expect(screen.getByText('¥49.99 × 2')).toBeDefined()
  85. expect(screen.getByText('实付款:')).toBeDefined()
  86. })
  87. it('应该处理标签切换', () => {
  88. render(<OrderListPage />)
  89. const tab = screen.getByText('待付款')
  90. fireEvent.click(tab)
  91. // 验证标签切换逻辑
  92. expect(tab).toBeDefined()
  93. })
  94. })
  95. describe('OrderCard', () => {
  96. const mockOrder = {
  97. id: 1,
  98. tenantId: 1,
  99. orderNo: 'ORDER001',
  100. userId: 1,
  101. authCode: null,
  102. cardNo: null,
  103. sjtCardNo: null,
  104. amount: 99.99,
  105. costAmount: 80.00,
  106. freightAmount: 10.00,
  107. discountAmount: 10.00,
  108. payAmount: 99.99,
  109. deviceNo: null,
  110. description: null,
  111. goodsDetail: JSON.stringify([
  112. {
  113. name: '测试商品1',
  114. price: 49.99,
  115. num: 2,
  116. image: 'test-image.jpg'
  117. }
  118. ]),
  119. goodsTag: null,
  120. address: null,
  121. orderType: 1,
  122. payType: 1,
  123. payState: 0,
  124. state: 0,
  125. userPhone: null,
  126. merchantId: 0,
  127. merchantNo: null,
  128. supplierId: 0,
  129. addressId: 0,
  130. receiverMobile: null,
  131. recevierName: null,
  132. recevierProvince: 0,
  133. recevierCity: 0,
  134. recevierDistrict: 0,
  135. recevierTown: 0,
  136. refundTime: null,
  137. closeTime: null,
  138. remark: null,
  139. createdBy: null,
  140. updatedBy: null,
  141. createdAt: '2025-01-01T00:00:00Z',
  142. updatedAt: '2025-01-01T00:00:00Z'
  143. }
  144. const mockStatusMap = {
  145. 0: { text: '待发货', color: 'text-orange-500', bgColor: 'bg-orange-100' }
  146. }
  147. const mockPayStatusMap = {
  148. 0: { text: '未支付', color: 'text-red-500', bgColor: 'bg-red-100' }
  149. }
  150. const mockOnViewDetail = jest.fn()
  151. it('应该正确渲染订单卡片', () => {
  152. render(
  153. <OrderCard
  154. order={mockOrder}
  155. orderStatusMap={mockStatusMap}
  156. payStatusMap={mockPayStatusMap}
  157. onViewDetail={mockOnViewDetail}
  158. />
  159. )
  160. // 验证订单基本信息
  161. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  162. expect(screen.getByText('未支付')).toBeDefined()
  163. expect(screen.getByText('测试商品1')).toBeDefined()
  164. expect(screen.getByText('¥49.99 × 2')).toBeDefined()
  165. expect(screen.getByText('实付款:')).toBeDefined()
  166. expect(screen.getByText('待发货')).toBeDefined()
  167. })
  168. it('应该处理商品详情解析错误', () => {
  169. const invalidOrder = {
  170. ...mockOrder,
  171. goodsDetail: 'invalid-json'
  172. }
  173. render(
  174. <OrderCard
  175. order={invalidOrder}
  176. orderStatusMap={mockStatusMap}
  177. payStatusMap={mockPayStatusMap}
  178. onViewDetail={mockOnViewDetail}
  179. />
  180. )
  181. // 验证在JSON解析错误时不会崩溃
  182. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  183. })
  184. })
  185. describe('OrderButtonBar', () => {
  186. const mockOrder = {
  187. id: 1,
  188. tenantId: 1,
  189. orderNo: 'ORDER001',
  190. userId: 1,
  191. authCode: null,
  192. cardNo: null,
  193. sjtCardNo: null,
  194. amount: 99.99,
  195. costAmount: 80.00,
  196. freightAmount: 10.00,
  197. discountAmount: 10.00,
  198. payAmount: 99.99,
  199. deviceNo: null,
  200. description: null,
  201. goodsDetail: JSON.stringify([]),
  202. goodsTag: null,
  203. address: null,
  204. orderType: 1,
  205. payType: 1,
  206. payState: 0,
  207. state: 0,
  208. userPhone: null,
  209. merchantId: 0,
  210. merchantNo: null,
  211. supplierId: 0,
  212. addressId: 0,
  213. receiverMobile: null,
  214. recevierName: null,
  215. recevierProvince: 0,
  216. recevierCity: 0,
  217. recevierDistrict: 0,
  218. recevierTown: 0,
  219. refundTime: null,
  220. closeTime: null,
  221. remark: null,
  222. createdBy: null,
  223. updatedBy: null,
  224. createdAt: '2025-01-01T00:00:00Z',
  225. updatedAt: '2025-01-01T00:00:00Z'
  226. }
  227. const mockOnViewDetail = jest.fn()
  228. it('应该为未支付订单显示正确的操作按钮', () => {
  229. render(
  230. <OrderButtonBar
  231. order={mockOrder}
  232. onViewDetail={mockOnViewDetail}
  233. />
  234. )
  235. // 验证操作按钮
  236. expect(screen.getByText('查看详情')).toBeDefined()
  237. expect(screen.getByText('去支付')).toBeDefined()
  238. expect(screen.getByText('取消订单')).toBeDefined()
  239. })
  240. it('应该为已发货订单显示正确的操作按钮', () => {
  241. const shippedOrder = {
  242. ...mockOrder,
  243. payState: 2,
  244. state: 1
  245. }
  246. render(
  247. <OrderButtonBar
  248. order={shippedOrder}
  249. onViewDetail={mockOnViewDetail}
  250. />
  251. )
  252. expect(screen.getByText('查看详情')).toBeDefined()
  253. expect(screen.getByText('确认收货')).toBeDefined()
  254. expect(screen.getByText('查看物流')).toBeDefined()
  255. })
  256. it('应该处理按钮点击事件', () => {
  257. render(
  258. <OrderButtonBar
  259. order={mockOrder}
  260. onViewDetail={mockOnViewDetail}
  261. />
  262. )
  263. const viewDetailButton = screen.getByText('查看详情')
  264. fireEvent.click(viewDetailButton)
  265. expect(mockOnViewDetail).toHaveBeenCalledWith(mockOrder)
  266. })
  267. })