diff --git a/server/pruef-aufgaben-vorlagen.mjs b/server/pruef-aufgaben-vorlagen.mjs index 282fd9c2..b8dfa060 100644 --- a/server/pruef-aufgaben-vorlagen.mjs +++ b/server/pruef-aufgaben-vorlagen.mjs @@ -359,14 +359,35 @@ console.log("\n=== Auf der Aufgabenseite"); const nachher = await seite.textContent("#vorlagenbrett .vorlagenbrett__titel"); ok(vorher !== nachher, `ein anderer Bereich zeigt andere Aufgaben ("${vorher}" → "${nachher}")`); - /* Und der Weg bis zum Brett. */ - const zaehle = () => seite.evaluate(() => document.querySelectorAll("#brett .karte").length); + /* Und der Weg bis zum Brett. + + GEZAEHLT WERDEN AUFGABEN, NICHT KARTEN (berichtigt 23.09.2026). + + Seit dem Brett-Umbau vom selben Tag fasst das Brett gleiche + Aufgaben zu EINER Karte zusammen. Eine neue Aufgabe erhoeht die + Kartenzahl also nur dann, wenn es noch keine gleichnamige gibt -- + und die Pruefung legt kurz vorher sieben Vorlagen derselben Stufe + an. Sie meldete "9 -> 9" und behauptete damit, das Uebernehmen sei + kaputt; es war die Zaehlweise. Die Aufgabe war jede Zeit da, drei + Zeilen weiter wird sie sogar als "schon übernommen" wiedererkannt. + + Dieselbe Stelle gab es ein zweites Mal in pruef-modi-katalog. Dort + ist sie am 23.09. repariert worden -- hier nicht, weil ich nach + dem ersten Fund nicht weitergesucht habe. Jede Karte weist ihre + Aufgaben aus: data-id (eine) oder data-ids (mehrere). */ + const zaehle = () => seite.evaluate(() => + [...document.querySelectorAll("#brett .karte")] + .reduce((n, k) => n + (k.dataset.ids || k.dataset.id || "") + .split(",").filter(Boolean).length, 0)); + const zaehleKarten = () => seite.evaluate(() => + document.querySelectorAll("#brett .karte").length); const brettVorher = await zaehle(); await seite.click("#vorlagenbrett .vorlagenbrett__fuss .knopf"); await seite.waitForTimeout(2500); const brettNachher = await zaehle(); ok(brettNachher === brettVorher + 1, - `Übernehmen legt eine Aufgabe auf dem Brett an (${brettVorher} → ${brettNachher})`); + `Übernehmen legt eine Aufgabe auf dem Brett an (${brettVorher} → ${brettNachher}` + + ` Aufgaben in ${await zaehleKarten()} Karten)`); /* ---- WAS SCHON GEHOLT WURDE, STEHT DA (09.09.2026) ----------------- Vorher konnte man dieselbe Vorlage zweimal uebernehmen und bekam diff --git a/server/pruef-struktur.mjs b/server/pruef-struktur.mjs index ce2cbbec..db0f8d7a 100644 --- a/server/pruef-struktur.mjs +++ b/server/pruef-struktur.mjs @@ -54,8 +54,25 @@ ok(serverDateien.length >= 20, `${serverDateien.length} Server-Module gefunden`) const ROUTEN = []; for (const datei of serverDateien) { const text = readFileSync(join(SERVER, datei), "utf8"); + /* AUCH ROUTEN IN ANFUEHRUNGSSTRICHEN UND BACKTICKS (23.09.2026). + + Hier stand nur das doppelte Anfuehrungszeichen. Wer eine Route in + einer Schleife registriert, schreibt sie aber als Template: + + for (const weg of ["annehmen", "ablehnen"]) + router.post(`/workspace/api/vorlagen/bewerbung/${weg}`, ...) + + Diese Routen fehlten in der Liste -- und die Aufrufe dorthin + wurden als "Schnittstelle gibt es nicht" gemeldet, obwohl sie + jeden Tag laufen. Ein Fehlalarm, den man zweimal liest und dann + nicht mehr; genau davor warnt der Kommentar weiter unten bei den + sechs angeblich verwaisten Seiten. + + Die Erfassung der AUFRUFE kannte alle drei Zeichen schon + (["'`]) -- nur die Erfassung der ROUTEN nicht. Zwei Regeln fuer + dieselbe Frage, und eine davon war aelter. */ const treffer = text.matchAll( - /Router\.(get|post|patch|put|delete|use)\(\s*\n?\s*"(\/workspace\/[^"]*)"/g); + /Router\.(get|post|patch|put|delete|use)\(\s*\n?\s*["'`](\/workspace\/[^"'`]*)/g); for (const t of treffer) ROUTEN.push({ art: t[1], pfad: t[2], datei }); } ok(ROUTEN.length >= 80, `${ROUTEN.length} Server-Routen eingelesen`); @@ -77,7 +94,12 @@ function routeGibtEs(pfad, art) { if (art && r.art !== art) return false; const teileB = r.pfad.split("/").filter(Boolean); if (teileA.length !== teileB.length) return false; - return teileB.every((t, i) => t.startsWith(":") || t === "*" || t === teileA[i]); + /* ${...} IN EINER ROUTE IST EIN PLATZHALTER wie :id -- was dort + eingesetzt wird, entscheidet die Schleife beim Start. Der + Aufrufpfad ist oben schon zu "1" normalisiert worden; ohne diese + Zeile verglichen wir "1" mit "${weg}" und faenden nie etwas. */ + return teileB.every((t, i) => t.startsWith(":") || t === "*" + || t.includes("${") || t === teileA[i]); }); }