2736c3d6e0
1. profil_schreiben awaitete wunsch_uebernehmen und damit bis zu drei HTTP-Runden zu flespi - bei 39 Aufrufstellen von profilSpeichern() im Panel je Feldaenderung. Laeuft jetzt als eigene Aufgabe. 2. Ein gescheiterter Schreibversuch wurde bei jedem Speichern wiederholt, weil der Fehlerstand kein "werte" hat. Er merkt sich jetzt unter "versucht", was gescheitert ist. Dazu: kein zweites Schreiben, wenn der Wert schon als pending bereitliegt. 3. buendelPasst() versprach im Kommentar, ein aelteres Buendel abzulehnen, pruefte aber nur Ungleichheit - deshalb meldete die App "diese Fassung aendert auch Natives", obwohl nur das Buendel nach einem Versionssprung nicht neu gebaut war. Vergleicht jetzt gegen die Serverfassung, drei Regressionstests (der entscheidende gegen den alten Stand rot). Der Text behauptet keine Ursache mehr, die die App nicht kennen kann. 4. Das Regler-Minimum ging heute von 0 auf 1, ein bereits gespeicherter Wert darunter lief ungeprueft durch. Beide Oberflaechen klemmen jetzt auf 1-60. 182/182 Tests, 28 Backend-Dateien py_compile, beide Frontends als Modul geparst, Dienst- und Katalog-Konsistenz in beide Richtungen geprueft, Buendel auf derselben Fassung wie das Manifest. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 lines
2.6 KiB
TypeScript
66 lines
2.6 KiB
TypeScript
import { describe, expect, it } from "vitest"
|
|
|
|
import { buendelPasst } from "./ota"
|
|
import type { Buendelangabe } from "../api"
|
|
|
|
const buendel = (teil: Partial<Buendelangabe> = {}): Buendelangabe => ({
|
|
version: "2026.8.24.1",
|
|
sha256: "a".repeat(64),
|
|
bytes: 224186,
|
|
gebaut: "2026-08-24T00:00:00Z",
|
|
url: "/audi_dashboard_static/app/bundle.zip",
|
|
...teil,
|
|
})
|
|
|
|
/* buendelPasst() entscheidet, ob der Update-Knopf überhaupt erscheint - ein
|
|
Fehler hier zeigt entweder einen Knopf, der ins Leere läuft (kein Bündel
|
|
da), oder verbirgt ein echtes Update dauerhaft. */
|
|
describe("buendelPasst", () => {
|
|
it("lehnt ab, wenn kein Bündel vorliegt", () => {
|
|
expect(buendelPasst(null, "2026.8.23.2")).toBe(false)
|
|
})
|
|
|
|
it("lehnt ab, wenn Bündel- und eigene Version übereinstimmen", () => {
|
|
expect(buendelPasst(buendel({ version: "2026.8.24.1" }), "2026.8.24.1")).toBe(false)
|
|
})
|
|
|
|
it("akzeptiert bei abweichender Version", () => {
|
|
expect(buendelPasst(buendel({ version: "2026.8.24.2" }), "2026.8.24.1")).toBe(true)
|
|
})
|
|
|
|
it("lehnt ab, wenn die eigene Version unbekannt ist", () => {
|
|
// null heißt "diese App weiß nicht, welche Version sie ist" (z. B. im
|
|
// Dev-Server ohne eingebautes __APP_VERSION__) - dann lässt sich ein
|
|
// Update nicht sinnvoll anbieten, weil "abweichend" nicht feststellbar ist.
|
|
expect(buendelPasst(buendel(), null)).toBe(false)
|
|
})
|
|
|
|
it("lehnt ab, wenn dem Bündel Pflichtfelder fehlen", () => {
|
|
expect(buendelPasst(buendel({ url: "" }), "2026.8.23.2")).toBe(false)
|
|
expect(buendelPasst(buendel({ sha256: "" }), "2026.8.23.2")).toBe(false)
|
|
expect(buendelPasst(buendel({ version: "" }), "2026.8.23.2")).toBe(false)
|
|
})
|
|
|
|
/* Der eigentliche Zweck, und bis zum 03.09.2026 nur ein Kommentar: das
|
|
Bündel muss zu der Fassung gehören, die der Server ausliefert. Ohne
|
|
diese Prüfung meldete die App "diese Fassung ändert auch Natives",
|
|
obwohl nur das Bündel nach einem Versionssprung nicht neu gebaut war. */
|
|
it("akzeptiert, wenn das Bündel die Fassung des Servers ist", () => {
|
|
expect(buendelPasst(buendel({ version: "2026.9.3.11" }), "2026.9.3.10", "2026.9.3.11")).toBe(
|
|
true,
|
|
)
|
|
})
|
|
|
|
it("lehnt ab, wenn das Bündel hinter dem Server zurückliegt", () => {
|
|
expect(buendelPasst(buendel({ version: "2026.9.3.10" }), "2026.9.3.9", "2026.9.3.11")).toBe(
|
|
false,
|
|
)
|
|
})
|
|
|
|
it("prüft ohne bekannte Serverfassung nur gegen die eigene", () => {
|
|
// Offline oder altes Backend: einen Vergleich, den man nicht anstellen
|
|
// kann, darf der Knopf nicht ausbaden.
|
|
expect(buendelPasst(buendel({ version: "2026.9.3.11" }), "2026.9.3.10", null)).toBe(true)
|
|
})
|
|
})
|