Neustart-Festhaenger, OTA-Pruefsumme, Statistik-Kopfzahl (2026.8.31.4)

Die App blieb nach einem Neustart von Home Assistant auf dem alten Stand
stehen, mit einer 502-Fehlerzeile, die erst ein Beenden der App wegbekam.
Zwei Ursachen: 502/503/504 galten als harter Ladefehler statt als "Server
faehrt gerade hoch", und nach dem Wiederverbinden wurde genau einmal
nachgeladen - schlug das fehl, kam nie wieder ein Versuch. Beides behoben,
vier Regressionstests dazu.

OTA: das Buendel ist von HEAD ueber die Platte bis zu den ausgelieferten
Bytes nachweislich deckungsgleich. Die Fassung haengt jetzt trotzdem als
?v= an der Adresse (der statische Pfad kommt ohne Cache-Control, aber mit
ETag), und ein Pruefsummenfehler wird erklaert statt durchgereicht.

Statistik: der Gesamtwert steht jetzt als grosse Zahl in der Kopfzeile,
darunter bleiben vier Spalten - fuenf passen auf dem Telefon nachweislich
nicht in eine Zeile.

Fahrzeugfoto ohne Beschnitt und ohne Bodenschatten, damit auch ohne den
Schalter dafuer. Setup filtert zusaetzlich nach dem Signalnamen aus dem
Katalog.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-31 15:35:56 +02:00
co-authored by Claude Opus 5
parent 4af38d7e65
commit 90efcc5b00
19 changed files with 565 additions and 161 deletions
+11 -11
View File
@@ -4,8 +4,8 @@
* Jeder Aufruf von `useTheme()` legte bis 2026-08-31 sein eigenes `useState`
* an. Der Schalter in den Einstellungen änderte damit nur seine eigene Kopie;
* die Kopie in `App.tsx`, die `data-theme` setzt, blieb stehen — sichtbar
* wurde die Wahl erst nach einem Neustart der App. Der Boden-Schalter hatte
* denselben Fehler.
* wurde die Wahl erst nach einem Neustart der App. Die uebrigen Schalter
* hatten denselben Fehler.
*
* Der Test stellt genau diese Konstellation nach: zwei getrennte Komponenten,
* eine schaltet, die andere zeigt an.
@@ -14,26 +14,26 @@
import { fireEvent, render, screen } from "@testing-library/react"
import { beforeEach, describe, expect, it } from "vitest"
import { useBoden, useTheme } from "./theme"
import { useTabBeschriftung, useTheme } from "./theme"
function Anzeige() {
const [theme] = useTheme()
const [boden] = useBoden()
const [beschriftung] = useTabBeschriftung()
return (
<div>
<span data-testid="theme">{theme}</span>
<span data-testid="boden">{boden ? "an" : "aus"}</span>
<span data-testid="beschriftung">{beschriftung ? "an" : "aus"}</span>
</div>
)
}
function Schalter() {
const [theme, setzeTheme] = useTheme()
const [boden, setzeBoden] = useBoden()
const [beschriftung, setzeBeschriftung] = useTabBeschriftung()
return (
<div>
<button onClick={() => setzeTheme(theme === "nacht" ? "tag" : "nacht")}>Thema</button>
<button onClick={() => setzeBoden(!boden)}>Boden</button>
<button onClick={() => setzeBeschriftung(!beschriftung)}>Beschriftung</button>
</div>
)
}
@@ -57,17 +57,17 @@ describe("Ansichtseinstellungen, geteilt zwischen Komponenten", () => {
expect(screen.getByTestId("theme").textContent).not.toBe(vorher)
})
it("der Boden-Schalter der einen Komponente erreicht die andere", () => {
it("der Beschriftungs-Schalter der einen Komponente erreicht die andere", () => {
render(
<>
<Anzeige />
<Schalter />
</>,
)
const vorher = screen.getByTestId("boden").textContent
const vorher = screen.getByTestId("beschriftung").textContent
fireEvent.click(screen.getByText("Boden"))
fireEvent.click(screen.getByText("Beschriftung"))
expect(screen.getByTestId("boden").textContent).not.toBe(vorher)
expect(screen.getByTestId("beschriftung").textContent).not.toBe(vorher)
})
})