- api/names.ts: suggestNames() + buildSuggestPath() + NAMEGEN_USAGES (norn/japa/mythg/ger/arb) - de.ts: namegen-Sektion (button, panelTitle, letter/usages/load/states) - NameSuggestPanel.tsx: inline-Panel mit Buchstabe/Herkunftskultur-Multiselect, Vorschlagsliste; 503 NamesKeyMissing → freundlicher Hinweis - GerbilFormPage: 'Name vorschlagen'-Button neben Namensfeld (htmlFor-Pattern), Panel schließt+befüllt bei Auswahl - vitest: 11 Tests (buildSuggestPath URL-Logik + NAMEGEN_USAGES-Struktur) - e2e: mock /names/suggest + namesConfigured-Flag; 4 Specs (Panel öffnen, Klick befüllt, Buchstabe-Filter, 503-Fallback) Gate: vitest 104/104, e2e 156/156, tsc clean
60 lines
2.5 KiB
TypeScript
60 lines
2.5 KiB
TypeScript
/** FEAT-NAMEGEN: UC-1 — 'Name vorschlagen'-Panel auf der GerbilFormPage. */
|
|
import { de, expect, skipUnlessMock, test } from './fixtures'
|
|
|
|
const t = de.namegen
|
|
const tf = de.pages.gerbils.form
|
|
|
|
test('Name-vorschlagen-Panel öffnet sich und zeigt Vorschläge (FEAT-NAMEGEN)', async ({ page }) => {
|
|
skipUnlessMock()
|
|
await page.goto('/rennmaeuse/neu')
|
|
await expect(page.getByRole('heading', { name: tf.createTitle })).toBeVisible()
|
|
|
|
// Panel öffnen
|
|
await page.getByRole('button', { name: t.button }).click()
|
|
await expect(page.getByText(t.panelTitle)).toBeVisible()
|
|
|
|
// Vorschläge laden
|
|
await page.getByRole('button', { name: t.loadButton }).click()
|
|
// Fenrir ist im Mock immer dabei (kein Buchstabe-Filter)
|
|
await expect(page.getByRole('button', { name: 'Fenrir' })).toBeVisible()
|
|
await expect(page.getByText('Wolf aus der Nordischen Mythologie')).toBeVisible()
|
|
})
|
|
|
|
test('Klick auf Vorschlag befüllt Namensfeld und schließt Panel (FEAT-NAMEGEN)', async ({ page }) => {
|
|
skipUnlessMock()
|
|
await page.goto('/rennmaeuse/neu')
|
|
await page.getByRole('button', { name: t.button }).click()
|
|
await page.getByRole('button', { name: t.loadButton }).click()
|
|
await expect(page.getByRole('button', { name: 'Fenrir' })).toBeVisible()
|
|
|
|
// Klick auf Vorschlag 'Fenrir'
|
|
await page.getByRole('button', { name: 'Fenrir' }).click()
|
|
|
|
// Panel geschlossen, Name-Feld befüllt
|
|
await expect(page.getByText(t.panelTitle)).toBeHidden()
|
|
await expect(page.getByLabel(`${de.pages.gerbils.fields.name} *`)).toHaveValue('Fenrir')
|
|
})
|
|
|
|
test('Buchstabe-Filter schränkt Vorschläge ein (FEAT-NAMEGEN)', async ({ page }) => {
|
|
skipUnlessMock()
|
|
await page.goto('/rennmaeuse/neu')
|
|
await page.getByRole('button', { name: t.button }).click()
|
|
await page.getByLabel(t.letterLabel).fill('F')
|
|
await page.getByRole('button', { name: t.loadButton }).click()
|
|
|
|
// Mock gibt nur Namen mit F zurück: Fenrir + Freya
|
|
await expect(page.getByRole('button', { name: 'Fenrir' })).toBeVisible()
|
|
await expect(page.getByRole('button', { name: 'Freya' })).toBeVisible()
|
|
// Artemis (A) nicht sichtbar
|
|
await expect(page.getByRole('button', { name: 'Artemis' })).toBeHidden()
|
|
})
|
|
|
|
test('503 NamesKeyMissing zeigt freundlichen Hinweis (FEAT-NAMEGEN)', async ({ page, mockDb }) => {
|
|
skipUnlessMock()
|
|
if (mockDb) mockDb.namesConfigured = false
|
|
await page.goto('/rennmaeuse/neu')
|
|
await page.getByRole('button', { name: t.button }).click()
|
|
await page.getByRole('button', { name: t.loadButton }).click()
|
|
await expect(page.getByText(t.keyMissing)).toBeVisible()
|
|
})
|