import { fireEvent, render, screen, within } from "@testing-library/react" import type { Saeule } from "@/lib/diagramm" import { Saeulen } from "./Saeulen" const REIHEN = [{ name: "A", farbe: "var(--reihe-1)" }, { name: "B", farbe: "var(--reihe-2)" }, { name: "C", farbe: "var(--reihe-3)" }] const stunden = Array.from({ length: 24 }, (_, i): Saeule => { const h = (15 + i) % 24 return { schluessel: String(i), achse: `${String(h).padStart(2, "0")}:00`, raster: h, lang: `${h} Uhr`, werte: h === 3 ? { A: 139 } : { A: 5, B: i % 2 }, } }) /** Der Behälter meldet eine feste Breite, wie ein Handy (jsdom kennt keinen ResizeObserver). */ function breiteVortaeuschen(px: number) { vi.stubGlobal("ResizeObserver", class { constructor(private melden: (e: { contentRect: { width: number } }[]) => void) {} observe() { this.melden([{ contentRect: { width: px } }]) } disconnect() {} }) } afterEach(() => vi.unstubAllGlobals()) describe("Saeulen", () => { it("dünnt die Stundenbeschriftung aus und nennt nur die höchste Summe", () => { const { container } = render() const texte = [...container.querySelectorAll("svg text")].map((t) => t.textContent) expect(texte).toEqual(expect.arrayContaining(["15:00", "18:00", "00:00", "03:00", "139"])) expect(texte).not.toContain("16:00") expect(texte.filter((t) => t === "6")).toHaveLength(0) // die übrigen Summen stehen nur in Anzeige und Tabelle }) it("zeigt in der Legende nur Reihen mit Werten", () => { render() expect(within(screen.getByRole("list", { name: "Legende" })).getAllByRole("listitem").map((l) => l.textContent)) .toEqual(["A", "B"]) }) it("stellt die Anzeige auf dem Handy unter das Diagramm statt darüber", () => { breiteVortaeuschen(300) render() const bild = screen.getByRole("img", { name: "Je Stunde" }) expect(bild).toHaveAttribute("width", "300") fireEvent.focus(bild) const anzeige = screen.getByRole("status") expect(anzeige).not.toHaveClass("absolute") expect(anzeige).toHaveTextContent("14 Uhr") expect(bild.compareDocumentPosition(anzeige) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy() }) it("sagt es, wenn es nichts zu zeigen gibt", () => { render() expect(screen.getByText("Keine Anfragen in diesem Zeitraum")).toBeInTheDocument() expect(screen.queryByRole("list", { name: "Legende" })).not.toBeInTheDocument() }) })