- 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
74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
/** FEAT-NAMEGEN: Tests für buildSuggestPath + NAMEGEN_USAGES. */
|
|
import { describe, expect, it } from 'vitest'
|
|
import { buildSuggestPath, NAMEGEN_USAGES } from '../names'
|
|
|
|
describe('buildSuggestPath', () => {
|
|
it('includes uppercased letter', () => {
|
|
const path = buildSuggestPath({ letter: 'f', gender: 'female', usages: ['norn'] })
|
|
expect(path).toContain('letter=F')
|
|
})
|
|
|
|
it('omits letter when blank', () => {
|
|
const path = buildSuggestPath({ letter: '', usages: ['norn'] })
|
|
expect(path).not.toContain('letter=')
|
|
})
|
|
|
|
it('omits letter when only whitespace', () => {
|
|
const path = buildSuggestPath({ letter: ' ', usages: ['norn'] })
|
|
expect(path).not.toContain('letter=')
|
|
})
|
|
|
|
it('includes gender', () => {
|
|
const path = buildSuggestPath({ gender: 'male', usages: ['norn'] })
|
|
expect(path).toContain('gender=male')
|
|
})
|
|
|
|
it('omits gender for empty string', () => {
|
|
const path = buildSuggestPath({ gender: '', usages: ['norn'] })
|
|
expect(path).not.toContain('gender=')
|
|
})
|
|
|
|
it('joins multiple usages without encoding commas', () => {
|
|
const path = buildSuggestPath({ usages: ['norn', 'mythg'] })
|
|
expect(path).toContain('usages=norn,mythg')
|
|
})
|
|
|
|
it('omits usages when array is empty', () => {
|
|
const path = buildSuggestPath({ usages: [] })
|
|
expect(path).not.toContain('usages=')
|
|
})
|
|
|
|
it('defaults count to 6', () => {
|
|
const path = buildSuggestPath({ usages: ['norn'] })
|
|
expect(path).toContain('count=6')
|
|
})
|
|
|
|
it('uses provided count', () => {
|
|
const path = buildSuggestPath({ usages: ['norn'], count: 8 })
|
|
expect(path).toContain('count=8')
|
|
})
|
|
|
|
it('starts with /names/suggest', () => {
|
|
const path = buildSuggestPath({ usages: ['norn'] })
|
|
expect(path).toMatch(/^\/names\/suggest\?/)
|
|
})
|
|
})
|
|
|
|
describe('NAMEGEN_USAGES', () => {
|
|
it('contains all 5 expected culture codes', () => {
|
|
const codes = NAMEGEN_USAGES.map((u) => u.code)
|
|
expect(codes).toContain('norn')
|
|
expect(codes).toContain('japa')
|
|
expect(codes).toContain('mythg')
|
|
expect(codes).toContain('ger')
|
|
expect(codes).toContain('arb')
|
|
expect(codes).toHaveLength(5)
|
|
})
|
|
|
|
it('every usage has a non-empty label', () => {
|
|
for (const u of NAMEGEN_USAGES) {
|
|
expect(u.label.length).toBeGreaterThan(0)
|
|
}
|
|
})
|
|
})
|