Drei Seiten statt zehn: Start, Updates, Modelle — am PC mit Kopfnavigation, am Handy mit Leiste unten. Umsetzung von Mockup A („Cockpit“), vom User am 23.09. gewaehlt. - Start: Hauptwarnleuchte + 8 Warnlampen, Rundinstrumente mit Live-Werten aus dem Strom (Speicher, Temperatur, Platte) und Laufzeit-Zaehlwerk, Checkliste der Waechter-Hinweise mit ihren Knoepfen, Flugplan (heute gelaufen / geplant), Radar-Kasten. - Updates: Bausteine mit „Laeuft → Neu“ und Zusammenfassung, laufende Auftraege, Verlauf der Sonntagslaeufe (neu: GET /api/updates/verlauf), Sicherungen samt Zurueckspielen mit Rueckfrage. - Modelle: Speicherbalken, Rollen Hirn/Coder/Dritte Rolle, wer die Modelle nutzt (7 Tage + 24 h je Stunde), Modell-Radar, weitere Eintraege, Modelle selbst suchen. - Schubladen: Dienste mit Protokoll und Neustart, Einstellungen (HF-Zugang), Hermes-Link. - Werkzeuge: Vite 8, React 19.3 mit React Compiler 1.0 (Babel), vitest 5, Tailwind 4.3, shadcn 4 (Radix) fuer Dialog/Schublade/Knopf, Schriften Barlow/Barlow Condensed/ JetBrains Mono. Entfernt: recharts, cmdk, Kraftgraph, zustand, Inter, Space Grotesk. - Startbuendel 115 KB gzip (Budget 140); Updates/Modelle/Schubladen laden bei Bedarf. - 16 Oberflaechen-Tests (Instrument-Bogen, Hauptleuchte, Zeitformate, Versionen). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
2.2 KiB
TypeScript
56 lines
2.2 KiB
TypeScript
import { render, screen } from "@testing-library/react"
|
|
import { bogenPfad, hauptleuchte } from "@/lib/anzeige"
|
|
import { Warnpanel } from "./Warnpanel"
|
|
import type { Start } from "@/lib/typen"
|
|
|
|
const ruhig: Start["zustand"] = { stufe: "ok", anzahl: 0, waechter_wach: true, stand: 1, update_laeuft: false }
|
|
|
|
describe("bogenPfad", () => {
|
|
it("beginnt links unten und endet bei vollem Ausschlag rechts unten", () => {
|
|
expect(bogenPfad(0, 1, 75)).toBe("M 35.05 132.5 A 75 75 0 1 1 164.95 132.5")
|
|
})
|
|
|
|
it("zeichnet 45 % Speicher als kleinen Bogen bis kurz vor die Spitze", () => {
|
|
// 45 % von 240° = 108° → Endwinkel 102°, also knapp links der Senkrechten.
|
|
expect(bogenPfad(0, 0.45, 75)).toBe("M 35.05 132.5 A 75 75 0 0 1 84.41 21.64")
|
|
})
|
|
|
|
it("klemmt Werte außerhalb von 0…1", () => {
|
|
expect(bogenPfad(-1, 2, 75)).toBe(bogenPfad(0, 1, 75))
|
|
})
|
|
})
|
|
|
|
describe("hauptleuchte", () => {
|
|
it("bleibt ruhig, wenn nichts offen ist", () => {
|
|
expect(hauptleuchte(ruhig)).toMatchObject({ art: "ok", mitte: "IN ORDNUNG" })
|
|
})
|
|
|
|
it("zeigt Bernstein bei gelben und Rot bei roten Hinweisen", () => {
|
|
expect(hauptleuchte({ ...ruhig, stufe: "gelb", anzahl: 2 })).toMatchObject({ art: "gelb", mitte: "2 HINWEISE" })
|
|
expect(hauptleuchte({ ...ruhig, stufe: "rot", anzahl: 1 })).toMatchObject({ art: "rot", mitte: "1 HINWEIS" })
|
|
})
|
|
|
|
it("meldet einen schweigenden Wächter vor allem anderen", () => {
|
|
expect(hauptleuchte({ ...ruhig, waechter_wach: false, anzahl: 3, stufe: "rot" }).art).toBe("stumm")
|
|
})
|
|
})
|
|
|
|
describe("Warnpanel", () => {
|
|
it("zeigt jede Lampe mit Name und Wert", () => {
|
|
render(
|
|
<Warnpanel
|
|
zustand={{ ...ruhig, stufe: "gelb", anzahl: 2 }}
|
|
lampen={[
|
|
{ id: "motor", label: "Motor", zustand: "ok", wert: "b11057" },
|
|
{ id: "jobs", label: "Jobs", zustand: "warn", wert: "2 Hinweise" },
|
|
]}
|
|
onAnsehen={() => {}}
|
|
/>,
|
|
)
|
|
expect(screen.getByText("Motor")).toBeInTheDocument()
|
|
expect(screen.getByText("b11057")).toBeInTheDocument()
|
|
expect(screen.getByText("braucht Aufmerksamkeit")).toBeInTheDocument()
|
|
expect(screen.getByRole("button", { name: /Achtung 2 HINWEISE/ })).toBeEnabled()
|
|
})
|
|
})
|