/* ===================================================================== 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; console.log(`${geprueft} Pruefungen gelaufen (erwartet ${SOLL}), ${fehler.length} Beanstandungen.`); console.log(`Gegenprobe (alt abgeschaltet, neu erreichbar): ${gegenprobe ? "ja" : "NEIN"}`); 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);