import { render, screen, fireEvent } from '@testing-library/react' import OrderListPage from '@/pages/order-list/index' import OrderCard from '@/components/order/OrderCard' import OrderButtonBar from '@/components/order/OrderButtonBar' import { mockGetEnv, mockGetCurrentInstance } from '~/__mocks__/taroMock' // Mock React Query jest.mock('@tanstack/react-query', () => ({ useInfiniteQuery: jest.fn(() => ({ data: { pages: [ { data: [ { id: 1, orderNo: 'ORDER001', payState: 0, state: 0, payAmount: 99.99, goodsDetail: JSON.stringify([ { name: '测试商品1', price: 49.99, num: 2, image: 'test-image.jpg' } ]) } ], pagination: { current: 1, pageSize: 10, total: 1 } } ] }, isLoading: false, isFetchingNextPage: false, fetchNextPage: jest.fn(), hasNextPage: false, refetch: jest.fn() })), useMutation: jest.fn(() => ({ mutate: jest.fn(), mutateAsync: jest.fn(), isLoading: false, isError: false, isSuccess: false, error: null, data: null })), useQueryClient: jest.fn(() => ({ invalidateQueries: jest.fn() })) })) // Mock Auth Hook jest.mock('@/utils/auth', () => ({ useAuth: jest.fn(() => ({ user: { id: 1, name: '测试用户' } })) })) describe('OrderListPage', () => { beforeEach(() => { jest.clearAllMocks() // 设置 Taro mock 返回值 mockGetEnv.mockReturnValue('WEB') mockGetCurrentInstance.mockReturnValue({ router: { params: {} } }) }) it('应该正确渲染订单列表页面', () => { render() // 验证页面标题 expect(screen.getByText('我的订单')).toBeDefined() // 验证标签栏 expect(screen.getByText('全部')).toBeDefined() expect(screen.getByText('待付款')).toBeDefined() expect(screen.getByText('待收货')).toBeDefined() expect(screen.getByText('已完成')).toBeDefined() }) it('应该显示订单卡片', () => { render() // 验证订单信息显示 expect(screen.getByText('订单号: ORDER001')).toBeDefined() expect(screen.getByText('测试商品1')).toBeDefined() expect(screen.getByText('¥49.99 × 2')).toBeDefined() expect(screen.getByText('实付款:')).toBeDefined() }) it('应该处理标签切换', () => { render() const tab = screen.getByText('待付款') fireEvent.click(tab) // 验证标签切换逻辑 expect(tab).toBeDefined() }) }) describe('OrderCard', () => { const mockOrder = { id: 1, tenantId: 1, orderNo: 'ORDER001', userId: 1, authCode: null, cardNo: null, sjtCardNo: null, amount: 99.99, costAmount: 80.00, freightAmount: 10.00, discountAmount: 10.00, payAmount: 99.99, deviceNo: null, description: null, goodsDetail: JSON.stringify([ { name: '测试商品1', price: 49.99, num: 2, image: 'test-image.jpg' } ]), goodsTag: null, address: null, orderType: 1, payType: 1, payState: 0, state: 0, userPhone: null, merchantId: 0, merchantNo: null, supplierId: 0, addressId: 0, receiverMobile: null, recevierName: null, recevierProvince: 0, recevierCity: 0, recevierDistrict: 0, recevierTown: 0, refundTime: null, closeTime: null, remark: null, createdBy: null, updatedBy: null, createdAt: '2025-01-01T00:00:00Z', updatedAt: '2025-01-01T00:00:00Z' } const mockStatusMap = { 0: { text: '待发货', color: 'text-orange-500', bgColor: 'bg-orange-100' } } const mockPayStatusMap = { 0: { text: '未支付', color: 'text-red-500', bgColor: 'bg-red-100' } } const mockOnViewDetail = jest.fn() it('应该正确渲染订单卡片', () => { render( ) // 验证订单基本信息 expect(screen.getByText('订单号: ORDER001')).toBeDefined() expect(screen.getByText('未支付')).toBeDefined() expect(screen.getByText('测试商品1')).toBeDefined() expect(screen.getByText('¥49.99 × 2')).toBeDefined() expect(screen.getByText('实付款:')).toBeDefined() expect(screen.getByText('待发货')).toBeDefined() }) it('应该处理商品详情解析错误', () => { const invalidOrder = { ...mockOrder, goodsDetail: 'invalid-json' } render( ) // 验证在JSON解析错误时不会崩溃 expect(screen.getByText('订单号: ORDER001')).toBeDefined() }) }) describe('OrderButtonBar', () => { const mockOrder = { id: 1, tenantId: 1, orderNo: 'ORDER001', userId: 1, authCode: null, cardNo: null, sjtCardNo: null, amount: 99.99, costAmount: 80.00, freightAmount: 10.00, discountAmount: 10.00, payAmount: 99.99, deviceNo: null, description: null, goodsDetail: JSON.stringify([]), goodsTag: null, address: null, orderType: 1, payType: 1, payState: 0, state: 0, userPhone: null, merchantId: 0, merchantNo: null, supplierId: 0, addressId: 0, receiverMobile: null, recevierName: null, recevierProvince: 0, recevierCity: 0, recevierDistrict: 0, recevierTown: 0, refundTime: null, closeTime: null, remark: null, createdBy: null, updatedBy: null, createdAt: '2025-01-01T00:00:00Z', updatedAt: '2025-01-01T00:00:00Z' } const mockOnViewDetail = jest.fn() it('应该为未支付订单显示正确的操作按钮', () => { render( ) // 验证操作按钮 expect(screen.getByText('查看详情')).toBeDefined() expect(screen.getByText('去支付')).toBeDefined() expect(screen.getByText('取消订单')).toBeDefined() }) it('应该为已发货订单显示正确的操作按钮', () => { const shippedOrder = { ...mockOrder, payState: 2, state: 1 } render( ) expect(screen.getByText('查看详情')).toBeDefined() expect(screen.getByText('确认收货')).toBeDefined() expect(screen.getByText('查看物流')).toBeDefined() }) it('应该处理按钮点击事件', () => { render( ) const viewDetailButton = screen.getByText('查看详情') fireEvent.click(viewDetailButton) expect(mockOnViewDetail).toHaveBeenCalledWith(mockOrder) }) })