Files
GerbilManager/gerbil-manager-web/e2e/webseite.spec.ts
Gulum c20e6b5426 WEB-0b: CMS-Verwaltung der öffentlichen Webseite (Hand-Editier-UI)
Neuer Bereich /webseite im Manager (Nav: "Mehr"-Blatt) zur Pflege der 6
Webseiten-Seiten gegen Pams WEB-0-Backend (LAN-only, keine Auth):

- Übersicht: alle Seiten mit Status (Entwurf/Veröffentlicht).
- Seiten-Editor: Titel + SEO-Beschreibung + Status speichern.
- Geordneter Block-Editor: Blöcke hinzufügen (Überschrift, Textabschnitt/
  Markdown, Bild, Galerie, Kontaktangaben), bearbeiten, nach oben/unten
  verschieben (PUT .../blocks/order), löschen. Die dynamische AbgabetiereList
  ist nicht manuell anlegbar; nur ihr Einleitungstext ist editierbar.

Vertraege: GET /pages, GET /pages/{slug}, PUT /pages/{id},
POST /pages/{pageId}/blocks, PUT /blocks/{id}, DELETE /blocks/{id},
PUT /pages/{pageId}/blocks/order. Enums als Strings (Draft/Published, Heading...).

Deutsch via de.ts (LF beibehalten), mobile-first. e2e-Mock um die CMS-Routen
erweitert (zustandsbehaftet) + Smoke (Block anlegen/bearbeiten/verschieben,
bleibt erhalten). Gate gruen: build, eslint, vitest 69, e2e 68.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 11:23:34 +02:00

58 lines
2.2 KiB
TypeScript

/** WEB-0b: CMS-Verwaltung der öffentlichen Webseite — Smoke-Test. */
import { de, expect, gotoSection, skipUnlessMock, test } from './fixtures'
const t = de.pages.webseite
test('Webseiten-Übersicht zeigt die Seiten mit Status', async ({ page }) => {
skipUnlessMock()
await gotoSection(page, de.nav.website)
await expect(page.getByRole('heading', { name: t.title, exact: true })).toBeVisible()
const cards = page.locator('.webseite-card')
await expect(cards).toHaveCount(6)
const start = page.locator('.webseite-card', { hasText: 'Startseite' })
await expect(start.getByText(t.statusPublished, { exact: true })).toBeVisible()
})
test('Block hinzufügen, bearbeiten und verschieben bleibt erhalten', async ({ page }) => {
skipUnlessMock()
await gotoSection(page, de.nav.website)
// Startseite öffnen (hat bereits zwei Blöcke).
await page
.locator('.webseite-card', { hasText: 'Startseite' })
.getByRole('link', { name: t.edit })
.click()
await expect(page.getByRole('heading', { name: 'Startseite' })).toBeVisible()
const blocks = page.locator('.block-card')
await expect(blocks).toHaveCount(2)
// Eine Überschrift hinzufügen -> jetzt drei Blöcke.
await page.getByRole('button', { name: `+ ${t.blocks.types.Heading}` }).click()
await expect(blocks).toHaveCount(3)
// Den neuen (letzten) Block beschriften und speichern.
const last = blocks.last()
await last.getByLabel(t.blocks.fields.headingText).fill('Neue Überschrift')
await last.getByRole('button', { name: t.blocks.save }).click()
await expect(last.getByText(t.blocks.saved, { exact: true })).toBeVisible()
// Den neuen Block nach oben verschieben (von Position 3 auf 2).
await last.getByRole('button', { name: t.blocks.moveUp }).click()
// Neu laden über die Übersicht — der Mock ist zustandsbehaftet.
await page.getByRole('link', { name: t.back }).click()
await page
.locator('.webseite-card', { hasText: 'Startseite' })
.getByRole('link', { name: t.edit })
.click()
// Drei Blöcke, und die neue Überschrift steht jetzt an zweiter Stelle.
await expect(page.locator('.block-card')).toHaveCount(3)
await expect(page.locator('.block-card').nth(1).getByLabel(t.blocks.fields.headingText)).toHaveValue(
'Neue Überschrift',
)
})