basic.test.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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. }))
  44. // Mock Auth Hook
  45. jest.mock('@/utils/auth', () => ({
  46. useAuth: jest.fn(() => ({
  47. user: { id: 1, name: '测试用户' }
  48. }))
  49. }))
  50. describe('OrderListPage', () => {
  51. beforeEach(() => {
  52. jest.clearAllMocks()
  53. // 设置 Taro mock 返回值
  54. mockGetEnv.mockReturnValue('WEB')
  55. mockGetCurrentInstance.mockReturnValue({ router: { params: {} } })
  56. })
  57. it('应该正确渲染订单列表页面', () => {
  58. render(<OrderListPage />)
  59. // 验证页面标题
  60. expect(screen.getByText('我的订单')).toBeDefined()
  61. // 验证标签栏
  62. expect(screen.getByText('全部')).toBeDefined()
  63. expect(screen.getByText('待付款')).toBeDefined()
  64. expect(screen.getByText('待收货')).toBeDefined()
  65. expect(screen.getByText('已完成')).toBeDefined()
  66. })
  67. it('应该显示订单卡片', () => {
  68. render(<OrderListPage />)
  69. // 验证订单信息显示
  70. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  71. expect(screen.getByText('测试商品1')).toBeDefined()
  72. expect(screen.getByText('¥49.99 × 2')).toBeDefined()
  73. expect(screen.getByText('实付款:')).toBeDefined()
  74. })
  75. it('应该处理标签切换', () => {
  76. render(<OrderListPage />)
  77. const tab = screen.getByText('待付款')
  78. fireEvent.click(tab)
  79. // 验证标签切换逻辑
  80. expect(tab).toBeDefined()
  81. })
  82. })
  83. describe('OrderCard', () => {
  84. const mockOrder = {
  85. id: 1,
  86. orderNo: 'ORDER001',
  87. payState: 0,
  88. state: 0,
  89. payAmount: 99.99,
  90. goodsDetail: JSON.stringify([
  91. {
  92. name: '测试商品1',
  93. price: 49.99,
  94. num: 2,
  95. image: 'test-image.jpg'
  96. }
  97. ])
  98. }
  99. const mockStatusMap = {
  100. 0: { text: '待发货', color: 'text-orange-500', bgColor: 'bg-orange-100' }
  101. }
  102. const mockPayStatusMap = {
  103. 0: { text: '未支付', color: 'text-red-500', bgColor: 'bg-red-100' }
  104. }
  105. const mockOnViewDetail = jest.fn()
  106. it('应该正确渲染订单卡片', () => {
  107. render(
  108. <OrderCard
  109. order={mockOrder}
  110. orderStatusMap={mockStatusMap}
  111. payStatusMap={mockPayStatusMap}
  112. onViewDetail={mockOnViewDetail}
  113. />
  114. )
  115. // 验证订单基本信息
  116. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  117. expect(screen.getByText('未支付')).toBeDefined()
  118. expect(screen.getByText('测试商品1')).toBeDefined()
  119. expect(screen.getByText('¥49.99 × 2')).toBeDefined()
  120. expect(screen.getByText('实付款:')).toBeDefined()
  121. expect(screen.getByText('待发货')).toBeDefined()
  122. })
  123. it('应该处理商品详情解析错误', () => {
  124. const invalidOrder = {
  125. ...mockOrder,
  126. goodsDetail: 'invalid-json'
  127. }
  128. render(
  129. <OrderCard
  130. order={invalidOrder}
  131. orderStatusMap={mockStatusMap}
  132. payStatusMap={mockPayStatusMap}
  133. onViewDetail={mockOnViewDetail}
  134. />
  135. )
  136. // 验证在JSON解析错误时不会崩溃
  137. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  138. })
  139. })
  140. describe('OrderButtonBar', () => {
  141. const mockOrder = {
  142. id: 1,
  143. orderNo: 'ORDER001',
  144. payState: 0,
  145. state: 0,
  146. payAmount: 99.99
  147. }
  148. const mockOnViewDetail = jest.fn()
  149. it('应该为未支付订单显示正确的操作按钮', () => {
  150. render(
  151. <OrderButtonBar
  152. order={mockOrder}
  153. onViewDetail={mockOnViewDetail}
  154. />
  155. )
  156. // 验证操作按钮
  157. expect(screen.getByText('查看详情')).toBeDefined()
  158. expect(screen.getByText('去支付')).toBeDefined()
  159. expect(screen.getByText('取消订单')).toBeDefined()
  160. })
  161. it('应该为已发货订单显示正确的操作按钮', () => {
  162. const shippedOrder = {
  163. ...mockOrder,
  164. payState: 2,
  165. state: 1
  166. }
  167. render(
  168. <OrderButtonBar
  169. order={shippedOrder}
  170. onViewDetail={mockOnViewDetail}
  171. />
  172. )
  173. expect(screen.getByText('查看详情')).toBeDefined()
  174. expect(screen.getByText('确认收货')).toBeDefined()
  175. expect(screen.getByText('查看物流')).toBeDefined()
  176. })
  177. it('应该处理按钮点击事件', () => {
  178. render(
  179. <OrderButtonBar
  180. order={mockOrder}
  181. onViewDetail={mockOnViewDetail}
  182. />
  183. )
  184. const viewDetailButton = screen.getByText('查看详情')
  185. fireEvent.click(viewDetailButton)
  186. expect(mockOnViewDetail).toHaveBeenCalledWith(mockOrder)
  187. })
  188. })