import React from 'react' import { render, screen, fireEvent } from '@testing-library/react' import { RouteFilter } from '../../src/components/RouteFilter' describe('RouteFilter 组件', () => { test('应该正确渲染组件', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 检查路线类型筛选 expect(screen.getByText('全部')).toBeInTheDocument() expect(screen.getByText('去程')).toBeInTheDocument() expect(screen.getByText('返程')).toBeInTheDocument() // 检查筛选按钮 expect(screen.getByText('筛选')).toBeInTheDocument() // 检查当前筛选状态显示 expect(screen.getByText('出发时间↑')).toBeInTheDocument() }) test('应该处理路线类型选择', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 点击去程选项 const departureOption = screen.getByText('去程') fireEvent.click(departureOption) // 检查回调被调用 expect(onRouteTypeChange).toHaveBeenCalledWith('departure') expect(onVehicleTypeChange).not.toHaveBeenCalled() expect(onSortChange).not.toHaveBeenCalled() }) test('应该处理车辆类型选择', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 点击筛选按钮展开扩展筛选区域 const filterButton = screen.getByText('筛选') fireEvent.click(filterButton) // 点击大巴拼车选项 const busOption = screen.getByText('大巴拼车') fireEvent.click(busOption) // 检查回调被调用 expect(onVehicleTypeChange).toHaveBeenCalledWith('bus') expect(onRouteTypeChange).not.toHaveBeenCalled() expect(onSortChange).not.toHaveBeenCalled() }) test('应该处理排序选择', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 点击筛选按钮展开扩展筛选区域 const filterButton = screen.getByText('筛选') fireEvent.click(filterButton) // 点击价格排序选项 const priceSortOption = screen.getByText('价格') fireEvent.click(priceSortOption) // 检查回调被调用 expect(onSortChange).toHaveBeenCalledWith('price', 'asc') expect(onRouteTypeChange).not.toHaveBeenCalled() expect(onVehicleTypeChange).not.toHaveBeenCalled() }) test('应该处理排序方向切换', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 点击筛选按钮展开扩展筛选区域 const filterButton = screen.getByText('筛选') fireEvent.click(filterButton) // 再次点击价格排序选项(应该切换为降序) const priceSortOption = screen.getByText('价格') fireEvent.click(priceSortOption) // 检查回调被调用,排序方向切换为降序 expect(onSortChange).toHaveBeenCalledWith('price', 'desc') }) test('应该显示筛选状态', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 检查筛选状态显示 expect(screen.getByText('去程')).toBeInTheDocument() expect(screen.getByText('大巴拼车')).toBeInTheDocument() expect(screen.getByText('价格↓')).toBeInTheDocument() }) test('应该显示正确的排序图标', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 检查出发时间排序显示升序图标 expect(screen.getByText('出发时间↑')).toBeInTheDocument() }) test('应该切换筛选区域的显示状态', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 初始状态下扩展筛选区域应该隐藏 expect(screen.queryByText('车辆类型')).not.toBeInTheDocument() expect(screen.queryByText('排序方式')).not.toBeInTheDocument() // 点击筛选按钮 const filterButton = screen.getByText('筛选') fireEvent.click(filterButton) // 扩展筛选区域应该显示 expect(screen.getByText('车辆类型')).toBeInTheDocument() expect(screen.getByText('排序方式')).toBeInTheDocument() // 再次点击筛选按钮 fireEvent.click(filterButton) // 扩展筛选区域应该隐藏 expect(screen.queryByText('车辆类型')).not.toBeInTheDocument() expect(screen.queryByText('排序方式')).not.toBeInTheDocument() }) test('应该显示筛选按钮的展开/收起状态', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 初始状态下应该显示向下箭头 const filterButton = screen.getByText('筛选') expect(filterButton.parentElement).toHaveTextContent('筛选▼') // 点击筛选按钮 fireEvent.click(filterButton) // 应该显示向上箭头 expect(filterButton.parentElement).toHaveTextContent('筛选▲') }) test('应该正确应用选中样式', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 展开筛选区域 const filterButton = screen.getByText('筛选') fireEvent.click(filterButton) // 检查去程选项的选中样式 const departureOption = screen.getByText('去程') expect(departureOption.parentElement).toHaveClass('bg-blue-500') expect(departureOption.parentElement).toHaveClass('text-white') // 检查大巴拼车选项的选中样式 const busOption = screen.getByText('大巴拼车') expect(busOption.parentElement).toHaveClass('bg-green-500') expect(busOption.parentElement).toHaveClass('text-white') // 检查价格排序选项的选中样式 const priceSortOption = screen.getByText('价格') expect(priceSortOption.parentElement).toHaveClass('bg-orange-500') expect(priceSortOption.parentElement).toHaveClass('text-white') }) test('应该处理默认值', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 检查默认值 expect(screen.getByText('全部')).toBeInTheDocument() expect(screen.getByText('出发时间↑')).toBeInTheDocument() // 展开筛选区域 const filterButton = screen.getByText('筛选') fireEvent.click(filterButton) // 检查车辆类型默认值 expect(screen.getByText('全部')).toBeInTheDocument() }) test('应该不显示全部类型的筛选状态', () => { const onRouteTypeChange = jest.fn() const onVehicleTypeChange = jest.fn() const onSortChange = jest.fn() render( ) // 检查筛选状态显示 expect(screen.queryByText('全部')).not.toBeInTheDocument() // 路线类型全部不显示 expect(screen.queryByText('全部')).not.toBeInTheDocument() // 车辆类型全部不显示 expect(screen.getByText('出发时间↑')).toBeInTheDocument() // 排序方式始终显示 }) })