RouteFilter.test.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import React from 'react'
  2. import { render, fireEvent } from '@testing-library/react'
  3. import { RouteFilter } from '../../src/components/RouteFilter'
  4. describe('RouteFilter', () => {
  5. it('应该正确渲染初始状态', () => {
  6. const { getByText } = render(<RouteFilter />)
  7. expect(getByText('全部')).toBeTruthy()
  8. expect(getByText('去程')).toBeTruthy()
  9. expect(getByText('返程')).toBeTruthy()
  10. expect(getByText('筛选')).toBeTruthy()
  11. })
  12. it('应该处理路线类型选择', () => {
  13. const mockOnRouteTypeChange = jest.fn()
  14. const { getByText } = render(
  15. <RouteFilter onRouteTypeChange={mockOnRouteTypeChange} />
  16. )
  17. const departureButton = getByText('去程')
  18. fireEvent.click(departureButton)
  19. expect(mockOnRouteTypeChange).toHaveBeenCalledWith('departure')
  20. })
  21. it('应该展开和收起筛选面板', () => {
  22. const { getByText, queryByText } = render(<RouteFilter />)
  23. const filterButton = getByText('筛选')
  24. fireEvent.click(filterButton)
  25. expect(getByText('车辆类型')).toBeTruthy()
  26. expect(getByText('排序方式')).toBeTruthy()
  27. fireEvent.click(filterButton)
  28. expect(queryByText('车辆类型')).toBeNull()
  29. expect(queryByText('排序方式')).toBeNull()
  30. })
  31. it('应该处理车辆类型选择', () => {
  32. const mockOnVehicleTypeChange = jest.fn()
  33. const { getByText } = render(
  34. <RouteFilter onVehicleTypeChange={mockOnVehicleTypeChange} />
  35. )
  36. // 先展开筛选面板
  37. const filterButton = getByText('筛选')
  38. fireEvent.click(filterButton)
  39. const busButton = getByText('大巴拼车')
  40. fireEvent.click(busButton)
  41. expect(mockOnVehicleTypeChange).toHaveBeenCalledWith('bus')
  42. })
  43. it('应该处理排序选择', () => {
  44. const mockOnSortChange = jest.fn()
  45. const { getByText } = render(
  46. <RouteFilter onSortChange={mockOnSortChange} />
  47. )
  48. // 先展开筛选面板
  49. const filterButton = getByText('筛选')
  50. fireEvent.click(filterButton)
  51. const priceSortButton = getByText('价格')
  52. fireEvent.click(priceSortButton)
  53. expect(mockOnSortChange).toHaveBeenCalledWith('price', 'asc')
  54. // 再次点击应该切换排序方向
  55. fireEvent.click(priceSortButton)
  56. expect(mockOnSortChange).toHaveBeenCalledWith('price', 'desc')
  57. })
  58. it('应该显示当前筛选状态', () => {
  59. const { getByText } = render(
  60. <RouteFilter
  61. routeType="departure"
  62. vehicleType="bus"
  63. sortBy="price"
  64. sortOrder="desc"
  65. />
  66. )
  67. expect(getByText('去程')).toBeTruthy()
  68. expect(getByText('大巴拼车')).toBeTruthy()
  69. expect(getByText('价格↓')).toBeTruthy()
  70. })
  71. it('应该正确显示排序图标', () => {
  72. const { getByText } = render(
  73. <RouteFilter
  74. sortBy="departureTime"
  75. sortOrder="asc"
  76. />
  77. )
  78. // 展开筛选面板
  79. const filterButton = getByText('筛选')
  80. fireEvent.click(filterButton)
  81. const departureTimeSort = getByText('出发时间↑')
  82. expect(departureTimeSort).toBeTruthy()
  83. })
  84. it('应该处理全部选项的选择', () => {
  85. const mockOnRouteTypeChange = jest.fn()
  86. const { getByText } = render(
  87. <RouteFilter
  88. routeType="departure"
  89. onRouteTypeChange={mockOnRouteTypeChange}
  90. />
  91. )
  92. const allButton = getByText('全部')
  93. fireEvent.click(allButton)
  94. expect(mockOnRouteTypeChange).toHaveBeenCalledWith('all')
  95. })
  96. it('应该正确显示激活状态的样式', () => {
  97. const { getByText } = render(
  98. <RouteFilter routeType="departure" />
  99. )
  100. const departureButton = getByText('去程')
  101. const allButton = getByText('全部')
  102. // 验证去程按钮有激活样式
  103. expect(departureButton.className).toContain('bg-blue-500')
  104. expect(departureButton.className).toContain('text-white')
  105. // 验证全部按钮没有激活样式
  106. expect(allButton.className).toContain('bg-white')
  107. expect(allButton.className).toContain('text-gray-600')
  108. })
  109. it('应该支持自定义初始值', () => {
  110. const { getByText } = render(
  111. <RouteFilter
  112. routeType="return"
  113. vehicleType="charter"
  114. sortBy="price"
  115. sortOrder="desc"
  116. />
  117. )
  118. // 展开筛选面板
  119. const filterButton = getByText('筛选')
  120. fireEvent.click(filterButton)
  121. // 验证车辆类型选择正确
  122. const charterButton = getByText('包车')
  123. expect(charterButton.className).toContain('bg-green-500')
  124. // 验证排序选择正确
  125. const priceSortButton = getByText('价格↓')
  126. expect(priceSortButton.className).toContain('bg-orange-500')
  127. })
  128. })