import { describe, it, expect, vi, beforeEach } from 'vitest'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { PlatformSelector } from '../../src/components/PlatformSelector'
import { platformClient } from '../../src/api/platformClient'
// Mock the platform client
vi.mock('../../src/api/platformClient', () => {
const platformClient = {
getAllPlatforms: {
$get: vi.fn(),
},
}
return {
platformClient,
platformClientManager: {
get: vi.fn(() => platformClient),
},
}
})
const mockPlatforms = {
data: [
{ id: 1, platformName: '微信平台', contactPerson: '张三', contactPhone: '13800138000', status: 1, createTime: '2024-01-01T00:00:00Z', updateTime: '2024-01-01T00:00:00Z' },
{ id: 2, platformName: '抖音平台', contactPerson: '李四', contactPhone: '13900139000', status: 1, createTime: '2024-01-01T00:00:00Z', updateTime: '2024-01-01T00:00:00Z' },
{ id: 3, platformName: '快手平台', contactPerson: '王五', contactPhone: '13700137000', status: 0, createTime: '2024-01-01T00:00:00Z', updateTime: '2024-01-01T00:00:00Z' },
],
pagination: {
total: 3,
page: 1,
pageSize: 10,
totalPages: 1,
},
}
const TestWrapper = ({ children }: { children: React.ReactNode }) => {
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: false,
},
},
})
return (
{children as any}
)
}
describe('PlatformSelector 集成测试', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('应该正确渲染平台选择器', async () => {
(platformClient.getAllPlatforms.$get as any).mockResolvedValue({
status: 200,
json: async () => mockPlatforms,
})
render(
)
// 验证加载状态
expect(screen.getByTestId('platform-selector')).toBeInTheDocument()
expect(screen.getByText('加载中...')).toBeInTheDocument()
// 等待数据加载完成
await waitFor(() => {
expect(screen.getByText('请选择平台')).toBeInTheDocument()
})
// 点击选择器打开下拉菜单
const selectTrigger = screen.getByTestId('platform-selector')
fireEvent.click(selectTrigger)
// 验证下拉菜单中的选项
await waitFor(() => {
expect(screen.getByText('微信平台')).toBeInTheDocument()
expect(screen.getByText('抖音平台')).toBeInTheDocument()
expect(screen.getByText('快手平台')).toBeInTheDocument()
})
})
it('应该处理加载状态', () => {
// Mock 延迟响应
(platformClient.getAllPlatforms.$get as any).mockImplementation(
() => new Promise(() => {}) // 永不解析的Promise
)
render(
)
// 验证加载状态
expect(screen.getByTestId('platform-selector')).toBeInTheDocument()
expect(screen.getByText('加载中...')).toBeInTheDocument()
})
it('应该处理错误状态', async () => {
(platformClient.getAllPlatforms.$get as any).mockRejectedValue(new Error('API错误'))
render(
)
// 等待错误状态
await waitFor(() => {
expect(screen.getByText('加载平台列表失败')).toBeInTheDocument()
})
})
it('应该处理选择器值变化', async () => {
(platformClient.getAllPlatforms.$get as any).mockResolvedValue({
status: 200,
json: async () => mockPlatforms,
})
const mockOnChange = vi.fn()
render(
)
// 等待数据加载完成
await waitFor(() => {
expect(screen.getByTestId('platform-selector')).toBeEnabled()
})
// 点击选择器打开下拉菜单
const selectTrigger = screen.getByTestId('platform-selector')
fireEvent.click(selectTrigger)
// 选择第一个选项
await waitFor(() => {
const firstOption = screen.getByText('微信平台')
fireEvent.click(firstOption)
})
// 验证onChange被调用
expect(mockOnChange).toHaveBeenCalledWith(1)
})
it('应该支持自定义占位符', async () => {
(platformClient.getAllPlatforms.$get as any).mockResolvedValue({
status: 200,
json: async () => mockPlatforms,
})
render(
)
// 等待数据加载完成
await waitFor(() => {
expect(screen.getByText('选择平台')).toBeInTheDocument()
})
})
it('应该支持禁用状态', async () => {
(platformClient.getAllPlatforms.$get as any).mockResolvedValue({
status: 200,
json: async () => mockPlatforms,
})
render(
)
// 等待数据加载完成
await waitFor(() => {
const selectTrigger = screen.getByTestId('platform-selector')
expect(selectTrigger).toBeDisabled()
})
})
it('应该支持预选值', async () => {
(platformClient.getAllPlatforms.$get as any).mockResolvedValue({
status: 200,
json: async () => mockPlatforms,
})
render(
)
// 等待数据加载完成
await waitFor(() => {
expect(screen.getByTestId('platform-selector')).toBeEnabled()
})
// 验证预选值已正确设置
// 在Radix UI Select中,预选值会显示在选择器触发器中
const selectTrigger = screen.getByTestId('platform-selector')
expect(selectTrigger).toHaveTextContent('抖音平台')
})
})