RouteFilter.test.tsx 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. import React from 'react'
  2. import { render, screen, fireEvent } from '@testing-library/react'
  3. import { RouteFilter } from '../../src/components/RouteFilter'
  4. describe('RouteFilter 组件', () => {
  5. test('应该正确渲染组件', () => {
  6. const onRouteTypeChange = jest.fn()
  7. const onVehicleTypeChange = jest.fn()
  8. const onSortChange = jest.fn()
  9. render(
  10. <RouteFilter
  11. onRouteTypeChange={onRouteTypeChange}
  12. onVehicleTypeChange={onVehicleTypeChange}
  13. onSortChange={onSortChange}
  14. />
  15. )
  16. // 检查路线类型筛选
  17. expect(screen.getByText('全部')).toBeInTheDocument()
  18. expect(screen.getByText('去程')).toBeInTheDocument()
  19. expect(screen.getByText('返程')).toBeInTheDocument()
  20. // 检查筛选按钮
  21. expect(screen.getByText('筛选')).toBeInTheDocument()
  22. // 检查当前筛选状态显示
  23. expect(screen.getByText('出发时间↑')).toBeInTheDocument()
  24. })
  25. test('应该处理路线类型选择', () => {
  26. const onRouteTypeChange = jest.fn()
  27. const onVehicleTypeChange = jest.fn()
  28. const onSortChange = jest.fn()
  29. render(
  30. <RouteFilter
  31. onRouteTypeChange={onRouteTypeChange}
  32. onVehicleTypeChange={onVehicleTypeChange}
  33. onSortChange={onSortChange}
  34. />
  35. )
  36. // 点击去程选项
  37. const departureOption = screen.getByText('去程')
  38. fireEvent.click(departureOption)
  39. // 检查回调被调用
  40. expect(onRouteTypeChange).toHaveBeenCalledWith('departure')
  41. expect(onVehicleTypeChange).not.toHaveBeenCalled()
  42. expect(onSortChange).not.toHaveBeenCalled()
  43. })
  44. test('应该处理车辆类型选择', () => {
  45. const onRouteTypeChange = jest.fn()
  46. const onVehicleTypeChange = jest.fn()
  47. const onSortChange = jest.fn()
  48. render(
  49. <RouteFilter
  50. onRouteTypeChange={onRouteTypeChange}
  51. onVehicleTypeChange={onVehicleTypeChange}
  52. onSortChange={onSortChange}
  53. />
  54. )
  55. // 点击筛选按钮展开扩展筛选区域
  56. const filterButton = screen.getByText('筛选')
  57. fireEvent.click(filterButton)
  58. // 点击大巴拼车选项
  59. const busOption = screen.getByText('大巴拼车')
  60. fireEvent.click(busOption)
  61. // 检查回调被调用
  62. expect(onVehicleTypeChange).toHaveBeenCalledWith('bus')
  63. expect(onRouteTypeChange).not.toHaveBeenCalled()
  64. expect(onSortChange).not.toHaveBeenCalled()
  65. })
  66. test('应该处理排序选择', () => {
  67. const onRouteTypeChange = jest.fn()
  68. const onVehicleTypeChange = jest.fn()
  69. const onSortChange = jest.fn()
  70. render(
  71. <RouteFilter
  72. onRouteTypeChange={onRouteTypeChange}
  73. onVehicleTypeChange={onVehicleTypeChange}
  74. onSortChange={onSortChange}
  75. />
  76. )
  77. // 点击筛选按钮展开扩展筛选区域
  78. const filterButton = screen.getByText('筛选')
  79. fireEvent.click(filterButton)
  80. // 点击价格排序选项
  81. const priceSortOption = screen.getByText('价格')
  82. fireEvent.click(priceSortOption)
  83. // 检查回调被调用
  84. expect(onSortChange).toHaveBeenCalledWith('price', 'asc')
  85. expect(onRouteTypeChange).not.toHaveBeenCalled()
  86. expect(onVehicleTypeChange).not.toHaveBeenCalled()
  87. })
  88. test('应该处理排序方向切换', () => {
  89. const onRouteTypeChange = jest.fn()
  90. const onVehicleTypeChange = jest.fn()
  91. const onSortChange = jest.fn()
  92. render(
  93. <RouteFilter
  94. sortBy="price"
  95. sortOrder="asc"
  96. onRouteTypeChange={onRouteTypeChange}
  97. onVehicleTypeChange={onVehicleTypeChange}
  98. onSortChange={onSortChange}
  99. />
  100. )
  101. // 点击筛选按钮展开扩展筛选区域
  102. const filterButton = screen.getByText('筛选')
  103. fireEvent.click(filterButton)
  104. // 再次点击价格排序选项(应该切换为降序)
  105. const priceSortOption = screen.getByText('价格')
  106. fireEvent.click(priceSortOption)
  107. // 检查回调被调用,排序方向切换为降序
  108. expect(onSortChange).toHaveBeenCalledWith('price', 'desc')
  109. })
  110. test('应该显示筛选状态', () => {
  111. const onRouteTypeChange = jest.fn()
  112. const onVehicleTypeChange = jest.fn()
  113. const onSortChange = jest.fn()
  114. render(
  115. <RouteFilter
  116. routeType="departure"
  117. vehicleType="bus"
  118. sortBy="price"
  119. sortOrder="desc"
  120. onRouteTypeChange={onRouteTypeChange}
  121. onVehicleTypeChange={onVehicleTypeChange}
  122. onSortChange={onSortChange}
  123. />
  124. )
  125. // 检查筛选状态显示
  126. expect(screen.getByText('去程')).toBeInTheDocument()
  127. expect(screen.getByText('大巴拼车')).toBeInTheDocument()
  128. expect(screen.getByText('价格↓')).toBeInTheDocument()
  129. })
  130. test('应该显示正确的排序图标', () => {
  131. const onRouteTypeChange = jest.fn()
  132. const onVehicleTypeChange = jest.fn()
  133. const onSortChange = jest.fn()
  134. render(
  135. <RouteFilter
  136. sortBy="departureTime"
  137. sortOrder="asc"
  138. onRouteTypeChange={onRouteTypeChange}
  139. onVehicleTypeChange={onVehicleTypeChange}
  140. onSortChange={onSortChange}
  141. />
  142. )
  143. // 检查出发时间排序显示升序图标
  144. expect(screen.getByText('出发时间↑')).toBeInTheDocument()
  145. })
  146. test('应该切换筛选区域的显示状态', () => {
  147. const onRouteTypeChange = jest.fn()
  148. const onVehicleTypeChange = jest.fn()
  149. const onSortChange = jest.fn()
  150. render(
  151. <RouteFilter
  152. onRouteTypeChange={onRouteTypeChange}
  153. onVehicleTypeChange={onVehicleTypeChange}
  154. onSortChange={onSortChange}
  155. />
  156. )
  157. // 初始状态下扩展筛选区域应该隐藏
  158. expect(screen.queryByText('车辆类型')).not.toBeInTheDocument()
  159. expect(screen.queryByText('排序方式')).not.toBeInTheDocument()
  160. // 点击筛选按钮
  161. const filterButton = screen.getByText('筛选')
  162. fireEvent.click(filterButton)
  163. // 扩展筛选区域应该显示
  164. expect(screen.getByText('车辆类型')).toBeInTheDocument()
  165. expect(screen.getByText('排序方式')).toBeInTheDocument()
  166. // 再次点击筛选按钮
  167. fireEvent.click(filterButton)
  168. // 扩展筛选区域应该隐藏
  169. expect(screen.queryByText('车辆类型')).not.toBeInTheDocument()
  170. expect(screen.queryByText('排序方式')).not.toBeInTheDocument()
  171. })
  172. test('应该显示筛选按钮的展开/收起状态', () => {
  173. const onRouteTypeChange = jest.fn()
  174. const onVehicleTypeChange = jest.fn()
  175. const onSortChange = jest.fn()
  176. render(
  177. <RouteFilter
  178. onRouteTypeChange={onRouteTypeChange}
  179. onVehicleTypeChange={onVehicleTypeChange}
  180. onSortChange={onSortChange}
  181. />
  182. )
  183. // 初始状态下应该显示向下箭头
  184. const filterButton = screen.getByText('筛选')
  185. expect(filterButton.parentElement).toHaveTextContent('筛选▼')
  186. // 点击筛选按钮
  187. fireEvent.click(filterButton)
  188. // 应该显示向上箭头
  189. expect(filterButton.parentElement).toHaveTextContent('筛选▲')
  190. })
  191. test('应该正确应用选中样式', () => {
  192. const onRouteTypeChange = jest.fn()
  193. const onVehicleTypeChange = jest.fn()
  194. const onSortChange = jest.fn()
  195. render(
  196. <RouteFilter
  197. routeType="departure"
  198. vehicleType="bus"
  199. sortBy="price"
  200. sortOrder="asc"
  201. onRouteTypeChange={onRouteTypeChange}
  202. onVehicleTypeChange={onVehicleTypeChange}
  203. onSortChange={onSortChange}
  204. />
  205. )
  206. // 展开筛选区域
  207. const filterButton = screen.getByText('筛选')
  208. fireEvent.click(filterButton)
  209. // 检查去程选项的选中样式
  210. const departureOption = screen.getByText('去程')
  211. expect(departureOption.parentElement).toHaveClass('bg-blue-500')
  212. expect(departureOption.parentElement).toHaveClass('text-white')
  213. // 检查大巴拼车选项的选中样式
  214. const busOption = screen.getByText('大巴拼车')
  215. expect(busOption.parentElement).toHaveClass('bg-green-500')
  216. expect(busOption.parentElement).toHaveClass('text-white')
  217. // 检查价格排序选项的选中样式
  218. const priceSortOption = screen.getByText('价格')
  219. expect(priceSortOption.parentElement).toHaveClass('bg-orange-500')
  220. expect(priceSortOption.parentElement).toHaveClass('text-white')
  221. })
  222. test('应该处理默认值', () => {
  223. const onRouteTypeChange = jest.fn()
  224. const onVehicleTypeChange = jest.fn()
  225. const onSortChange = jest.fn()
  226. render(
  227. <RouteFilter
  228. onRouteTypeChange={onRouteTypeChange}
  229. onVehicleTypeChange={onVehicleTypeChange}
  230. onSortChange={onSortChange}
  231. />
  232. )
  233. // 检查默认值
  234. expect(screen.getByText('全部')).toBeInTheDocument()
  235. expect(screen.getByText('出发时间↑')).toBeInTheDocument()
  236. // 展开筛选区域
  237. const filterButton = screen.getByText('筛选')
  238. fireEvent.click(filterButton)
  239. // 检查车辆类型默认值
  240. expect(screen.getByText('全部')).toBeInTheDocument()
  241. })
  242. test('应该不显示全部类型的筛选状态', () => {
  243. const onRouteTypeChange = jest.fn()
  244. const onVehicleTypeChange = jest.fn()
  245. const onSortChange = jest.fn()
  246. render(
  247. <RouteFilter
  248. routeType="all"
  249. vehicleType="all"
  250. sortBy="departureTime"
  251. sortOrder="asc"
  252. onRouteTypeChange={onRouteTypeChange}
  253. onVehicleTypeChange={onVehicleTypeChange}
  254. onSortChange={onSortChange}
  255. />
  256. )
  257. // 检查筛选状态显示
  258. expect(screen.queryByText('全部')).not.toBeInTheDocument() // 路线类型全部不显示
  259. expect(screen.queryByText('全部')).not.toBeInTheDocument() // 车辆类型全部不显示
  260. expect(screen.getByText('出发时间↑')).toBeInTheDocument() // 排序方式始终显示
  261. })
  262. })