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)
})
})