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>
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { PrismaPg } from '@prisma/adapter-pg'
|
|
import { expect, test } from '@playwright/test'
|
|
import bcrypt from 'bcryptjs'
|
|
import { PrismaClient } from '../src/generated/prisma/client.js'
|
|
import { anmelden as anmeldenMit } from './hilfe'
|
|
|
|
/**
|
|
* 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()
|
|
})
|
|
|
|
test('zeigt einem Benutzer den Menüpunkt Protokoll gar nicht', async ({ page }) => {
|
|
await anmeldenMit(page, EMAIL, PASSWORT)
|
|
await expect(page.getByRole('link', { name: 'Protokoll' })).toHaveCount(0)
|
|
})
|
|
|
|
test('lässt einen Benutzer auch beim direkten Aufruf nicht ins Protokoll', async ({
|
|
page,
|
|
}) => {
|
|
await anmeldenMit(page, EMAIL, PASSWORT)
|
|
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 anmeldenMit(page, EMAIL, PASSWORT)
|
|
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)
|
|
})
|
|
})
|