basic.test.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import { describe, it, expect, vi, beforeEach } from 'vitest'
  2. import { render, screen, fireEvent } from '@testing-library/react'
  3. import Taro from '@tarojs/taro'
  4. import OrderListPage from '@/pages/order-list/index'
  5. import OrderCard from '@/components/order/OrderCard'
  6. import OrderButtonBar from '@/components/order/OrderButtonBar'
  7. // Mock Taro
  8. vi.mock('@tarojs/taro', () => ({
  9. default: {
  10. navigateTo: vi.fn(),
  11. navigateBack: vi.fn(),
  12. getCurrentInstance: vi.fn(() => ({ router: { params: {} } })),
  13. stopPullDownRefresh: vi.fn(),
  14. showModal: vi.fn(),
  15. showToast: vi.fn()
  16. }
  17. }))
  18. // Mock React Query
  19. vi.mock('@tanstack/react-query', () => ({
  20. useInfiniteQuery: vi.fn(() => ({
  21. data: {
  22. pages: [
  23. {
  24. data: [
  25. {
  26. id: 1,
  27. orderNo: 'ORDER001',
  28. payState: 0,
  29. state: 0,
  30. payAmount: 99.99,
  31. goodsDetail: JSON.stringify([
  32. {
  33. name: '测试商品1',
  34. price: 49.99,
  35. num: 2,
  36. image: 'test-image.jpg'
  37. }
  38. ])
  39. }
  40. ],
  41. pagination: {
  42. current: 1,
  43. pageSize: 10,
  44. total: 1
  45. }
  46. }
  47. ]
  48. },
  49. isLoading: false,
  50. isFetchingNextPage: false,
  51. fetchNextPage: vi.fn(),
  52. hasNextPage: false,
  53. refetch: vi.fn()
  54. }))
  55. }))
  56. // Mock Auth Hook
  57. vi.mock('@/utils/auth', () => ({
  58. useAuth: vi.fn(() => ({
  59. user: { id: 1, name: '测试用户' }
  60. }))
  61. }))
  62. describe('OrderListPage', () => {
  63. beforeEach(() => {
  64. vi.clearAllMocks()
  65. })
  66. it('应该正确渲染订单列表页面', () => {
  67. render(<OrderListPage />)
  68. // 验证页面标题
  69. expect(screen.getByText('我的订单')).toBeDefined()
  70. // 验证标签栏
  71. expect(screen.getByText('全部')).toBeDefined()
  72. expect(screen.getByText('待付款')).toBeDefined()
  73. expect(screen.getByText('待发货')).toBeDefined()
  74. expect(screen.getByText('待收货')).toBeDefined()
  75. expect(screen.getByText('已完成')).toBeDefined()
  76. })
  77. it('应该显示订单卡片', () => {
  78. render(<OrderListPage />)
  79. // 验证订单信息显示
  80. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  81. expect(screen.getByText('测试商品1')).toBeDefined()
  82. expect(screen.getByText('¥49.99 × 2')).toBeDefined()
  83. expect(screen.getByText('实付款: ¥99.99')).toBeDefined()
  84. })
  85. it('应该处理标签切换', () => {
  86. render(<OrderListPage />)
  87. const tab = screen.getByText('待付款')
  88. fireEvent.click(tab)
  89. // 验证标签切换逻辑
  90. expect(tab).toBeDefined()
  91. })
  92. })
  93. describe('OrderCard', () => {
  94. const mockOrder = {
  95. id: 1,
  96. orderNo: 'ORDER001',
  97. payState: 0,
  98. state: 0,
  99. payAmount: 99.99,
  100. goodsDetail: JSON.stringify([
  101. {
  102. name: '测试商品1',
  103. price: 49.99,
  104. num: 2,
  105. image: 'test-image.jpg'
  106. }
  107. ])
  108. }
  109. const mockStatusMap = {
  110. 0: { text: '待发货', color: 'text-orange-500', bgColor: 'bg-orange-100' }
  111. }
  112. const mockPayStatusMap = {
  113. 0: { text: '未支付', color: 'text-red-500', bgColor: 'bg-red-100' }
  114. }
  115. const mockOnViewDetail = vi.fn()
  116. it('应该正确渲染订单卡片', () => {
  117. render(
  118. <OrderCard
  119. order={mockOrder}
  120. orderStatusMap={mockStatusMap}
  121. payStatusMap={mockPayStatusMap}
  122. onViewDetail={mockOnViewDetail}
  123. />
  124. )
  125. // 验证订单基本信息
  126. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  127. expect(screen.getByText('未支付')).toBeDefined()
  128. expect(screen.getByText('测试商品1')).toBeDefined()
  129. expect(screen.getByText('¥49.99 × 2')).toBeDefined()
  130. expect(screen.getByText('实付款: ¥99.99')).toBeDefined()
  131. expect(screen.getByText('待发货')).toBeDefined()
  132. })
  133. it('应该处理商品详情解析错误', () => {
  134. const invalidOrder = {
  135. ...mockOrder,
  136. goodsDetail: 'invalid-json'
  137. }
  138. render(
  139. <OrderCard
  140. order={invalidOrder}
  141. orderStatusMap={mockStatusMap}
  142. payStatusMap={mockPayStatusMap}
  143. onViewDetail={mockOnViewDetail}
  144. />
  145. )
  146. // 验证在JSON解析错误时不会崩溃
  147. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  148. })
  149. })
  150. describe('OrderButtonBar', () => {
  151. const mockOrder = {
  152. id: 1,
  153. orderNo: 'ORDER001',
  154. payState: 0,
  155. state: 0,
  156. payAmount: 99.99
  157. }
  158. const mockOnViewDetail = vi.fn()
  159. it('应该为未支付订单显示正确的操作按钮', () => {
  160. render(
  161. <OrderButtonBar
  162. order={mockOrder}
  163. onViewDetail={mockOnViewDetail}
  164. />
  165. )
  166. // 验证操作按钮
  167. expect(screen.getByText('查看详情')).toBeDefined()
  168. expect(screen.getByText('去支付')).toBeDefined()
  169. expect(screen.getByText('取消订单')).toBeDefined()
  170. })
  171. it('应该为已发货订单显示正确的操作按钮', () => {
  172. const shippedOrder = {
  173. ...mockOrder,
  174. payState: 2,
  175. state: 1
  176. }
  177. render(
  178. <OrderButtonBar
  179. order={shippedOrder}
  180. onViewDetail={mockOnViewDetail}
  181. />
  182. )
  183. expect(screen.getByText('查看详情')).toBeDefined()
  184. expect(screen.getByText('确认收货')).toBeDefined()
  185. expect(screen.getByText('查看物流')).toBeDefined()
  186. })
  187. it('应该处理按钮点击事件', () => {
  188. render(
  189. <OrderButtonBar
  190. order={mockOrder}
  191. onViewDetail={mockOnViewDetail}
  192. />
  193. )
  194. const viewDetailButton = screen.getByText('查看详情')
  195. fireEvent.click(viewDetailButton)
  196. expect(mockOnViewDetail).toHaveBeenCalledWith(mockOrder)
  197. })
  198. })