#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
@@ -2,7 +2,16 @@ import { chromium } from "@playwright/test";
|
||||
import "dotenv/config";
|
||||
import { prisma } from "@/lib/db";
|
||||
import { ABTEILUNGEN } from "@/../prisma/seed-daten/stammdaten";
|
||||
import { anmelden, SEED_GERAET, SEED_TAG, SEED_VORLAGE } from "./helfer";
|
||||
import { passwortHashen } from "@/server/auth/benutzer";
|
||||
import {
|
||||
anmelden,
|
||||
E2E_MITARBEITER_MAIL,
|
||||
E2E_MITARBEITER_NAME,
|
||||
E2E_MITARBEITER_PASSWORT,
|
||||
SEED_GERAET,
|
||||
SEED_TAG,
|
||||
SEED_VORLAGE,
|
||||
} from "./helfer";
|
||||
import { e2eAufraeumenMitBericht } from "./aufraeumen";
|
||||
|
||||
/**
|
||||
@@ -114,6 +123,42 @@ export default async function vorbereiten(): Promise<void> {
|
||||
});
|
||||
process.env["E2E_BETRIEBSMODUS"] = einstellung?.modus ?? "INTERN";
|
||||
|
||||
/*
|
||||
* 2d. Das Konto der Rolle `MITARBEITER` fuer `/meine-geraete` (#037).
|
||||
*
|
||||
* Es muss an einer `Mitarbeiter`-Zeile haengen — der CHECK
|
||||
* `Benutzer_mitarbeiter_nur_bei_rolle` verlangt das in **beide** Richtungen
|
||||
* (#035): ein MITARBEITER ohne Person waere ein Recht, das sich auf niemanden
|
||||
* bezieht. Genommen wird die erste Person des Seed-Bestands, denn sie hat
|
||||
* Geraete, und ohne Geraet zeigte die Seite nur ihren Leerzustand.
|
||||
*/
|
||||
const person = await prisma.mitarbeiter.findFirst({
|
||||
where: { aktiv: true, geraete: { some: {} } },
|
||||
select: { id: true, kundeId: true, anzeigename: true },
|
||||
orderBy: { anzeigename: "asc" },
|
||||
});
|
||||
if (!person) {
|
||||
fehlen(
|
||||
"Es gibt keine Person mit einem Gerät.",
|
||||
"pnpm db:seed laufen lassen — die Selbstauskunft braucht eine Person, der ein Gerät gehört.",
|
||||
);
|
||||
}
|
||||
await prisma.benutzer.upsert({
|
||||
where: { email: E2E_MITARBEITER_MAIL },
|
||||
create: {
|
||||
email: E2E_MITARBEITER_MAIL,
|
||||
name: E2E_MITARBEITER_NAME,
|
||||
rolle: "MITARBEITER",
|
||||
passwortHash: await passwortHashen(E2E_MITARBEITER_PASSWORT),
|
||||
mitarbeiterId: person.id,
|
||||
aktiv: true,
|
||||
},
|
||||
// Ein Durchgang, der vorher abgebrochen ist, laesst das Konto stehen. Die
|
||||
// Person kann dabei eine andere sein als beim letzten Mal.
|
||||
update: { rolle: "MITARBEITER", mitarbeiterId: person.id, aktiv: true },
|
||||
});
|
||||
process.env["E2E_MITARBEITER_PERSON"] = person.anzeigename;
|
||||
|
||||
/*
|
||||
* 3. Liest der Server **dieselbe** Datenbank?
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user