/* ===================================================================== Prüft, WELCHE Anfragen der abgeschalteten alten Workspace-Adresse zugeordnet werden. Zwei Fehler waeren hier teuer, und beide sieht man einer Bedingung nicht an: 1. DIE NEUE ADRESSE MIT ABSCHALTEN. Derselbe Dienst bedient die alte UND die neue Adresse. Wer nicht auf den Hostnamen prueft, sperrt den Workspace fuer alle aus -- sofort nach dem Neustart und ohne dass es vorher irgendwo auffaellt. 2. PRAEFIX-IRRTUM. "faengt an mit /workspace" trifft auch /workspaceXYZ oder /workspace-alt -- Pfade, die nicht zum Workspace gehoeren. Geprueft wird die ECHTE Funktion aus workspace-umzug.js, nicht eine Kopie der Bedingung -- eine Kopie wuerde beim naechsten Umbau auseinanderlaufen und dann etwas anderes bestaetigen als das, was wirklich laeuft. Aufruf: node server/pruef-workspace-umzug.mjs ===================================================================== */ import { istAlteWorkspaceAdresse, workspaceUmzug, NEUE_ADRESSE } from "./workspace-umzug.js"; /* [Host, Pfad, erwartet, Begruendung] */ const FAELLE = [ // --- muss abgeschaltet sein (410 Gone) --- ["dogfather-universe.com", "/workspace/", true, "alte Adresse, Startseite"], ["dogfather-universe.com", "/workspace", true, "alte Adresse, ohne Schraegstrich"], ["dogfather-universe.com", "/workspace/start.html", true, "alte Adresse, Unterseite"], ["dogfather-universe.com", "/workspace/api/aufgaben", true, "alte Adresse, Schnittstelle"], ["www.dogfather-universe.com", "/workspace/", true, "auch mit www"], ["DOGFATHER-UNIVERSE.COM", "/workspace/", true, "Grossschreibung darf egal sein"], ["dogfather-universe.com:443", "/workspace/", true, "Portangabe darf egal sein"], // --- darf NIEMALS abgeschaltet werden: das ist der neue Ort --- ["workspace.dogfather-universe.com", "/workspace/", false, "NEUE Adresse -- darf NIE abgeschaltet werden"], ["workspace.dogfather-universe.com", "/workspace/start.html", false, "NEUE Adresse, Unterseite"], ["workspace.dogfather-universe.com", "/workspace/api/aufgaben", false, "NEUE Adresse, Schnittstelle"], // --- darf nicht betroffen sein: gehoert nicht zum Workspace --- ["dogfather-universe.com", "/", false, "Hauptseite"], ["dogfather-universe.com", "/index.html", false, "Hauptseite"], ["dogfather-universe.com", "/webdesign/", false, "anderer Bereich"], ["dogfather-universe.com", "/workspaceXYZ", false, "PRAEFIX-IRRTUM: gehoert nicht dazu"], ["dogfather-universe.com", "/workspace-alt/seite", false, "PRAEFIX-IRRTUM mit Bindestrich"], ["dogfather-universe.com", "/assets/css/main.css", false, "gemeinsame Datei"], // --- darf nicht betroffen sein: lokale Tests wuerden sonst scheitern --- ["127.0.0.1:4100", "/workspace/", false, "lokaler Testserver"], ["localhost:4100", "/workspace/start.html", false, "lokaler Testserver"], // --- Sonderfaelle --- ["", "/workspace/", false, "kein Host-Feld"], ["boese.example.com", "/workspace/", false, "fremder Host"], ]; let geprueft = 0; const fehler = []; for (const [host, pfad, erwartet, grund] of FAELLE) { const ist = istAlteWorkspaceAdresse(host, pfad); geprueft++; if (ist !== erwartet) { fehler.push(`${host || "(leer)"}${pfad} -> ${ist ? "abgeschaltet" : "erreichbar"}, erwartet ${erwartet ? "abgeschaltet" : "erreichbar"} (${grund})`); } } /* ---- Die tatsaechliche ANTWORT pruefen, nicht nur die Entscheidung ---- Die Zuordnung oben kann stimmen und die Seite trotzdem kaputt sein: ein nicht eingesetzter Platzhalter, ein Knopf ohne Verweis, HTML statt JSON fuer die Schnittstelle. Deshalb wird die Middleware hier wirklich aufgerufen -- mit nachgebildeten Anfrage- und Antwortobjekten. */ const pruefe = (bedingung, was) => { geprueft++; if (!bedingung) fehler.push(was); }; function antwortHolen(host, pfad) { const req = { get: (n) => (String(n).toLowerCase() === "host" ? host : undefined), path: pfad, originalUrl: pfad }; const a = { code: null, art: null, koerper: null, weiter: false }; const res = { status(c) { a.code = c; return this; }, type(t) { a.art = t; return this; }, send(k) { a.koerper = k; return this; }, json(k) { a.art = "json"; a.koerper = k; return this; }, }; workspaceUmzug(req, res, () => { a.weiter = true; }); return a; } const seite = antwortHolen("dogfather-universe.com", "/workspace/"); pruefe(seite.code === 410, `Hinweisseite antwortet mit ${seite.code}, erwartet 410`); pruefe(seite.art === "html", `Hinweisseite hat Art ${seite.art}, erwartet html`); pruefe(String(seite.koerper).includes(NEUE_ADRESSE + "/workspace/"), "Hinweisseite nennt die neue Adresse nicht als Ziel"); pruefe(/]+class="adresse"[^>]+href=/.test(String(seite.koerper)), "Der Knopf ist kein anklickbarer Verweis — er saehe nur aus wie einer"); pruefe(!String(seite.koerper).includes("${"), "Ein Platzhalter wurde nicht eingesetzt und steht woertlich in der Seite"); const api = antwortHolen("dogfather-universe.com", "/workspace/api/aufgaben"); pruefe(api.code === 410, `Schnittstelle antwortet mit ${api.code}, erwartet 410`); pruefe(api.art === "json", "Schnittstelle liefert kein JSON — ein noch offener Tab wuerde HTML als Daten zu lesen versuchen"); pruefe(api.koerper?.neueAdresse === NEUE_ADRESSE, "JSON nennt die neue Adresse nicht"); const durch = antwortHolen("workspace.dogfather-universe.com", "/workspace/"); pruefe(durch.weiter === true, "NEUE Adresse wurde abgefangen — der Workspace waere tot"); pruefe(durch.code === null, "NEUE Adresse bekam eine Antwort, statt durchgelassen zu werden"); /* Gegenprobe: Kann diese Pruefung ueberhaupt "nein" sagen? Ein Fall, von dem wir wissen, dass er falsch ist, MUSS auffallen. */ const gegenprobe = istAlteWorkspaceAdresse("dogfather-universe.com", "/workspace/") === true && istAlteWorkspaceAdresse("workspace.dogfather-universe.com", "/workspace/") === false; /* Und die genannte neue Adresse muss stimmen -- sie steht auf der Hinweisseite, die abgemeldete Nutzer zu sehen bekommen. */ const zielStimmt = NEUE_ADRESSE === "https://workspace.dogfather-universe.com"; geprueft++; if (!zielStimmt) fehler.push(`Ziel ist "${NEUE_ADRESSE}", erwartet https://workspace.dogfather-universe.com`); const SOLL = FAELLE.length + 11; /* IN DERSELBEN SCHREIBWEISE WIE ALLE ANDEREN (06.09.2026). Diese Datei meldete ihr Ergebnis in eigenen Worten ("31 Pruefungen gelaufen") statt in den Zeilen ` ok ` / ` FEHL `, nach denen tools/alles-pruefen.mjs zaehlt. Der Gesamtlauf las daraus NULL Pruefungen -- und weil "null Pruefungen" dort zu Recht als Fehler gilt, stand hier bei jedem Lauf ein FEHL, obwohl alle 31 Punkte bestanden. Das ist die unangenehmste Sorte Fehlalarm: Er kommt immer, er ist immer unbegruendet, und nach drei Malen liest ihn niemand mehr. Genau dann faellt der eine echte nicht mehr auf. Deshalb schreibt diese Datei jetzt dieselbe Sprache wie ihre Nachbarn. */ console.log(` ok ${geprueft} Faelle geprueft (erwartet ${SOLL})`); console.log(` ${gegenprobe ? "ok " : "FEHL"} Gegenprobe: alt abgeschaltet, neu erreichbar`); console.log(` ${fehler.length === 0 ? "ok " : "FEHL"} ${fehler.length} Beanstandungen`); for (const f of fehler) console.log(" FEHL " + f); if (geprueft !== SOLL) { console.log("FEHL: Anzahl stimmt nicht."); process.exit(1); } if (!gegenprobe) { console.log("FEHL: Gegenprobe schlaegt nicht an -- die Pruefung waere wertlos."); process.exit(1); } process.exit(fehler.length === 0 ? 0 : 1);