basic.test.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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. tenantId: 1,
  87. orderNo: 'ORDER001',
  88. userId: 1,
  89. authCode: null,
  90. cardNo: null,
  91. sjtCardNo: null,
  92. amount: 99.99,
  93. costAmount: 80.00,
  94. freightAmount: 10.00,
  95. discountAmount: 10.00,
  96. payAmount: 99.99,
  97. deviceNo: null,
  98. description: null,
  99. goodsDetail: JSON.stringify([
  100. {
  101. name: '测试商品1',
  102. price: 49.99,
  103. num: 2,
  104. image: 'test-image.jpg'
  105. }
  106. ]),
  107. goodsTag: null,
  108. address: null,
  109. orderType: 1,
  110. payType: 1,
  111. payState: 0,
  112. state: 0,
  113. userPhone: null,
  114. merchantId: 0,
  115. merchantNo: null,
  116. supplierId: 0,
  117. addressId: 0,
  118. receiverMobile: null,
  119. recevierName: null,
  120. recevierProvince: 0,
  121. recevierCity: 0,
  122. recevierDistrict: 0,
  123. recevierTown: 0,
  124. refundTime: null,
  125. closeTime: null,
  126. remark: null,
  127. createdBy: null,
  128. updatedBy: null,
  129. createdAt: '2025-01-01T00:00:00Z',
  130. updatedAt: '2025-01-01T00:00:00Z'
  131. }
  132. const mockStatusMap = {
  133. 0: { text: '待发货', color: 'text-orange-500', bgColor: 'bg-orange-100' }
  134. }
  135. const mockPayStatusMap = {
  136. 0: { text: '未支付', color: 'text-red-500', bgColor: 'bg-red-100' }
  137. }
  138. const mockOnViewDetail = jest.fn()
  139. it('应该正确渲染订单卡片', () => {
  140. render(
  141. <OrderCard
  142. order={mockOrder}
  143. orderStatusMap={mockStatusMap}
  144. payStatusMap={mockPayStatusMap}
  145. onViewDetail={mockOnViewDetail}
  146. />
  147. )
  148. // 验证订单基本信息
  149. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  150. expect(screen.getByText('未支付')).toBeDefined()
  151. expect(screen.getByText('测试商品1')).toBeDefined()
  152. expect(screen.getByText('¥49.99 × 2')).toBeDefined()
  153. expect(screen.getByText('实付款:')).toBeDefined()
  154. expect(screen.getByText('待发货')).toBeDefined()
  155. })
  156. it('应该处理商品详情解析错误', () => {
  157. const invalidOrder = {
  158. ...mockOrder,
  159. goodsDetail: 'invalid-json'
  160. }
  161. render(
  162. <OrderCard
  163. order={invalidOrder}
  164. orderStatusMap={mockStatusMap}
  165. payStatusMap={mockPayStatusMap}
  166. onViewDetail={mockOnViewDetail}
  167. />
  168. )
  169. // 验证在JSON解析错误时不会崩溃
  170. expect(screen.getByText('订单号: ORDER001')).toBeDefined()
  171. })
  172. })
  173. describe('OrderButtonBar', () => {
  174. const mockOrder = {
  175. id: 1,
  176. tenantId: 1,
  177. orderNo: 'ORDER001',
  178. userId: 1,
  179. authCode: null,
  180. cardNo: null,
  181. sjtCardNo: null,
  182. amount: 99.99,
  183. costAmount: 80.00,
  184. freightAmount: 10.00,
  185. discountAmount: 10.00,
  186. payAmount: 99.99,
  187. deviceNo: null,
  188. description: null,
  189. goodsDetail: JSON.stringify([]),
  190. goodsTag: null,
  191. address: null,
  192. orderType: 1,
  193. payType: 1,
  194. payState: 0,
  195. state: 0,
  196. userPhone: null,
  197. merchantId: 0,
  198. merchantNo: null,
  199. supplierId: 0,
  200. addressId: 0,
  201. receiverMobile: null,
  202. recevierName: null,
  203. recevierProvince: 0,
  204. recevierCity: 0,
  205. recevierDistrict: 0,
  206. recevierTown: 0,
  207. refundTime: null,
  208. closeTime: null,
  209. remark: null,
  210. createdBy: null,
  211. updatedBy: null,
  212. createdAt: '2025-01-01T00:00:00Z',
  213. updatedAt: '2025-01-01T00:00:00Z'
  214. }
  215. const mockOnViewDetail = jest.fn()
  216. it('应该为未支付订单显示正确的操作按钮', () => {
  217. render(
  218. <OrderButtonBar
  219. order={mockOrder}
  220. onViewDetail={mockOnViewDetail}
  221. />
  222. )
  223. // 验证操作按钮
  224. expect(screen.getByText('查看详情')).toBeDefined()
  225. expect(screen.getByText('去支付')).toBeDefined()
  226. expect(screen.getByText('取消订单')).toBeDefined()
  227. })
  228. it('应该为已发货订单显示正确的操作按钮', () => {
  229. const shippedOrder = {
  230. ...mockOrder,
  231. payState: 2,
  232. state: 1
  233. }
  234. render(
  235. <OrderButtonBar
  236. order={shippedOrder}
  237. onViewDetail={mockOnViewDetail}
  238. />
  239. )
  240. expect(screen.getByText('查看详情')).toBeDefined()
  241. expect(screen.getByText('确认收货')).toBeDefined()
  242. expect(screen.getByText('查看物流')).toBeDefined()
  243. })
  244. it('应该处理按钮点击事件', () => {
  245. render(
  246. <OrderButtonBar
  247. order={mockOrder}
  248. onViewDetail={mockOnViewDetail}
  249. />
  250. )
  251. const viewDetailButton = screen.getByText('查看详情')
  252. fireEvent.click(viewDetailButton)
  253. expect(mockOnViewDetail).toHaveBeenCalledWith(mockOrder)
  254. })
  255. })