import { describe, expect, it, vi } from "vitest"; import { render, screen } from "@testing-library/react"; import { BrowserRouter } from "react-router"; vi.mock("~/models/sport", () => ({ findPublicSportsWithCurrentSeasons: vi.fn(), })); vi.mock("~/components/SportIcon", () => ({ SportIcon: () => null, })); import Sports, { loader } from "../sports"; import { findPublicSportsWithCurrentSeasons } from "~/models/sport"; import type { PublicSportWithCurrentSeasons } from "~/models/sport"; const sports: PublicSportWithCurrentSeasons[] = [ { id: "nfl", name: "NFL", type: "team", slug: "nfl", description: "Draft teams in the NFL postseason.", iconUrl: "nfl.svg", simulatorType: "nfl_bracket", excludeFromHomepage: false, createdAt: new Date("2026-01-01T00:00:00Z"), updatedAt: new Date("2026-01-01T00:00:00Z"), currentSeasons: [ { id: "nfl-2026", name: "NFL 2026", year: 2026, status: "active", scoringPattern: "playoff_bracket", scoringType: "playoffs", }, ], }, { id: "tennis", name: "Tennis", type: "individual", slug: "tennis", description: null, iconUrl: null, simulatorType: "tennis_qualifying_points", excludeFromHomepage: false, createdAt: new Date("2026-01-01T00:00:00Z"), updatedAt: new Date("2026-01-01T00:00:00Z"), currentSeasons: [ { id: "tennis-2026", name: "Tennis Majors 2026", year: 2026, status: "upcoming", scoringPattern: "qualifying_points", scoringType: "majors", }, ], }, { id: "f1", name: "Formula 1", type: "individual", slug: "f1", description: "Draft drivers for the full season.", iconUrl: "f1.svg", simulatorType: "f1_standings", excludeFromHomepage: false, createdAt: new Date("2026-01-01T00:00:00Z"), updatedAt: new Date("2026-01-01T00:00:00Z"), currentSeasons: [ { id: "f1-2026", name: "Formula 1 2026", year: 2026, status: "active", scoringPattern: "season_standings", scoringType: "regular_season", }, ], }, ]; function renderSports(loaderData = { sports }) { return render( ); } describe("/sports route", () => { it("loads public sports from the model", async () => { vi.mocked(findPublicSportsWithCurrentSeasons).mockResolvedValue(sports); await expect(loader()).resolves.toEqual({ sports }); }); it("renders the sport count, groups, cards, and support CTA", () => { renderSports(); expect(screen.getByRole("heading", { name: "Sports" })).toBeInTheDocument(); expect(screen.getByText(/Brackt currently supports 3 sports/i)).toBeInTheDocument(); expect(screen.getByRole("heading", { name: "Playoffs" })).toBeInTheDocument(); expect(screen.getByRole("heading", { name: "Season-Long Standings" })).toBeInTheDocument(); expect(screen.getByRole("heading", { name: "Majors" })).toBeInTheDocument(); expect(screen.getByText("NFL")).toBeInTheDocument(); expect(screen.getByText("Draft teams in the NFL postseason.")).toBeInTheDocument(); expect(screen.getByText("Available for Brackt leagues.")).toBeInTheDocument(); expect(screen.queryByText(/^1 active season$/i)).not.toBeInTheDocument(); expect(screen.queryByText("Tennis Majors 2026")).not.toBeInTheDocument(); expect(screen.getByRole("link", { name: /contact support/i })).toHaveAttribute("href", "/support"); }); });