From aa8842e72e3982e38b9170caed5b988cfbc491b0 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Sun, 20 Sep 2026 22:55:41 +0200 Subject: [PATCH] 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 --- server/pruef-crew-wand-bild.mjs | 43 ++++++++++++++++++++++++++++----- server/pruef-teilen.mjs | 15 +++++++++--- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/server/pruef-crew-wand-bild.mjs b/server/pruef-crew-wand-bild.mjs index 724f343f..96bcaf7f 100644 --- a/server/pruef-crew-wand-bild.mjs +++ b/server/pruef-crew-wand-bild.mjs @@ -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 diff --git a/server/pruef-teilen.mjs b/server/pruef-teilen.mjs index 9e36d1a0..046b5d4a 100644 --- a/server/pruef-teilen.mjs +++ b/server/pruef-teilen.mjs @@ -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(", ")})`);