import React from 'react' import { render, screen, fireEvent } from '@testing-library/react' import Taro from '@tarojs/taro' import OrderDetailPage from '@/pages/order-detail/index' // Mock Taro API jest.mock('@tarojs/taro', () => ({ getCurrentInstance: jest.fn(() => ({ router: { params: { id: '123' } } })), navigateBack: jest.fn(), showToast: jest.fn(), showModal: jest.fn(), setClipboardData: jest.fn(), navigateTo: jest.fn(), getEnv: jest.fn(() => 'h5'), getSystemInfoSync: jest.fn(() => ({ statusBarHeight: 44, screenWidth: 375, windowWidth: 375 })), getMenuButtonBoundingClientRect: jest.fn(() => ({ height: 32, width: 87, top: 48, right: 362, bottom: 80, left: 275 })), ENV_TYPE: { WEAPP: 'weapp', H5: 'h5' } })) // Mock React Query jest.mock('@tanstack/react-query', () => ({ useQuery: jest.fn(() => ({ data: { id: 123, orderNo: 'ORDER202411220001', payState: 0, state: 0, recevierName: '张三', receiverMobile: '13800138000', address: '北京市朝阳区某某街道123号', amount: 299.99, freightAmount: 10.00, discountAmount: 20.00, payAmount: 289.99, createdAt: '2024-11-22T10:00:00Z', goodsDetail: JSON.stringify([ { name: '测试商品1', price: 149.99, num: 2, image: 'https://example.com/image1.jpg', spec: '默认规格' } ]) }, isLoading: false })), useMutation: jest.fn(() => ({ mutate: jest.fn() })), useQueryClient: jest.fn(() => ({ invalidateQueries: jest.fn() })) })) // Mock API client jest.mock('@/api', () => ({ orderClient: { ':id': { $get: jest.fn() }, cancelOrder: { $post: jest.fn() } } })) describe('OrderDetailPage', () => { beforeEach(() => { jest.clearAllMocks() }) it('应该正确渲染订单详情页面', () => { render() // 检查页面标题 expect(screen.getByText('订单详情')).toBeDefined() // 检查订单状态 expect(screen.getByText('待付款')).toBeDefined() expect(screen.getByText('请尽快完成支付')).toBeDefined() // 检查收货信息 expect(screen.getByText('收货信息')).toBeDefined() expect(screen.getByText('张三 13800138000')).toBeDefined() expect(screen.getByText('北京市朝阳区某某街道123号')).toBeDefined() // 检查商品信息 expect(screen.getByText('商品信息')).toBeDefined() expect(screen.getByText('测试商品1')).toBeDefined() expect(screen.getByText('默认规格')).toBeDefined() expect(screen.getByText('¥149.99')).toBeDefined() expect(screen.getByText('×2')).toBeDefined() // 检查支付详情 expect(screen.getByText('支付详情')).toBeDefined() expect(screen.getByText('商品总价')).toBeDefined() expect(screen.getByText('¥299.99')).toBeDefined() expect(screen.getByText('运费')).toBeDefined() expect(screen.getByText('¥10.00')).toBeDefined() expect(screen.getByText('优惠')).toBeDefined() expect(screen.getByText('-¥20.00')).toBeDefined() expect(screen.getByText('实付款')).toBeDefined() expect(screen.getByText('¥289.99')).toBeDefined() // 检查订单信息 expect(screen.getByText('订单信息')).toBeDefined() expect(screen.getByText('订单编号')).toBeDefined() expect(screen.getByText('ORDER202411220001')).toBeDefined() expect(screen.getByText('创建时间')).toBeDefined() }) it('应该正确显示不同订单状态', () => { // 测试待发货状态 const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock useQueryMock.mockReturnValueOnce({ data: { id: 123, orderNo: 'ORDER202411220001', payState: 2, state: 0, recevierName: '张三', receiverMobile: '13800138000', address: '北京市朝阳区某某街道123号', amount: 299.99, freightAmount: 10.00, discountAmount: 20.00, payAmount: 289.99, createdAt: '2024-11-22T10:00:00Z', goodsDetail: JSON.stringify([ { name: '测试商品1', price: 149.99, num: 2, image: 'https://example.com/image1.jpg', spec: '默认规格' } ]) }, isLoading: false }) render() expect(screen.getByText('待发货')).toBeDefined() expect(screen.getByText('商家正在备货中')).toBeDefined() }) it('应该支持订单编号复制功能', () => { render() const copyButton = screen.getByText('复制') fireEvent.click(copyButton) expect(Taro.setClipboardData).toHaveBeenCalledWith({ data: 'ORDER202411220001', success: expect.any(Function) }) }) it('应该显示加载状态', () => { const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock useQueryMock.mockReturnValueOnce({ data: null, isLoading: true }) render() // 应该显示加载状态 expect(screen.queryByText('订单详情')).toBeNull() }) it('应该显示订单不存在状态', () => { const useQueryMock = require('@tanstack/react-query').useQuery as jest.Mock useQueryMock.mockReturnValueOnce({ data: null, isLoading: false }) render() expect(screen.getByText('订单不存在')).toBeDefined() }) it('应该支持下拉刷新功能', () => { const mockInvalidateQueries = jest.fn() const useQueryClientMock = require('@tanstack/react-query').useQueryClient as jest.Mock useQueryClientMock.mockReturnValueOnce({ invalidateQueries: mockInvalidateQueries }) render() // 验证下拉刷新逻辑 - 检查页面是否包含刷新容器类 const refreshContainer = document.querySelector('.refresh-container') expect(refreshContainer).toBeDefined() // 验证useQueryClient被正确调用 expect(useQueryClientMock).toHaveBeenCalled() }) it('应该正确显示地址修改按钮', () => { render() const editButton = screen.getByText('修改') fireEvent.click(editButton) expect(Taro.showToast).toHaveBeenCalledWith({ title: '地址修改功能开发中', icon: 'none' }) }) })