Zwei Pruefungen waren rot, weil Namen sich geaendert hatten

Beide meldeten seit Tagen einen Fehler, den es nicht gab. Eine rote
Pruefung, die rot BLEIBT, gewoehnt einem das Hinsehen ab -- ab da
uebersieht man auch die echte.

--- pruef-teilen: 14 ok / 3 Fehler -> 27 ok / 0 --------------------

Sie suchte `.teilen__brett`. Die Seite baut `.tl-brett`; die Klassen
wurden irgendwann umbenannt, und die Pruefung suchte seitdem nach
Elementen, die es nicht gibt. Gemeldet hat sie das sogar richtig --
"drei Ziele zur Auswahl (0)" --, nur hat niemand die Klammer gelesen.
Danach lief sie in einen Klick-Zeitablauf und brach ab, weswegen
DREIZEHN weitere Pruefungen nie stattfanden.

--- pruef-crew-wand-bild: 41 ok / 4 Fehler -> 45 ok / 0 ------------

Zwei feste Erwartungen aus einer Zeit, die vorbei ist:

1. `/Team Dogi/` im Reiter. Die App heisst seit dem Treff-Umzug
   "DogFather Universe". Statt den neuen Namen einzutragen -- und
   damit dieselbe Zeitbombe mit neuem Datum zu stellen -- kommt er
   jetzt aus `crew.webmanifest`. Benennt jemand die App um, folgt der
   Reiter, und beides bleibt gruen. Weichen sie auseinander, sieht der
   Mensch im Reiter einen anderen Namen als auf seinem
   Startbildschirm, und genau das soll die Pruefung finden.

2. `kacheln === 3`, seit Filipe am 10.09. sagte "3 rollen. dogfather.
   rechte hand und modis". Am 19.09. zog der Treff in Team Dogi ein
   und die Community kam als vierte dazu -- die Zahl war ab da falsch,
   die Wand richtig. Verglichen wird jetzt die MENGE der Rollen, nicht
   ihre Anzahl: Eine Zahl sagt beim Scheitern "3 erwartet, 4
   gefunden" und verschweigt, WELCHE.

