#038: Die E2E-Ablaeufe laufen ab jetzt vor jedem Merge nach main, nicht vor jedem Commit. Gemessen: Bau 14 s, Start 7 s, Ablaeufe 256 s — zu den vier Minuten des bestehenden Tores. Neun Minuten vor jedem Commit ist ein Tor, das umgangen wird. Vor jedem Merge waeren es in Phase 2 acht Laeufe gewesen, und jeder der vier Befunde aus #027 waere am Tag seiner Entstehung aufgefallen. Geprueft wurde jeder der 16 Ablaeufe gegen die Frage, ob es ein Vitest-Gegenstueck gibt. Neun Zusagen haengen ausschliesslich dort, und keine laesst sich holen: alle brauchen einen echten Browser. Die Liste steht in CLAUDE.md. Der eigentliche Fund dabei war keine Testluecke, sondern eine Konvention ohne Pruefer: "jede Seite prueft selbst" steht seit #007 in CLAUDE.md, und geprueft hat es bis hierher nur ein Mensch, der nachsieht. Der Review von Phase 2 hat alle 27 Seiten durchgesehen — ein Ergebnis, das fuer genau einen Tag gilt. tests/zugang.test.ts liest sie jetzt, samt jedem Route Handler; die Ausnahmen (Auth, Healthcheck) stehen namentlich mit Begruendung, und ein Test prueft auch die Gegenrichtung. #037: Das Lesemodell der Anhaenge liegt in queries/ und engt selbst ein — vorher hing das daran, dass beide Aufrufer den Lauf vorher pruefen. /meine-geraete wird bei 390 px gemessen, mit einem echten MITARBEITER-Konto aus dem E2E-Vorlauf, dazu ein Test, dass dort kein Link in die Verwaltung angeboten wird. Dabei selbst einen Fehler gemacht, der die neue Regel begruendet: fuer das zweite Konto brauchte `anmelden` eine Variante, die nicht auf / wartet, und ich habe das Warten fuer alle gelockert. Das machte zwei unverwandte Ablaeufe unzuverlaessig — sichtbar nur im vollen Durchgang, einzeln waren beide gruen. Ein gemeinsamer Helfer in einer Testsuite ist geteilter Zustand. Ohne vollen Durchgang haette ich zwei rote Ablaeufe gemergt. 1457 Vitest-Tests (vorher 1454), 115 E2E-Ablaeufe (vorher 113). Offen bleibt nur noch #024, und das verlangt einen echten Proxmox-Host. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
80d97467da
commit
75c335df23
+47
-1
@@ -20,6 +20,22 @@ export const SEED_VORLAGE = "PC Neuinstallation";
|
||||
|
||||
/** Das Beispielgerät aus dem Seed. Sein Aufkleber steht im Abnahmekriterium. */
|
||||
export const SEED_GERAET = "PC-001";
|
||||
|
||||
/**
|
||||
* Ein Konto der Rolle `MITARBEITER`, nur fuer die Ablaeufe (#037).
|
||||
*
|
||||
* **Nicht im Seed**, obwohl das kuerzer waere: ein Konto mit bekanntem Passwort
|
||||
* gehoert nicht in einen Seed, der auch produktiv laeuft. Der E2E-Vorlauf legt
|
||||
* es an, der Nachlauf nimmt es wieder mit — es traegt `ZZ` im Namen und faellt
|
||||
* damit unter `tests/e2e/aufraeumen.ts`.
|
||||
*
|
||||
* Gebraucht wird es, weil `/meine-geraete` das Recht `selbstauskunft` verlangt
|
||||
* und das **nur** `MITARBEITER` hat: ein Administrator saehe dort „kein
|
||||
* Zugriff“, und ein Ablauf haette die Verweigerungsseite gemessen.
|
||||
*/
|
||||
export const E2E_MITARBEITER_MAIL = "zz.e2e.mitarbeiter@firma.example";
|
||||
export const E2E_MITARBEITER_PASSWORT = "zz-e2e-nur-fuer-ablaeufe";
|
||||
export const E2E_MITARBEITER_NAME = "ZZ E2E Mitarbeiterkonto";
|
||||
export const SEED_TAG = "LZ-7K3F9Q";
|
||||
|
||||
export async function anmelden(seite: Page): Promise<void> {
|
||||
@@ -31,10 +47,40 @@ export async function anmelden(seite: Page): Promise<void> {
|
||||
"Administrator passen, den der Seed angelegt hat.",
|
||||
);
|
||||
}
|
||||
/*
|
||||
* Wartet auf `/`, und zwar genau so streng wie vorher. Lockerer („irgendwas
|
||||
* ausser /anmelden“) sah harmlos aus und machte zwei Ablaeufe im vollen
|
||||
* Durchgang unzuverlaessig: der naechste Schritt begann, bevor die Uebersicht
|
||||
* stand. Der Admin landet immer auf `/` — fuer ihn gibt es keinen Grund, das
|
||||
* aufzuweichen.
|
||||
*/
|
||||
await anmeldenMit(seite, email, passwort, "**/");
|
||||
}
|
||||
|
||||
/**
|
||||
* Anmelden mit beliebigen Zugangsdaten.
|
||||
*
|
||||
* `ziel` ist das Muster, auf das gewartet wird. Ohne Angabe genuegt es, dass die
|
||||
* Anmeldeseite verlassen ist: ein `MITARBEITER` landet auf `/meine-geraete`,
|
||||
* weil `startseite(rolle)` das Ziel an der Rolle entscheidet (#035), und ein
|
||||
* Warten auf `/` liefe dort in den Zeitablauf.
|
||||
*/
|
||||
export async function anmeldenMit(
|
||||
seite: Page,
|
||||
email: string,
|
||||
passwort: string,
|
||||
ziel?: string,
|
||||
): Promise<void> {
|
||||
await seite.goto("/anmelden");
|
||||
await seite.fill('input[name="email"]', email);
|
||||
await seite.fill('input[name="passwort"]', passwort);
|
||||
await Promise.all([seite.waitForURL("**/"), seite.click('button[type="submit"]')]);
|
||||
await Promise.all([
|
||||
seite.waitForURL(ziel ?? ((adresse) => !adresse.pathname.startsWith("/anmelden"))),
|
||||
seite.click('button[type="submit"]'),
|
||||
]);
|
||||
// Und bis die Seite wirklich steht: ein `waitForURL` endet an der Adresse,
|
||||
// nicht am geladenen Dokument.
|
||||
await seite.waitForLoadState("load");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user