import { describe, it, expect, vi } from "vitest";
import { render, screen, fireEvent } from "@testing-library/react";
import { DeadlineTrafficLights } from "@/components/dashboard/DeadlineTrafficLights";
import type { DeadlineSummary } from "@/lib/types";
describe("DeadlineTrafficLights", () => {
const defaultData: DeadlineSummary = {
overdue_count: 3,
due_this_week: 5,
due_next_week: 2,
ok_count: 10,
};
it("renders all three traffic light cards", () => {
render();
expect(screen.getByText("Überfällig")).toBeInTheDocument();
expect(screen.getByText("Diese Woche")).toBeInTheDocument();
expect(screen.getByText("Im Zeitplan")).toBeInTheDocument();
});
it("displays correct counts", () => {
render();
// Overdue: 3
expect(screen.getByText("3")).toBeInTheDocument();
// This week: 5
expect(screen.getByText("5")).toBeInTheDocument();
// OK: ok_count + due_next_week = 10 + 2 = 12
expect(screen.getByText("12")).toBeInTheDocument();
});
it("displays zero counts correctly", () => {
const zeroData: DeadlineSummary = {
overdue_count: 0,
due_this_week: 0,
due_next_week: 0,
ok_count: 0,
};
render();
const zeros = screen.getAllByText("0");
expect(zeros).toHaveLength(3);
});
it("calls onFilter with correct key when clicked", () => {
const onFilter = vi.fn();
render();
fireEvent.click(screen.getByText("Überfällig"));
expect(onFilter).toHaveBeenCalledWith("overdue");
fireEvent.click(screen.getByText("Diese Woche"));
expect(onFilter).toHaveBeenCalledWith("this_week");
fireEvent.click(screen.getByText("Im Zeitplan"));
expect(onFilter).toHaveBeenCalledWith("ok");
});
it("renders without onFilter prop (no crash)", () => {
expect(() => {
render();
fireEvent.click(screen.getByText("Überfällig"));
}).not.toThrow();
});
});