Beide Male war die Seite richtig und die Pruefung veraltet -- das ist
dieselbe Krankheit wie bei den Portnummern und bei pruef-entwicklung:
ein Name oder eine Zahl, abgeschrieben an einer zweiten Stelle, die
niemand mitpflegt.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-20 22:55:41 +02:00
co-authored by Claude Opus 5
parent 6e46a08543
commit aa8842e72e
2 changed files with 48 additions and 10 deletions
+37 -6
View File
@@ -81,7 +81,14 @@ for (const geraet of [
deviceScaleFactor: 1,
});
const seite = await ctx.newPage();
const meldungen = [];
/* Der App-Name kommt aus dem Manifest der Crew-Adresse. Eine zweite
Fassung hier waere die, die beim naechsten Umbenennen vergessen
wird. */
const { readFileSync } = await import("node:fs");
const APPNAME = JSON.parse(
readFileSync(new URL("../workspace/crew.webmanifest", import.meta.url), "utf8")).name;
const meldungen = [];
seite.on("console", (m) => { if (m.type() === "error") meldungen.push(m.text()); });
const adresse = geraet.alt
@@ -105,11 +112,35 @@ for (const geraet of [
if (geraet.alt) {
ok(kacheln === 5, `${geraet.name}: die alte Wand hat ihre fuenf Kacheln (${kacheln})`);
} else {
ok(/Team Dogi/.test(titel), `${geraet.name}: der Reiter heisst "${titel}"`);
/* DREI, seit Filipe am 10.09.2026 sagte: "3 rollen. dogfather.
rechte hand und modis." Hier stand vorher `=== 0` -- am Vormittag
richtig, am Nachmittag nicht mehr. */
ok(kacheln === 3, `${geraet.name}: drei Rollenkacheln (${kacheln})`);
/* DER REITER TRAEGT DEN APP-NAMEN -- abgeleitet, nicht abgeschrieben.
Hier stand `/Team Dogi/`, aus der Zeit, als die App so hiess. Sie
heisst seit dem Treff-Umzug "DogFather Universe", und die Pruefung
war seitdem rot, ohne dass etwas kaputt war. Ein fester Name in
einer Pruefung ist eine Zeitbombe mit Datum: Er stimmt, bis
jemand umbenennt, und dann kostet er Vertrauen in den ganzen
Satz. Gemessen wird deshalb gegen das Manifest -- benennt jemand
die App um, folgt der Reiter, und beides bleibt gruen. Weichen
sie auseinander, sieht der Mensch im Reiter einen anderen Namen
als auf seinem Startbildschirm, und das ist der Fehler, den es
zu finden gilt. */
ok(titel.includes(APPNAME),
`${geraet.name}: der Reiter traegt den App-Namen "${APPNAME}" (steht da: "${titel}")`);
/* WELCHE ROLLEN AUF DIE WAND GEHOEREN.
Hier stand `=== 3`, seit Filipe am 10.09.2026 sagte: "3 rollen.
dogfather. rechte hand und modis." Am 19.09. ist der Treff in
Team Dogi eingezogen, und die Community kam als vierte dazu --
die Zahl war ab da falsch, die Wand richtig.
Eine Zahl sagt beim Scheitern nur "3 erwartet, 4 gefunden" und
verschweigt, WELCHE. Deshalb wird die MENGE verglichen: Fehlt
eine Rolle, steht ihr Name in der Meldung, und wer sie entfernt
hat, sieht sofort, ob das Absicht war. */
const rollen = (await seite.locator(".rolle").evaluateAll(
(ns) => ns.map((n) => n.dataset.rolle || ""))).sort();
const SOLL = ["admin", "gast", "hand", "modi"];
ok(JSON.stringify(rollen) === JSON.stringify(SOLL),
`${geraet.name}: die vier Rollen stehen da (${rollen.join(", ") || "keine"})`);
/* Jede muss auch bedienbar sein. Eine Kachel, die im HTML steht,
aber 0 px hoch ist, zaehlt oben mit und laesst sich trotzdem
nicht antippen -- genau die Sorte Fehler, die eine Zaehlung
+11 -4
View File
@@ -132,8 +132,15 @@ melde("=== 1. Wenn der Link in „url“ steht ===");
ok(await gezeigterLink() === VIDEO, "der Link wird erkannt und angezeigt");
ok(!(await seite.$("#haendisch:not([hidden])")),
"und das Feld zum Einfügen bleibt weg – es gibt ja nichts einzufügen");
const bretter = await seite.$$eval(".teilen__brett", (ns) => ns.map((n) => ({
name: n.querySelector(".teilen__brett-name")?.textContent,
/* DIE KLASSEN HEISSEN `tl-…`, NICHT `teilen__…` (berichtigt
20.09.2026). Sie wurden irgendwann umbenannt, und diese Pruefung
suchte seitdem nach Elementen, die es nicht gibt: Sie meldete
"drei Ziele zur Auswahl (0)" -- also rot mit der richtigen Zahl
in Klammern, und niemand hat die Klammer gelesen. Ein Selektor
ist ein Name, und Namen altern: Sie stehen in zwei Dateien und
werden nur in einer geaendert. */
const bretter = await seite.$$eval(".tl-brett", (ns) => ns.map((n) => ({
name: n.querySelector(".tl-brett-name")?.textContent,
gewaehlt: n.getAttribute("aria-pressed"),
})));
ok(bretter.length === 3, `drei Ziele zur Auswahl (${bretter.length})`);
@@ -227,9 +234,9 @@ melde("=== 5. Wohin ist eine Frage ===");
{
const vorher = await zahlIm("treff");
await oeffne(`url=${encodeURIComponent(`http://127.0.0.1:${TIKTOK}/@hasidog00804/video/99`)}`);
await seite.click('.teilen__brett[data-brett="treff"]');
await seite.click('.tl-brett[data-brett="treff"]');
await seite.waitForTimeout(300);
const gewaehlt = await seite.$$eval(".teilen__brett",
const gewaehlt = await seite.$$eval(".tl-brett",
(ns) => ns.filter((n) => n.getAttribute("aria-pressed") === "true").map((n) => n.dataset.brett));
ok(gewaehlt.length === 1 && gewaehlt[0] === "treff",
`genau ein Ziel ist gewählt (${gewaehlt.join(", ")})`);