basic.test.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. orderGoods: [
  55. {
  56. id: 1,
  57. goodsId: 1,
  58. goodsName: '测试商品1',
  59. price: 149.99,
  60. num: 2,
  61. imageFile: {
  62. id: 1,
  63. fullUrl: 'https://example.com/image1.jpg'
  64. }
  65. }
  66. ]
  67. },
  68. isLoading: false
  69. })),
  70. useMutation: jest.fn(() => ({
  71. mutate: jest.fn()
  72. })),
  73. useQueryClient: jest.fn(() => ({
  74. invalidateQueries: jest.fn()
  75. }))
  76. }))
  77. // Mock API client
  78. jest.mock('@/api', () => ({
  79. orderClient: {
  80. ':id': {
  81. $get: jest.fn()
  82. },
  83. cancelOrder: {
  84. $post: jest.fn()
  85. }
  86. }
  87. }))
  88. describe('OrderDetailPage', () => {
  89. beforeEach(() => {
  90. jest.clearAllMocks()
  91. })
  92. it('应该正确渲染订单详情页面', () => {
  93. render(<OrderDetailPage />)
  94. // 检查页面标题
  95. expect(screen.getByText('订单详情')).toBeDefined()
  96. // 检查订单状态
  97. expect(screen.getByText('待付款')).toBeDefined()
  98. expect(screen.getByText('请尽快完成支付')).toBeDefined()
  99. // 检查收货信息
  100. expect(screen.getByText('收货信息')).toBeDefined()
  101. expect(screen.getByText('张三 13800138000')).toBeDefined()
  102. expect(screen.getByText('北京市朝阳区某某街道123号')).toBeDefined()
  103. // 检查商品信息
  104. expect(screen.getByText('商品信息')).toBeDefined()
  105. expect(screen.getByText('测试商品1')).toBeDefined()
  106. expect(screen.getByText('默认规格')).toBeDefined()
  107. expect(screen.getByText('¥149.99')).toBeDefined()
  108. expect(screen.getByText('×2')).toBeDefined()
  109. // 检查支付详情
  110. expect(screen.getByText('支付详情')).toBeDefined()
  111. expect(screen.getByText('商品总价')).toBeDefined()
  112. expect(screen.getByText('¥299.99')).toBeDefined()
  113. expect(screen.getByText('运费')).toBeDefined()
  114. expect(screen.getByText('¥10.00')).toBeDefined()
  115. expect(screen.getByText('优惠')).toBeDefined()
  116. expect(screen.getByText('-¥20.00')).toBeDefined()
  117. expect(screen.getByText('实付款')).toBeDefined()
  118. expect(screen.getByText('¥289.99')).toBeDefined()
  119. // 检查订单信息
  120. expect(screen.getByText('订单信息')).toBeDefined()
  121. expect(screen.getByText('订单编号')).toBeDefined()
  122. expect(screen.getByText('ORDER202411220001')).toBeDefined()
  123. expect(screen.getByText('创建时间')).toBeDefined()
  124. })
  125. it('应该正确显示不同订单状态', () => {
  126. // 测试待发货状态
  127. const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock
  128. useQueryMock.mockReturnValueOnce({
  129. data: {
  130. id: 123,
  131. orderNo: 'ORDER202411220001',
  132. payState: 2,
  133. state: 0,
  134. recevierName: '张三',
  135. receiverMobile: '13800138000',
  136. address: '北京市朝阳区某某街道123号',
  137. amount: 299.99,
  138. freightAmount: 10.00,
  139. discountAmount: 20.00,
  140. payAmount: 289.99,
  141. createdAt: '2024-11-22T10:00:00Z',
  142. orderGoods: [
  143. {
  144. id: 1,
  145. goodsId: 1,
  146. goodsName: '测试商品1',
  147. price: 149.99,
  148. num: 2,
  149. imageFile: {
  150. id: 1,
  151. fullUrl: 'https://example.com/image1.jpg'
  152. }
  153. }
  154. ]
  155. },
  156. isLoading: false
  157. })
  158. render(<OrderDetailPage />)
  159. expect(screen.getByText('待发货')).toBeDefined()
  160. expect(screen.getByText('商家正在备货中')).toBeDefined()
  161. })
  162. it('应该支持订单编号复制功能', () => {
  163. render(<OrderDetailPage />)
  164. const copyButton = screen.getByText('复制')
  165. fireEvent.click(copyButton)
  166. expect(Taro.setClipboardData).toHaveBeenCalledWith({
  167. data: 'ORDER202411220001',
  168. success: expect.any(Function)
  169. })
  170. })
  171. it('应该显示加载状态', () => {
  172. const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock
  173. useQueryMock.mockReturnValueOnce({
  174. data: null,
  175. isLoading: true
  176. })
  177. render(<OrderDetailPage />)
  178. // 应该显示加载状态
  179. expect(screen.queryByText('订单详情')).toBeNull()
  180. })
  181. it('应该显示订单不存在状态', () => {
  182. const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock
  183. useQueryMock.mockReturnValueOnce({
  184. data: null,
  185. isLoading: false
  186. })
  187. render(<OrderDetailPage />)
  188. expect(screen.getByText('订单不存在')).toBeDefined()
  189. })
  190. it('应该支持下拉刷新功能', () => {
  191. const mockInvalidateQueries = jest.fn()
  192. const useQueryClientMock = require('@tanstack/react-query').useQueryClient as jest.Mock
  193. useQueryClientMock.mockReturnValueOnce({
  194. invalidateQueries: mockInvalidateQueries
  195. })
  196. render(<OrderDetailPage />)
  197. // 验证下拉刷新逻辑 - 检查页面是否包含刷新容器类
  198. const refreshContainer = document.querySelector('.refresh-container')
  199. expect(refreshContainer).toBeDefined()
  200. // 验证useQueryClient被正确调用
  201. expect(useQueryClientMock).toHaveBeenCalled()
  202. })
  203. it('应该正确显示地址修改按钮', () => {
  204. render(<OrderDetailPage />)
  205. const editButton = screen.getByText('修改')
  206. fireEvent.click(editButton)
  207. expect(Taro.showToast).toHaveBeenCalledWith({
  208. title: '地址修改功能开发中',
  209. icon: 'none'
  210. })
  211. })
  212. })