import { describe, it, expect, vi, beforeEach } from "vitest";
import { render, screen, fireEvent } from "@testing-library/react";
import { MiniDraftGrid } from "~/components/draft/MiniDraftGrid";
const draftSlots = [
{ id: "slot-1", draftOrder: 1, team: { id: "team-1", name: "Alpha", logoUrl: null } },
{ id: "slot-2", draftOrder: 2, team: { id: "team-2", name: "Bravo", logoUrl: null } },
];
const ownerMap = { "team-1": "Alpha", "team-2": "Bravo" };
// Round 1: team-1 pick 1 (filled), team-2 pick 2 (current/empty)
// Round 2 (snake): team-2 pick 3, team-1 pick 4 — both empty
const draftGrid = [
[
{ pickNumber: 1, round: 1, pickInRound: 1, teamId: "team-1", pick: { participant: { name: "Player A" }, sport: { name: "NFL" } } },
{ pickNumber: 2, round: 1, pickInRound: 2, teamId: "team-2" },
],
[
{ pickNumber: 3, round: 2, pickInRound: 1, teamId: "team-2" },
{ pickNumber: 4, round: 2, pickInRound: 2, teamId: "team-1" },
],
];
const baseProps = {
draftSlots,
draftGrid,
currentPick: 2,
currentRound: 1,
ownerMap,
};
describe("MiniDraftGrid", () => {
beforeEach(() => vi.clearAllMocks());
describe("Team header layout", () => {
it("renders all team names", () => {
render();
expect(screen.getAllByText("Alpha").length).toBeGreaterThan(0);
expect(screen.getAllByText("Bravo").length).toBeGreaterThan(0);
});
it("non-commissioner headers carry flex sizing classes", () => {
render();
const alphaHeader = screen.getAllByText("Alpha")[0].closest(".flex-1");
expect(alphaHeader).toHaveClass("flex-1", "min-w-20");
});
it("commissioner headers carry flex sizing classes", () => {
render(
);
const alphaHeader = screen.getAllByText("Alpha")[0].closest(".flex-1");
expect(alphaHeader).toHaveClass("flex-1", "min-w-20");
});
});
describe("Disconnected team styling", () => {
it("applies italic + muted style to disconnected teams when connectedTeams provided", () => {
render(
);
const bravoSpan = screen.getAllByText("Bravo")[0];
expect(bravoSpan).toHaveClass("italic", "text-muted-foreground");
const alphaSpan = screen.getAllByText("Alpha")[0];
expect(alphaSpan).not.toHaveClass("italic");
});
it("treats all teams as connected when connectedTeams is not provided", () => {
render();
expect(screen.getAllByText("Alpha")[0]).not.toHaveClass("italic");
expect(screen.getAllByText("Bravo")[0]).not.toHaveClass("italic");
});
});
describe("Team header context menus (commissioner)", () => {
it("shows no context menu when callbacks are absent", () => {
render();
const alphaHeader = screen.getAllByText("Alpha")[0];
fireEvent.contextMenu(alphaHeader);
expect(screen.queryByText("Adjust Time Bank...")).not.toBeInTheDocument();
expect(screen.queryByText("Set Autodraft...")).not.toBeInTheDocument();
});
it("shows Adjust Time Bank and Set Autodraft on right-click when both callbacks provided", () => {
render(
);
fireEvent.contextMenu(screen.getAllByText("Alpha")[0]);
expect(screen.getByText("Adjust Time Bank...")).toBeInTheDocument();
expect(screen.getByText("Set Autodraft...")).toBeInTheDocument();
});
it("shows only Adjust Time Bank when only that callback is provided", () => {
render(
);
fireEvent.contextMenu(screen.getAllByText("Alpha")[0]);
expect(screen.getByText("Adjust Time Bank...")).toBeInTheDocument();
expect(screen.queryByText("Set Autodraft...")).not.toBeInTheDocument();
});
});
describe("Current cell context menu (commissioner)", () => {
it("shows Force Auto Pick and Force Manual Pick on right-click of current cell", () => {
render(
);
// Pick 2 is the current cell (team-2, round 1)
const currentCell = screen.getByTitle("Overall Pick #2");
fireEvent.contextMenu(currentCell);
expect(screen.getByText("Force Auto Pick")).toBeInTheDocument();
expect(screen.getByText("Force Manual Pick")).toBeInTheDocument();
});
it("shows no force-pick menu when no callbacks provided", () => {
render();
fireEvent.contextMenu(screen.getByTitle("Overall Pick #2"));
expect(screen.queryByText("Force Auto Pick")).not.toBeInTheDocument();
expect(screen.queryByText("Force Manual Pick")).not.toBeInTheDocument();
});
});
describe("Picked cell context menu (commissioner)", () => {
it("shows Replace Pick and Roll Back on right-click of a picked cell", () => {
render(
);
// Pick 1 is already picked (team-1)
const pickedCell = screen.getByTitle("Overall Pick #1");
fireEvent.contextMenu(pickedCell);
expect(screen.getByText("Replace Pick")).toBeInTheDocument();
expect(screen.getByText("Roll Back to This Pick")).toBeInTheDocument();
});
it("shows no menu on picked cell when no callbacks provided", () => {
render();
fireEvent.contextMenu(screen.getByTitle("Overall Pick #1"));
expect(screen.queryByText("Replace Pick")).not.toBeInTheDocument();
});
});
describe("Empty grid", () => {
it("renders nothing when draftGrid is empty", () => {
const { container } = render(
);
expect(container.firstChild).toBeNull();
});
});
});