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>
58 lines
2.2 KiB
TypeScript
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',
|
|
)
|
|
})
|