| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- import React from 'react'
- import { render, fireEvent, waitFor } from '@testing-library/react'
- import { ActivitySelectPage } from '../../src/pages/select-activity/ActivitySelectPage'
- // Mock Taro路由和导航
- jest.mock('@tarojs/taro', () => ({
- useRouter: jest.fn(() => ({
- params: {
- startLocationId: '1',
- endLocationId: '2',
- date: '2025-10-18',
- vehicleType: 'bus'
- }
- })),
- navigateTo: jest.fn()
- }))
- // Mock API调用
- jest.mock('../../src/api', () => ({
- routeClient: {
- search: {
- $get: jest.fn().mockResolvedValue({
- status: 200,
- json: jest.fn().mockResolvedValue([
- {
- id: 1,
- startLocation: { name: '北京市' },
- endLocation: { name: '上海市' },
- activities: [
- {
- id: 101,
- name: '上海音乐节',
- venueLocation: {
- name: '上海大舞台',
- province: '上海市',
- city: '上海市',
- district: '徐汇区',
- address: '上海市徐汇区漕溪北路1111号'
- },
- startDate: '2025-10-20T19:00:00Z',
- endDate: '2025-10-20T22:00:00Z',
- imageUrl: 'https://example.com/concert.jpg'
- }
- ],
- routeType: 'departure'
- },
- {
- id: 2,
- startLocation: { name: '北京市' },
- endLocation: { name: '上海市' },
- activities: [
- {
- id: 102,
- name: '北京艺术展',
- venueLocation: {
- name: '北京美术馆',
- province: '北京市',
- city: '北京市',
- district: '东城区',
- address: '北京市东城区美术馆后街'
- },
- startDate: '2025-10-19T10:00:00Z',
- endDate: '2025-10-19T18:00:00Z',
- imageUrl: 'https://example.com/exhibition.jpg'
- }
- ],
- routeType: 'return'
- }
- ])
- })
- }
- }
- }))
- describe('ActivitySelectPage', () => {
- beforeEach(() => {
- jest.clearAllMocks()
- })
- it('应该正确渲染页面头部信息', async () => {
- const { getByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- expect(getByText('北京市 → 上海市')).toBeTruthy()
- expect(getByText('2025-10-18')).toBeTruthy()
- expect(getByText('选择观看活动')).toBeTruthy()
- })
- })
- it('应该加载并显示活动列表', async () => {
- const { getByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- expect(getByText('去程活动')).toBeTruthy()
- expect(getByText('返程活动')).toBeTruthy()
- expect(getByText('上海音乐节')).toBeTruthy()
- expect(getByText('北京艺术展')).toBeTruthy()
- })
- })
- it('应该正确显示活动信息', async () => {
- const { getByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- // 验证去程活动信息
- expect(getByText('上海音乐节')).toBeTruthy()
- expect(getByText('徐汇区 · 上海市 · 上海市')).toBeTruthy()
- expect(getByText('到达:上海市')).toBeTruthy()
- // 验证返程活动信息
- expect(getByText('北京艺术展')).toBeTruthy()
- expect(getByText('东城区 · 北京市 · 北京市')).toBeTruthy()
- expect(getByText('出发:北京市')).toBeTruthy()
- })
- })
- it('应该处理活动选择并导航', async () => {
- const mockNavigateTo = require('@tarojs/taro').navigateTo
- const { getByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- expect(getByText('上海音乐节')).toBeTruthy()
- })
- const activityItem = getByText('上海音乐节')
- fireEvent.click(activityItem)
- expect(mockNavigateTo).toHaveBeenCalledWith({
- url: '/pages/schedule-list/ScheduleListPage?startLocationId=1&endLocationId=2&date=2025-10-18&vehicleType=bus&activityId=101&routeType=departure'
- })
- })
- it('应该处理空活动列表', async () => {
- // Mock 空数据
- const routeClient = require('../../src/api').routeClient
- routeClient.search.$get.mockResolvedValueOnce({
- status: 200,
- json: jest.fn().mockResolvedValue([])
- })
- const { getByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- expect(getByText('暂无相关活动')).toBeTruthy()
- expect(getByText('北京市和上海市当前都没有热门活动')).toBeTruthy()
- })
- })
- it('应该处理加载状态', () => {
- // Mock 延迟加载
- const routeClient = require('../../src/api').routeClient
- routeClient.search.$get.mockImplementationOnce(
- () => new Promise(resolve => setTimeout(resolve, 100))
- )
- const { getByText } = render(<ActivitySelectPage />)
- expect(getByText('加载中...')).toBeTruthy()
- })
- it('应该正确格式化日期', async () => {
- const { getByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- // 验证日期格式化
- expect(getByText('2025/10/20')).toBeTruthy()
- expect(getByText('2025/10/19')).toBeTruthy()
- })
- })
- it('应该显示活动地址信息', async () => {
- const { getByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- expect(getByText('上海市徐汇区漕溪北路1111号')).toBeTruthy()
- expect(getByText('北京市东城区美术馆后街')).toBeTruthy()
- })
- })
- it('应该处理路由参数缺失的情况', () => {
- // Mock 缺失参数
- const useRouter = require('@tarojs/taro').useRouter
- useRouter.mockReturnValueOnce({
- params: {}
- })
- const { getByText } = render(<ActivitySelectPage />)
- // 验证页面仍然渲染,但可能显示错误或空状态
- expect(getByText('选择观看活动')).toBeTruthy()
- })
- it('应该去重活动列表', async () => {
- // Mock 包含重复活动的数据
- const routeClient = require('../../src/api').routeClient
- routeClient.search.$get.mockResolvedValueOnce({
- status: 200,
- json: jest.fn().mockResolvedValue([
- {
- id: 1,
- startLocation: { name: '北京市' },
- endLocation: { name: '上海市' },
- activities: [
- {
- id: 101,
- name: '上海音乐节',
- venueLocation: { name: '上海大舞台' },
- startDate: '2025-10-20T19:00:00Z',
- endDate: '2025-10-20T22:00:00Z'
- }
- ],
- routeType: 'departure'
- },
- {
- id: 2,
- startLocation: { name: '北京市' },
- endLocation: { name: '上海市' },
- activities: [
- {
- id: 101,
- name: '上海音乐节',
- venueLocation: { name: '上海大舞台' },
- startDate: '2025-10-20T19:00:00Z',
- endDate: '2025-10-20T22:00:00Z'
- }
- ],
- routeType: 'departure'
- }
- ])
- })
- const { getAllByText } = render(<ActivitySelectPage />)
- await waitFor(() => {
- // 验证重复活动只显示一次
- const activityItems = getAllByText('上海音乐节')
- expect(activityItems.length).toBe(1)
- })
- })
- })
|