import { describe, expect, it } from "vitest" import { render } from "@testing-library/react" import { Dichteleiste } from "./Dichteleiste" import type { ChronikItem } from "@/lib/api" function eintrag(ts: number): ChronikItem { return { id: ts, ts, subject: "x", text: "y", source: "test", priority: "normal" } } /** Die Balken der Leiste (ohne die Achsen-Beschriftung darunter). */ function balken(container: HTMLElement): HTMLElement[] { return [...container.querySelectorAll('[role="img"] > div')] as HTMLElement[] } describe("Dichteleiste", () => { it("zeigt nichts, wenn es nichts zu zeigen gibt", () => { const { container } = render() expect(container).toBeEmptyDOMElement() }) it("verteilt die Einträge über die volle Breite", () => { const basis = 1_800_000_000 const items = [eintrag(basis), eintrag(basis + 43_200), eintrag(basis + 86_400)] const { container } = render() const b = balken(container) expect(b).toHaveLength(48) // Erster, mittlerer und letzter Eimer sind belegt — dazwischen ist es leer. expect(b[0].style.height).not.toBe("2px") expect(b[47].style.height).not.toBe("2px") expect(b[5].style.height).toBe("2px") }) // Ohne Mindesthöhe sähe ein ruhiger Tag aus wie gar keine Aktivität — genau die // Verwechslung, die die Leiste verhindern soll. it("macht auch einen einzelnen Eintrag sichtbar", () => { const { container } = render() const belegt = balken(container).filter((d) => d.style.height !== "2px") expect(belegt).toHaveLength(1) expect(parseFloat(belegt[0].style.height)).toBeGreaterThanOrEqual(12) }) it("beschriftet sich für Screenreader mit Anzahl und Zeitraum", () => { const basis = 1_800_000_000 const { container } = render() const label = container.querySelector('[role="img"]')!.getAttribute("aria-label")! expect(label).toMatch(/2 Einträge/) expect(label).toMatch(/zwischen .* und /) }) it("hebt die Leiste hervor, solange gefiltert wird", () => { const items = [eintrag(1_800_000_000)] const normal = render().container const gefiltert = render().container const klasse = (c: HTMLElement) => balken(c).find((d) => d.style.height !== "2px")!.className expect(klasse(normal)).toMatch(/primary\/40/) expect(klasse(gefiltert)).toMatch(/primary\/70/) }) })