import { PrismaPg } from '@prisma/adapter-pg' import { expect, test } from '@playwright/test' import { PrismaClient } from '../src/generated/prisma/client.js' import { anmelden, EMAIL, PASSWORT, VERBINDUNG } from './hilfe' /** * Was in M5 wirklich zählt: die Einstellung hält, und ohne eingeschalteten * Weg geht nichts hinaus. * * Der Test rührt nur an der Einstellung des Testkontos und stellt sie am * Ende wieder her. */ const db = new PrismaClient({ adapter: new PrismaPg({ connectionString: VERBINDUNG }) }) test.describe('Benachrichtigungen', () => { test.skip( !EMAIL || !PASSWORT || !VERBINDUNG, 'Ohne ADMIN_EMAIL, ADMIN_PASSWORT und DATABASE_URL gibt es kein Testkonto.', ) test.afterAll(async () => { const benutzer = await db.benutzer.findUnique({ where: { email: EMAIL }, select: { id: true }, }) if (benutzer) { await db.benachrichtigungseinstellung.deleteMany({ where: { benutzerId: benutzer.id }, }) await db.meldungsnachweis.deleteMany({ where: { benutzerId: benutzer.id } }) } await db.auditEintrag.deleteMany({ where: { aktion: { startsWith: 'benachrichtigung.' } }, }) await db.$disconnect() }) test('speichert die Einstellung und hält sie', async ({ page }) => { await anmelden(page) await page.goto('/einstellungen') const karte = page.locator('[data-bild="benachrichtigungen"]') await expect(karte).toBeVisible() // --- Ab Werk ist nichts eingeschaltet --------------------------------- await expect(karte.locator('input[name="perPush"]')).not.toBeChecked() await expect(karte.locator('input[name="perMail"]')).not.toBeChecked() // --- Ohne Weg keine Probe --------------------------------------------- await karte.getByRole('button', { name: 'Probe schicken' }).click() await expect(page.getByText('Erst einen Weg einschalten')).toBeVisible() // --- Ändern und speichern --------------------------------------------- await karte.locator('input[name="perMail"]').check() await karte.locator('input[value="zeitblock"]').check() await karte.getByLabel('Tagesüberblick um').fill('06:30') await karte.getByLabel('Vorlauf vor einem Zeitblock (Minuten)').fill('20') await karte.getByLabel('Am Wochenende gar nichts melden').check() await karte.getByRole('button', { name: 'Speichern' }).click() await expect(page.getByText('Einstellungen gespeichert.')).toBeVisible() // --- Nach dem Neuladen steht alles noch da ---------------------------- await page.reload() await expect(karte.locator('input[name="perMail"]')).toBeChecked() await expect(karte.locator('input[value="zeitblock"]')).toBeChecked() await expect(karte.getByLabel('Tagesüberblick um')).toHaveValue('06:30') await expect(karte.getByLabel('Vorlauf vor einem Zeitblock (Minuten)')).toHaveValue( '20', ) await expect(karte.getByLabel('Am Wochenende gar nichts melden')).toBeChecked() }) test('weist eine unsinnige Vorlaufzeit zurück', async ({ page }) => { await anmelden(page) await page.goto('/einstellungen') const karte = page.locator('[data-bild="benachrichtigungen"]') const vorlauf = karte.getByLabel('Vorlauf vor einem Zeitblock (Minuten)') // Das Zahlenfeld begrenzt auf 120; der Server darf sich darauf nicht // verlassen, deshalb kommt der Wert an der Oberfläche vorbei. await vorlauf.evaluate((feld: HTMLInputElement) => { feld.max = '600' feld.value = '300' }) await karte.getByRole('button', { name: 'Speichern' }).click() await expect(page.getByText('Bitte die markierten Felder prüfen.')).toBeVisible() await expect(karte.getByText('Mehr als zwei Stunden Vorlauf')).toBeVisible() }) })