import { test, expect } from '@playwright/test'; test.describe('Suche', () => { test('lokaler Treffer erscheint live beim Tippen', async ({ page }) => { await page.goto('/'); await page.getByRole('searchbox', { name: 'Suchbegriff' }).fill('lasagne'); await expect(page.getByRole('link', { name: /Pfannen Lasagne/i })).toBeVisible({ timeout: 5000 }); }); test('Web-Fallback bei unbekanntem Begriff', async ({ page }) => { // Direkt per URL — spart den Debounce-Timer. await page.goto('/?q=pizza+margherita'); await expect(page.getByText(/Keine lokalen Rezepte/i)).toBeVisible({ timeout: 15000 }); // Mindestens ein Web-Treffer mit einer Domain-Labeling. await expect(page.getByText(/chefkoch\.de|rezeptwelt\.de/i).first()).toBeVisible(); }); test('Nonsense-Query rendert Fallback ohne Crash', async ({ page }) => { // SearXNG matcht loose — selbst Nonsense gibt oft Fuzzy-Treffer. // Wir pruefen deshalb nur, dass die Seite sinnvoll reagiert // (entweder echter Empty-State ODER Web-Fallback) und kein JS-Fehler // fliegt. const errors: string[] = []; page.on('pageerror', (err) => errors.push(err.message)); await page.goto('/?q=xxyyzznotarecipexxxxxxxx'); await expect( page.getByText(/Schaue unter den Topfdeckeln|Keine lokalen Rezepte/i) ).toBeVisible({ timeout: 15000 }); expect(errors).toEqual([]); }); test('Deep-Link ?q=lasagne stellt Query im Input wieder her', async ({ page }) => { await page.goto('/?q=lasagne'); const sb = page.getByRole('searchbox', { name: 'Suchbegriff' }); await expect(sb).toHaveValue('lasagne'); }); });