Die Einstellung haelt ueber das Neuladen, ohne eingeschalteten Weg geht nichts hinaus, und ein unsinniger Vorlauf wird auch dann abgewiesen, wenn er an der Oberflaeche vorbei hereinkommt. Der Anmeldehelfer liegt jetzt einmal in e2e/hilfe.ts und fasst nach: ein Klick, der vor der Hydratation ankommt, verpufft folgenlos — das hat die Testlaeufe unter Last wiederholt scheitern lassen. Der Integrationstest prueft die drei neuen Tabellen samt Kaskade. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
92 lines
3.7 KiB
TypeScript
92 lines
3.7 KiB
TypeScript
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()
|
|
})
|
|
})
|