import { expect, test } from '@playwright/test' import { PrismaClient } from '@prisma/client' import { anmelden } from './hilfen' /** * Eigene Schreibvorlagen — gegen die echte Anwendung. * * Der Weg über die Oberfläche: Vorlage anlegen (mit der zweistufigen * Bestellungsabsatz-Warnung), aus einer mitgelieferten kopieren, beim * Schreiben auswählen und die Platzhalter-Auflösung sehen. */ const VORLAGE = 'Prüfhausen Testvorlage' async function mitDb(arbeit: (db: PrismaClient) => Promise): Promise { const db = new PrismaClient() try { return await arbeit(db) } finally { await db.$disconnect() } } async function aufraeumen(): Promise { await mitDb(async (db) => { await db.schreibvorlage.deleteMany({ where: { name: { contains: 'Prüfhausen' } } }) await db.schreibvorlage.deleteMany({ where: { name: { contains: '(eigene Fassung)' } } }) }) } test.describe('Schreibvorlagen', () => { test.beforeAll(async () => { await aufraeumen() }) test.afterAll(async () => { await aufraeumen() }) test('warnt ohne Bestellungsabsatz und speichert erst nach Bestätigung', async ({ page }) => { await anmelden(page) await page.goto('/einstellungen/vorlagen') await page.getByRole('button', { name: 'Neue Vorlage' }).click() await page.locator('input[name="name"]').fill(VORLAGE) await page .locator('textarea[name="text"]') .fill('Sehr geehrte Damen und Herren,\n\nbitte um Auskunft zu {{betreute_name}}.\n\nMfG') // Erster Versuch: Warnung, nicht gespeichert. await page.getByRole('button', { name: 'Speichern' }).click() await expect(page.getByText(/fehlt der Bestellungsabsatz/)).toBeVisible() // Bestätigen und erneut speichern. await page.getByText('Bewusst ohne Bestellungsabsatz speichern').click() await page.getByRole('button', { name: 'Speichern' }).click() await expect(page.getByText(`„${VORLAGE}“ ist gespeichert.`)).toBeVisible() }) test('speichert mit Platzhalter ohne Warnung', async ({ page }) => { await anmelden(page) await page.goto('/einstellungen/vorlagen') await page.getByRole('button', { name: 'Neue Vorlage' }).click() await page.locator('input[name="name"]').fill(`${VORLAGE} mit Absatz`) await page .locator('textarea[name="text"]') .fill('Sehr geehrte Damen und Herren,\n\n{{bestellungsabsatz}}\n\nbitte um Auskunft.\n\nMfG') await page.getByRole('button', { name: 'Speichern' }).click() await expect(page.getByText(`„${VORLAGE} mit Absatz“ ist gespeichert.`)).toBeVisible() }) test('übernimmt eine mitgelieferte Vorlage als Kopie', async ({ page }) => { await anmelden(page) await page.goto('/einstellungen/vorlagen') await page .locator('li', { hasText: 'Auskunftsersuchen' }) .getByRole('button', { name: 'Als Kopie übernehmen' }) .click() // Der Editor öffnet mit den kopierten Inhalten. await expect(page.locator('input[name="name"]')).toHaveValue(/eigene Fassung/) const text = await page.locator('textarea[name="text"]').inputValue() expect(text).toContain('{{bestellungsabsatz}}') await page.getByRole('button', { name: 'Speichern' }).click() await expect(page.getByText(/ist gespeichert/)).toBeVisible() }) test('löst die Platzhalter beim Erzeugen auf — mit sichtbaren Lücken', async ({ page }) => { await anmelden(page) await page.goto('/schreiben/neu?art=FREI') // Die gespeicherte Vorlage steht zur Wahl. const wahl = page.locator('select#vorlageWahl') await expect(wahl).toBeVisible() await wahl.selectOption({ label: `${VORLAGE} mit Absatz` }) await page.waitForURL(/vorlageId=/) const text = await page.locator('textarea#text').inputValue() // Der Bestellungsabsatz ist aufgelöst (kein Platzhalter mehr) … expect(text).not.toContain('{{bestellungsabsatz}}') expect(text).toMatch(/Beschluss|bestellt/) // … und der Rest des Textes steht drin. expect(text).toContain('bitte um Auskunft.') }) test('markiert unbekannte Platzhalter im Text und warnt', async ({ page }) => { await mitDb(async (db) => { const betreute = await db.betreute.findMany({ where: { geloeschtAm: null }, select: { id: true }, }) for (const person of betreute) { await db.schreibvorlage.create({ data: { betreuteId: person.id, name: `${VORLAGE} kaputt`, text: 'Sehr geehrte Damen und Herren,\n\n{{bestellungsabsatz}}\n\nHallo {{gibt_es_nicht}}.', }, }) } }) await anmelden(page) await page.goto('/schreiben/neu?art=FREI') await page.locator('select#vorlageWahl').selectOption({ label: `${VORLAGE} kaputt` }) await page.waitForURL(/vorlageId=/) // Markiert im Text, benannt in der Warnung — kein Abbruch. const text = await page.locator('textarea#text').inputValue() expect(text).toContain('[Unbekannter Platzhalter: {{gibt_es_nicht}}]') await expect(page.getByText(/unbekannte Platzhalter/)).toBeVisible() }) test('gelöschte Vorlage liegt im Papierkorb und kommt zurück', async ({ page }) => { await anmelden(page) await page.goto('/einstellungen/vorlagen') // Zweistufig - Loeschen fragt erst nach. const eintrag = page.locator('li', { hasText: `${VORLAGE} mit Absatz` }) await eintrag.getByRole('button', { name: 'Löschen' }).click() await eintrag.getByRole('button', { name: 'In den Papierkorb' }).click() await expect(page.getByText(`${VORLAGE} mit Absatz`)).toHaveCount(0) await page.goto('/einstellungen/papierkorb') const zeile = page.locator('li', { hasText: `${VORLAGE} mit Absatz` }) await expect(zeile).toBeVisible() await zeile.getByRole('button', { name: 'Wiederherstellen' }).click() await page.goto('/einstellungen/vorlagen') await expect(page.getByText(`${VORLAGE} mit Absatz`)).toBeVisible() }) })