diff --git a/src/lib/server/ai/description-phrases.ts b/src/lib/server/ai/description-phrases.ts new file mode 100644 index 0000000..2c0ed2a --- /dev/null +++ b/src/lib/server/ai/description-phrases.ts @@ -0,0 +1,56 @@ +export const DESCRIPTION_PHRASES: readonly string[] = [ + 'Mit dem Zauberstab aus dem Kochbuch geholt.', + 'Foto-Magie frisch aus dem Ofen.', + 'Aus dem Bild herbeigezaubert.', + 'Ein Klick, ein Foto, fertig.', + 'Knipsen statt Abtippen.', + 'Von der Buchseite direkt in die Pfanne.', + 'Die Kamera hat mitgelesen.', + 'Abrakadabra — Rezept da.', + 'Per Linse in die Küche teleportiert.', + 'Von Oma abfotografiert, von der KI entziffert.', + 'Frisch aus dem Bilderrahmen.', + 'Klick, zisch, Rezept.', + 'Das Foto wurde überredet, sich zu verraten.', + 'Schnappschuss zur Schüssel.', + 'Einmal lesen lassen, schon da.', + 'Keine Hand hat dieses Rezept abgetippt.', + 'Vom Bild in die Bratpfanne.', + 'Papier ist geduldig, das Foto war es auch.', + 'Eine Seite, ein Foto, ein Rezept.', + 'Die KI hat drübergeschielt.', + 'Handschriftlich entziffert — oder zumindest versucht.', + 'Aus der Linse in die Liste.', + 'Vom Küchentisch zur Kachel.', + 'Knips und weg — zumindest der Zettel.', + 'Das Bild hat geredet.', + 'Keine Tippfehler, nur Sehfehler.', + 'Per Foto eingebürgert.', + 'Rezept-Übersetzung aus dem Bild.', + 'Die Seite hat sich verraten.', + 'Blitzlicht und dann Gulasch.', + 'Ein Augenzwinkern der Kamera genügte.', + 'Geknipst, gelesen, gespeichert.', + 'Fotografische Gedächtnishilfe.', + 'Aus der Schublade ans Licht.', + 'Das Rezept stand schon da — wir haben nur hingeguckt.', + 'Zaubertrick mit Kamera.', + 'Vom Papier befreit.', + 'Ein Foto sagt mehr als tausend Zutatenlisten.', + 'Eingescannt, rausgelesen, reingeschrieben.', + 'Die Kamera als Küchenhilfe.', + 'Handy hoch, Rezept runter.', + 'Aus dem Kochbuch gebeamt.', + 'Ein scharfes Foto, ein klares Rezept.', + 'Vom Regal zur App in einem Schritt.', + 'Aus dem Bild geschöpft wie Suppe aus dem Topf.', + 'Optisch erfasst, digital serviert.', + 'Das Kleingedruckte hat die KI gelesen.', + 'Vom Kladdenzettel in die Datenbank.', + 'Kurz gezückt, schon gekocht.', + 'Kein Schreibkrampf, nur ein Klick.' +]; + +export function pickRandomPhrase(): string { + return DESCRIPTION_PHRASES[Math.floor(Math.random() * DESCRIPTION_PHRASES.length)]; +} diff --git a/tests/unit/description-phrases.test.ts b/tests/unit/description-phrases.test.ts new file mode 100644 index 0000000..de74706 --- /dev/null +++ b/tests/unit/description-phrases.test.ts @@ -0,0 +1,26 @@ +import { describe, it, expect } from 'vitest'; +import { DESCRIPTION_PHRASES, pickRandomPhrase } from '../../src/lib/server/ai/description-phrases'; + +describe('description-phrases', () => { + it('contains exactly 50 entries', () => { + expect(DESCRIPTION_PHRASES).toHaveLength(50); + }); + + it('has no empty or whitespace-only entries', () => { + for (const phrase of DESCRIPTION_PHRASES) { + expect(phrase.trim().length).toBeGreaterThan(0); + } + }); + + it('has no duplicates', () => { + const set = new Set(DESCRIPTION_PHRASES); + expect(set.size).toBe(DESCRIPTION_PHRASES.length); + }); + + it('pickRandomPhrase returns a member of the pool', () => { + const pool = new Set(DESCRIPTION_PHRASES); + for (let i = 0; i < 100; i++) { + expect(pool.has(pickRandomPhrase())).toBe(true); + } + }); +});