Files
kochwas/tests/e2e/remote/search.spec.ts

40 lines
1.6 KiB
TypeScript
Raw Normal View History

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');
});
});