All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 1m42s
Automatisierte End-to-End-Tests gegen ein deployed Environment. Loest die manuellen MCP-Playwright-Runs ab. 42 Tests in 9 Files: - homepage: H1, Sektionen, Sort-Tabs, Console-Errors - search: lokaler Treffer, Web-Fallback, Empty-State, Deep-Link - profile: Switcher, Auswahl-Persistenz, Favoriten-Section, Guard-Dialog - recipe-detail: Header, Portionen-Scaling (4->6), Favorit-Toggle, Rating-Persistenz ueber Reload, Gekocht-Counter, Wunschliste-Toggle - comments: eigenen erstellen+loeschen via UI, fremder hat kein Delete - wishlist: Seite, Sort-Tabs, Badge-Sync, requireProfile-Custom-Message - preview: Guard ohne ?url=, echte URL parst, unparsbare zeigt error-box - admin: alle 4 Subrouten + /admin redirect - api-errors: parsePositiveIntParam (4x Invalid id), validateBody (4x Invalid body + issues), 404, Sanity /health /profiles /domains Architektur: - Separate playwright.remote.config.ts (getrennt von local preview) - workers: 1 + afterEach API-Cleanup (rating, favorite, wishlist, comments) - Hardcoded Recipe-ID 66 + Profile 1/2/3 — stabile Dev-DB-Seeds - E2E_REMOTE_URL ueberschreibt die Ziel-URL Ausfuehrung: npm run test:e2e:remote Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
44 lines
1.7 KiB
TypeScript
44 lines
1.7 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
test.describe('Startseite', () => {
|
|
test('laedt mit H1, Zuletzt-hinzugefuegt und Alle-Rezepte', async ({ page }) => {
|
|
await page.goto('/');
|
|
await expect(page).toHaveTitle(/Kochwas/);
|
|
await expect(page.getByRole('heading', { level: 1, name: 'Kochwas' })).toBeVisible();
|
|
await expect(
|
|
page.getByRole('heading', { level: 2, name: 'Zuletzt hinzugefügt' })
|
|
).toBeVisible();
|
|
await expect(page.getByRole('heading', { level: 2, name: 'Alle Rezepte' })).toBeVisible();
|
|
});
|
|
|
|
test('Sort-Tabs rendern unterschiedliche Top-Eintraege', async ({ page }) => {
|
|
await page.goto('/');
|
|
// Liste unter "Alle Rezepte"
|
|
const allSection = page.locator('section', { has: page.getByRole('heading', { name: 'Alle Rezepte' }) });
|
|
const firstItem = () => allSection.locator('li a').first().innerText();
|
|
|
|
await page.getByRole('tab', { name: 'Name' }).click();
|
|
await page.waitForTimeout(400);
|
|
const nameTop = await firstItem();
|
|
|
|
await page.getByRole('tab', { name: 'Hinzugefügt' }).click();
|
|
await page.waitForTimeout(400);
|
|
const addedTop = await firstItem();
|
|
|
|
expect(nameTop).not.toEqual(addedTop);
|
|
});
|
|
|
|
test('hat keine Console-Errors', async ({ page }) => {
|
|
const errors: string[] = [];
|
|
page.on('console', (msg) => {
|
|
if (msg.type() === 'error') errors.push(msg.text());
|
|
});
|
|
await page.goto('/');
|
|
await page.waitForLoadState('networkidle');
|
|
// 404s auf externen Bildern (chefkoch-cdn, cloudfront) ignorieren —
|
|
// das ist kein App-Fehler, sondern externe Thumbnails.
|
|
const appErrors = errors.filter((e) => !/Failed to load resource/i.test(e));
|
|
expect(appErrors).toEqual([]);
|
|
});
|
|
});
|