import { expect, test, type Page } from "@playwright/test"; import "dotenv/config"; /** * 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. */ async function anmelden(seite: Page) { const email = process.env["SEED_ADMIN_EMAIL"]; const passwort = process.env["SEED_ADMIN_PASSWORD"]; if (!email || !passwort) throw new Error("SEED_ADMIN_EMAIL und SEED_ADMIN_PASSWORD fehlen."); 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"]')]); } 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("lz-7k3f9q"); await page.getByRole("button", { name: "Öffnen" }).click(); await page.waitForURL("**/t/LZ-7K3F9Q"); }); 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); }); });