Files
Laufzettel/tests/e2e/scannen.spec.ts
T
Florian WildeandClaude Opus 5 10e272654f
Prüfung / pruefung (push) Canceled after 0s
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
feat(doku): Anleitung, PDF und Ende-zu-Ende-Abnahme
Neun Kapitel unter docs/anleitung/ fuer Technik und Verwaltung, mit 35
Bildern aus `pnpm docs:screenshots` und einem Fehlerbehebungskapitel aus
echten Meldungen. `pnpm docs:pdf` macht daraus 72 Seiten A4 — hell
gedruckt, mit Deckblatt, Inhaltsverzeichnis und Seitenzahlen, ohne neue
Abhaengigkeit.

Die Ablaeufe pruefen ihre Voraussetzungen, bevor der erste startet:
antwortet ein gebauter Stand, steht der Seed-Bestand, und liest der
Server dieselbe Datenbank wie der Testprozess. Jeder Ablauf legt an, was
er braucht, und raeumt es weg. Vier neue kommen dazu: Hauptablauf,
Onboarding mit Vergleich der Zwischenablage, Rollen und 390 px auf
achtzehn Seiten.

Drei Fehler kamen dabei heraus. Das Projekt „handy" pruefte 412 px statt
der verlangten 390. Ein angemeldeter Benutzer ohne Recht erfuhr nie,
warum er abgewiesen wurde — die Meldung stand auf einer Seite, die ihn
sofort weiterleitet; jetzt gibt es /kein-zugriff. Und der
Verzeichnis-Ablauf schrieb die Attributzuordnung der ersten vorhandenen
Quelle um, in einer echten Installation also der produktiven.

101 Ablaeufe in INTERN und 97 in DIENSTLEISTUNG, beide ohne Fehlschlag.

Closes #18

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-26 11:03:02 +02:00

61 lines
2.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { expect, test } from "@playwright/test";
import "dotenv/config";
import { anmelden, SEED_TAG } from "./helfer";
/**
* Der Einstieg ueber den Aufkleber (#014).
*
* Die Kamera laesst sich hier nicht pruefen — Chromium bekommt im Testlauf kein
* Bild, und ein gefaelschter Videostrom prueft am Ende die Attrappe. Geprueft
* wird deshalb das, was ohne Kamera trotzdem gelten muss: die Seite ist
* erreichbar, der Knopf in der Huelle fuehrt hin, und der **abgetippte** Code
* bringt den Techniker genauso ans Ziel wie der gescannte. Das ist kein
* Ersatzweg fuer den Notfall, sondern der Weg, den jeder geht, dessen Browser
* keine Kamera freigibt.
*
* Der Code kommt aus `SEED_TAG` und nicht abgetippt aus dem Kopf: dass es ihn in
* dieser Datenbank gibt, prueft `tests/e2e/global-setup.ts` vor dem ersten
* Ablauf (#018).
*/
test.describe("Scannen", () => {
test("ist über den Knopf in der Hülle erreichbar", async ({ page }) => {
await anmelden(page);
await page.getByRole("link", { name: "Scannen" }).first().click();
await page.waitForURL("**/scannen");
await expect(page.getByRole("heading", { name: "Scannen" })).toBeVisible();
});
test("öffnet einen abgetippten Code", async ({ page }) => {
await anmelden(page);
await page.goto("/scannen");
// Ohne Kamera bleibt das Feld – und es nimmt auch Kleinschreibung an.
await page.getByLabel("Code eintippen").fill(SEED_TAG.toLowerCase());
await page.getByRole("button", { name: "Öffnen" }).click();
await page.waitForURL(`**/t/${SEED_TAG}`);
});
test("lässt einen unsinnigen Code gar nicht erst abschicken", async ({ page }) => {
await anmelden(page);
await page.goto("/scannen");
await page.getByLabel("Code eintippen").fill("PC-001");
await expect(page.getByRole("button", { name: "Öffnen" })).toBeDisabled();
await expect(page.getByText(/Die Zeichen 0, O, 1 und I gibt es darin nicht/)).toBeVisible();
});
test("trägt am Handy ohne horizontales Scrollen", async ({ page, isMobile }) => {
test.skip(!isMobile, "Nur im Projekt „handy“.");
await anmelden(page);
await page.goto("/scannen");
const masse = await page.evaluate(() => ({
scroll: document.documentElement.scrollWidth,
sichtbar: document.documentElement.clientWidth,
}));
expect(masse.scroll).toBeLessThanOrEqual(masse.sichtbar);
});
});