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(", ")})`);