basic.test.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import React from 'react'
  2. import { render, screen, fireEvent } from '@testing-library/react'
  3. import Taro from '@tarojs/taro'
  4. import OrderDetailPage from '@/pages/order-detail/index'
  5. // Mock Taro API
  6. jest.mock('@tarojs/taro', () => ({
  7. getCurrentInstance: jest.fn(() => ({
  8. router: {
  9. params: {
  10. id: '123'
  11. }
  12. }
  13. })),
  14. navigateBack: jest.fn(),
  15. showToast: jest.fn(),
  16. showModal: jest.fn(),
  17. setClipboardData: jest.fn(),
  18. navigateTo: jest.fn(),
  19. getEnv: jest.fn(() => 'h5'),
  20. getSystemInfoSync: jest.fn(() => ({
  21. statusBarHeight: 44,
  22. screenWidth: 375,
  23. windowWidth: 375
  24. })),
  25. getMenuButtonBoundingClientRect: jest.fn(() => ({
  26. height: 32,
  27. width: 87,
  28. top: 48,
  29. right: 362,
  30. bottom: 80,
  31. left: 275
  32. })),
  33. ENV_TYPE: {
  34. WEAPP: 'weapp',
  35. H5: 'h5'
  36. }
  37. }))
  38. // Mock React Query
  39. jest.mock('@tanstack/react-query', () => ({
  40. useQuery: jest.fn(() => ({
  41. data: {
  42. id: 123,
  43. orderNo: 'ORDER202411220001',
  44. payState: 0,
  45. state: 0,
  46. recevierName: '张三',
  47. receiverMobile: '13800138000',
  48. address: '北京市朝阳区某某街道123号',
  49. amount: 299.99,
  50. freightAmount: 10.00,
  51. discountAmount: 20.00,
  52. payAmount: 289.99,
  53. createdAt: '2024-11-22T10:00:00Z',
  54. goodsDetail: JSON.stringify([
  55. {
  56. name: '测试商品1',
  57. price: 149.99,
  58. num: 2,
  59. image: 'https://example.com/image1.jpg',
  60. spec: '默认规格'
  61. }
  62. ])
  63. },
  64. isLoading: false
  65. })),
  66. useMutation: jest.fn(() => ({
  67. mutate: jest.fn()
  68. })),
  69. useQueryClient: jest.fn(() => ({
  70. invalidateQueries: jest.fn()
  71. }))
  72. }))
  73. // Mock API client
  74. jest.mock('@/api', () => ({
  75. orderClient: {
  76. ':id': {
  77. $get: jest.fn()
  78. },
  79. cancelOrder: {
  80. $post: jest.fn()
  81. }
  82. }
  83. }))
  84. describe('OrderDetailPage', () => {
  85. beforeEach(() => {
  86. jest.clearAllMocks()
  87. })
  88. it('应该正确渲染订单详情页面', () => {
  89. render(<OrderDetailPage />)
  90. // 检查页面标题
  91. expect(screen.getByText('订单详情')).toBeDefined()
  92. // 检查订单状态
  93. expect(screen.getByText('待付款')).toBeDefined()
  94. expect(screen.getByText('请尽快完成支付')).toBeDefined()
  95. // 检查收货信息
  96. expect(screen.getByText('收货信息')).toBeDefined()
  97. expect(screen.getByText('张三 13800138000')).toBeDefined()
  98. expect(screen.getByText('北京市朝阳区某某街道123号')).toBeDefined()
  99. // 检查商品信息
  100. expect(screen.getByText('商品信息')).toBeDefined()
  101. expect(screen.getByText('测试商品1')).toBeDefined()
  102. expect(screen.getByText('默认规格')).toBeDefined()
  103. expect(screen.getByText('¥149.99')).toBeDefined()
  104. expect(screen.getByText('×2')).toBeDefined()
  105. // 检查支付详情
  106. expect(screen.getByText('支付详情')).toBeDefined()
  107. expect(screen.getByText('商品总价')).toBeDefined()
  108. expect(screen.getByText('¥299.99')).toBeDefined()
  109. expect(screen.getByText('运费')).toBeDefined()
  110. expect(screen.getByText('¥10.00')).toBeDefined()
  111. expect(screen.getByText('优惠')).toBeDefined()
  112. expect(screen.getByText('-¥20.00')).toBeDefined()
  113. expect(screen.getByText('实付款')).toBeDefined()
  114. expect(screen.getByText('¥289.99')).toBeDefined()
  115. // 检查订单信息
  116. expect(screen.getByText('订单信息')).toBeDefined()
  117. expect(screen.getByText('订单编号')).toBeDefined()
  118. expect(screen.getByText('ORDER202411220001')).toBeDefined()
  119. expect(screen.getByText('创建时间')).toBeDefined()
  120. })
  121. it('应该正确显示不同订单状态', () => {
  122. // 测试待发货状态
  123. const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock
  124. useQueryMock.mockReturnValueOnce({
  125. data: {
  126. id: 123,
  127. orderNo: 'ORDER202411220001',
  128. payState: 2,
  129. state: 0,
  130. recevierName: '张三',
  131. receiverMobile: '13800138000',
  132. address: '北京市朝阳区某某街道123号',
  133. amount: 299.99,
  134. freightAmount: 10.00,
  135. discountAmount: 20.00,
  136. payAmount: 289.99,
  137. createdAt: '2024-11-22T10:00:00Z',
  138. goodsDetail: JSON.stringify([
  139. {
  140. name: '测试商品1',
  141. price: 149.99,
  142. num: 2,
  143. image: 'https://example.com/image1.jpg',
  144. spec: '默认规格'
  145. }
  146. ])
  147. },
  148. isLoading: false
  149. })
  150. render(<OrderDetailPage />)
  151. expect(screen.getByText('待发货')).toBeDefined()
  152. expect(screen.getByText('商家正在备货中')).toBeDefined()
  153. })
  154. it('应该支持订单编号复制功能', () => {
  155. render(<OrderDetailPage />)
  156. const copyButton = screen.getByText('复制')
  157. fireEvent.click(copyButton)
  158. expect(Taro.setClipboardData).toHaveBeenCalledWith({
  159. data: 'ORDER202411220001',
  160. success: expect.any(Function)
  161. })
  162. })
  163. it('应该显示加载状态', () => {
  164. const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock
  165. useQueryMock.mockReturnValueOnce({
  166. data: null,
  167. isLoading: true
  168. })
  169. render(<OrderDetailPage />)
  170. // 应该显示加载状态
  171. expect(screen.queryByText('订单详情')).toBeNull()
  172. })
  173. it('应该显示订单不存在状态', () => {
  174. const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock
  175. useQueryMock.mockReturnValueOnce({
  176. data: null,
  177. isLoading: false
  178. })
  179. render(<OrderDetailPage />)
  180. expect(screen.getByText('订单不存在')).toBeDefined()
  181. })
  182. it('应该支持下拉刷新功能', () => {
  183. const mockInvalidateQueries = jest.fn()
  184. const useQueryClientMock = require('@tanstack/react-query').useQueryClient as jest.Mock
  185. useQueryClientMock.mockReturnValueOnce({
  186. invalidateQueries: mockInvalidateQueries
  187. })
  188. render(<OrderDetailPage />)
  189. // 验证下拉刷新逻辑 - 检查页面是否包含刷新容器类
  190. const refreshContainer = document.querySelector('.refresh-container')
  191. expect(refreshContainer).toBeDefined()
  192. // 验证useQueryClient被正确调用
  193. expect(useQueryClientMock).toHaveBeenCalled()
  194. })
  195. it('应该正确显示地址修改按钮', () => {
  196. render(<OrderDetailPage />)
  197. const editButton = screen.getByText('修改')
  198. fireEvent.click(editButton)
  199. expect(Taro.showToast).toHaveBeenCalledWith({
  200. title: '地址修改功能开发中',
  201. icon: 'none'
  202. })
  203. })
  204. })