Hinweis von Filipe: Wenn etwas wie ein Knopf aussieht, muss man auch
draufdruecken koennen. Er hatte recht.
Meine urspruengliche Begruendung - die Adresse solle nur zum Lesen
dastehen, damit niemand versehentlich ein Lesezeichen auf den alten Weg
setzt - traegt nicht: Wer klickt, landet auf der NEUEN Adresse und setzt
sein Lesezeichen genau dort. Ein Element, das wie ein Knopf aussieht und
sich nicht wie einer verhaelt, ist eine Falle.
Der Knopf hat jetzt einen Hover- und einen Tastatur-Fokuszustand, und
beide Bewegungen entfallen bei prefers-reduced-motion.
Die Pruefung geht dabei einen Schritt weiter als vorher: Sie prueft nicht
mehr nur, WELCHE Anfragen zugeordnet werden, sondern ruft die Middleware
wirklich auf und sieht sich die ANTWORT an. Denn die Zuordnung kann
stimmen und die Seite trotzdem kaputt sein:
- ein Platzhalter, der woertlich in der Seite steht statt eingesetzt zu
werden
- ein Knopf ohne Verweis (genau der Fall, den Filipe gemeldet hat)
- HTML statt JSON fuer /workspace/api/ - ein noch offener Tab wuerde
sonst die Hinweisseite als Daten zu lesen versuchen
- und die wichtigste: dass die NEUE Adresse durchgelassen wird
31 Pruefungen, alle gruen. Gegenprobe gemacht: Dreht man den Knopf zurueck
zu einem div ohne Verweis, meldet die Pruefung 2 Fehler - sie haette den
gemeldeten Mangel also selbst gefunden.
Co-Authored-By: Claude Opus 5 <[email protected]>
128 lines
7.1 KiB
JavaScript
128 lines
7.1 KiB
JavaScript
/* =====================================================================
|
|
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(/<a[^>]+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);
|