Files
planer/e2e/rollen.spec.ts
Florian WildeandClaude Opus 5 cf28ec19f5 test: Rollentrennung end-to-end absichern
Legt einen Benutzer ohne Verwaltungsrechte an und prüft, dass der direkte
Aufruf der Protokollseite auf den Hinweis führt — nicht nur, dass der
Menüpunkt fehlt. Sich darauf zu verlassen, dass die Oberfläche Knöpfe
ausblendet, wäre kein Nachweis.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 14:32:52 +02:00

75 lines
2.6 KiB
TypeScript

import { PrismaPg } from '@prisma/adapter-pg'
import { expect, test, type Page } from '@playwright/test'
import bcrypt from 'bcryptjs'
import { PrismaClient } from '../src/generated/prisma/client.js'
/**
* Prüft, dass die Rollentrennung serverseitig hält.
*
* Die Oberfläche blendet Knöpfe aus — darauf allein darf man sich nicht
* verlassen. Deshalb ruft dieser Test die Verwaltungsseite direkt auf, statt
* nach einem Menüpunkt zu suchen.
*/
const EMAIL = 'zzz-e2e-benutzer@example.invalid'
const PASSWORT = 'nur-fuer-den-test-1234'
const verbindung = process.env.DATABASE_URL ?? ''
const db = new PrismaClient({ adapter: new PrismaPg({ connectionString: verbindung }) })
test.describe('Rollentrennung', () => {
test.skip(!verbindung, 'DATABASE_URL ist nicht gesetzt.')
test.beforeAll(async () => {
await db.benutzer.deleteMany({ where: { email: EMAIL } })
await db.benutzer.create({
data: {
email: EMAIL,
name: 'Testbenutzer ohne Rechte',
rolle: 'BENUTZER',
passwortHash: await bcrypt.hash(PASSWORT, 10),
},
})
})
test.afterAll(async () => {
await db.auditEintrag.deleteMany({ where: { benutzerEmail: EMAIL } })
await db.benutzer.deleteMany({ where: { email: EMAIL } })
await db.$disconnect()
})
async function anmelden(seite: Page): Promise<void> {
await seite.goto('/anmelden')
await seite.getByLabel('E-Mail-Adresse').fill(EMAIL)
await seite.getByLabel('Passwort').fill(PASSWORT)
await seite.getByRole('button', { name: 'Mit Passwort anmelden' }).click()
await expect(seite.getByRole('heading', { name: /Guten Tag/ })).toBeVisible()
}
test('zeigt einem Benutzer den Menüpunkt Protokoll gar nicht', async ({ page }) => {
await anmelden(page)
await expect(page.getByRole('link', { name: 'Protokoll' })).toHaveCount(0)
})
test('lässt einen Benutzer auch beim direkten Aufruf nicht ins Protokoll', async ({
page,
}) => {
await anmelden(page)
await page.goto('/verwaltung/protokoll')
await expect(page).toHaveURL(/\/keine-berechtigung/)
await expect(
page.getByRole('heading', { name: /Dazu fehlt dir die Berechtigung/ }),
).toBeVisible()
})
test('zeigt einem Benutzer die Bereiche, aber ohne Formulare', async ({ page }) => {
await anmelden(page)
await page.goto('/bereiche')
await expect(page.getByRole('heading', { name: 'Bereiche' })).toBeVisible()
await expect(page.getByRole('button', { name: 'Bearbeiten' })).toHaveCount(0)
await expect(page.getByRole('button', { name: 'Bereich anlegen' })).toHaveCount(0)
})
})