import { render, screen } from "@testing-library/react"; import { describe, expect, it } from "vitest"; import { VertragTab } from "@/components/employees/tabs/VertragTab"; import type { Database } from "@/lib/types"; type EmployeeRow = Database["public"]["Tables"]["employees"]["Row"]; // Auf dem Vertragsblatt stand ein Feld „Merkmale" mit allem Zutreffenden, // durch Kommas getrennt — und einem Gedankenstrich, wenn nichts zutraf. // Daraus liess sich nicht ablesen, ob jemand keinen Dienstwagen hat oder ob // die Frage nie beantwortet wurde. Und beim Dienstwagen fehlte, worum es // eigentlich geht: ob Verbrenner oder E-KFZ. function mitarbeiter(teil: Partial = {}): EmployeeRow { return { id: "e1", personnel_number: 3038, first_name: "Hannah", last_name: "Winkler", gender: "w", birth_date: "1990-04-01", sv_nummer: null, nationality: "Österreich", hat_aufenthaltstitel: false, aufenthaltstitel_bis: null, address: null, address_country: null, postal_code: null, city: null, email: null, phone: null, job_title: "IT-Security-Spezialist:in", location_id: "l1", employment_type: "Vollzeit", weekly_hours: 38.5, monthly_salary_gross: null, contract_type: "unbefristet", contract_end_date: null, paygrade: "HG13", source: "Extern", status: "Aktiv", entry_date: "2017-07-15", exit_date: null, exit_reason: null, karenz_start_date: null, karenz_return_date: null, absence_type: null, avatar_color: null, worker_type: "Angestellte:r", collective_agreement: "Handel", work_days: ["Mo", "Di", "Mi", "Do", "Fr"], is_betriebsrat: false, has_dienstwagen: false, dienstwagen_art: null, has_kuendigungsschutz: false, kuendigungsschutz_bis: null, teilzeit_art: null, teilzeit_bis: null, is_laterale_fuehrung: false, is_c_level: false, title_prefix: [], title_suffix: [], emergency_contact_name: null, emergency_contact_phone: null, emergency_contact_relation: null, created_at: "2017-07-15T00:00:00.000Z", updated_at: "2017-07-15T00:00:00.000Z", ...teil, } as EmployeeRow; } /** Der Wert, der unter einer Beschriftung steht. */ function wertZu(label: string): string { return screen.getByText(label).parentElement!.querySelector("dd")!.textContent ?? ""; } describe("VertragTab — Merkmale", () => { it("führt jedes Merkmal als eigene Zeile, nicht als Aufzählung", () => { render(); for (const label of ["Dienstwagen", "Betriebsrat", "Laterale Führung", "C-Level"]) { expect(screen.getByText(label)).toBeInTheDocument(); } expect(screen.queryByText("Merkmale")).not.toBeInTheDocument(); }); it("sagt Nein, statt das Feld leer zu lassen", () => { // „–" liesse offen, ob niemand die Frage beantwortet hat. render(); expect(wertZu("Dienstwagen")).toBe("Nein"); expect(wertZu("Betriebsrat")).toBe("Nein"); expect(wertZu("C-Level")).toBe("Nein"); }); it("nennt beim Dienstwagen die Antriebsart statt eines blossen Ja", () => { render(); expect(wertZu("Dienstwagen")).toBe("E-KFZ"); }); it("unterscheidet den Verbrenner davon", () => { render(); expect(wertZu("Dienstwagen")).toBe("Verbrenner"); }); it("zeigt gesetzte Merkmale als Ja", () => { render(); expect(wertZu("Betriebsrat")).toBe("Ja"); expect(wertZu("C-Level")).toBe("Ja"); expect(wertZu("Laterale Führung")).toBe("Nein"); }); }); describe("VertragTab — Kündigungsschutz", () => { it("nennt das Enddatum statt eines blossen Ja", () => { // „Ja" allein liesse offen, ob der Schutz noch läuft — und genau danach // fragt jemand, der auf dieses Blatt schaut. render(); expect(wertZu("Besonderer Kündigungsschutz")).toBe("bis 30.06.2027"); }); it("sagt es auch, wenn das Ende offen ist", () => { render(); expect(wertZu("Besonderer Kündigungsschutz")).toBe("Ja (Ende offen)"); }); it("steht ohne Schutz auf Nein", () => { render(); expect(wertZu("Besonderer Kündigungsschutz")).toBe("Nein"); }); }); // Die Teilzeitvarianten sind keine Abwesenheiten, sondern ein Zustand mit // weniger Stunden. Damit darüber berichtet werden kann, steht die Variante an // der Person — und dann muss sie auch am Profil zu sehen sein. describe("VertragTab — Teilzeitvariante", () => { it("nennt Variante und Ende", () => { render(); expect(wertZu("Teilzeitvariante")).toBe("Bildungsteilzeit bis 30.06.2027"); }); it("sagt es auch, wenn das Ende offen ist", () => { render(); expect(wertZu("Teilzeitvariante")).toBe("Elternteilzeit (Ende offen)"); }); it("bleibt leer, wo keine besteht", () => { render(); expect(wertZu("Teilzeitvariante")).toBe("–"); }); });