import { describe, it, expect, vi, beforeEach } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' import Taro from '@tarojs/taro' import OrderListPage from '@/pages/order-list/index' import OrderCard from '@/components/order/OrderCard' import OrderButtonBar from '@/components/order/OrderButtonBar' // Mock Taro vi.mock('@tarojs/taro', () => ({ default: { navigateTo: vi.fn(), navigateBack: vi.fn(), getCurrentInstance: vi.fn(() => ({ router: { params: {} } })), stopPullDownRefresh: vi.fn(), showModal: vi.fn(), showToast: vi.fn() } })) // Mock React Query vi.mock('@tanstack/react-query', () => ({ useInfiniteQuery: vi.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: vi.fn(), hasNextPage: false, refetch: vi.fn() })) })) // Mock Auth Hook vi.mock('@/utils/auth', () => ({ useAuth: vi.fn(() => ({ user: { id: 1, name: '测试用户' } })) })) describe('OrderListPage', () => { beforeEach(() => { vi.clearAllMocks() }) it('应该正确渲染订单列表页面', () => { render() // 验证页面标题 expect(screen.getByText('我的订单')).toBeDefined() // 验证标签栏 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('实付款: ¥99.99')).toBeDefined() }) it('应该处理标签切换', () => { render() const tab = screen.getByText('待付款') fireEvent.click(tab) // 验证标签切换逻辑 expect(tab).toBeDefined() }) }) describe('OrderCard', () => { const mockOrder = { 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' } ]) } 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 = vi.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('实付款: ¥99.99')).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, orderNo: 'ORDER001', payState: 0, state: 0, payAmount: 99.99 } const mockOnViewDetail = vi.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) }) })