import { test, expect } from '@playwright/test'; // Negative-Path Tests fuer die api-helpers: parsePositiveIntParam und // validateBody. Jeder neue API-Handler sollte dieselben Error-Shapes // liefern — wenn dieser Suite-Block kippt, ist der Helper-Contract kaputt. test.describe('API Error-Shapes', () => { test.describe('parsePositiveIntParam', () => { test('GET /api/recipes/abc -> 400 Invalid id', async ({ request }) => { const r = await request.get('/api/recipes/abc'); expect(r.status()).toBe(400); expect(await r.json()).toEqual({ message: 'Invalid id' }); }); test('GET /api/recipes/-1 -> 400 Invalid id', async ({ request }) => { const r = await request.get('/api/recipes/-1'); expect(r.status()).toBe(400); expect(await r.json()).toEqual({ message: 'Invalid id' }); }); test('GET /api/recipes/0 -> 400 Invalid id', async ({ request }) => { const r = await request.get('/api/recipes/0'); expect(r.status()).toBe(400); expect(await r.json()).toEqual({ message: 'Invalid id' }); }); test('POST /api/recipes/abc/comments -> 400 Invalid id', async ({ request }) => { const r = await request.post('/api/recipes/abc/comments', { data: {} }); expect(r.status()).toBe(400); expect(await r.json()).toEqual({ message: 'Invalid id' }); }); }); test.describe('validateBody', () => { test('POST /api/wishlist leer -> 400 {message, issues}', async ({ request }) => { const r = await request.post('/api/wishlist', { data: {} }); expect(r.status()).toBe(400); const body = (await r.json()) as { message: string; issues?: unknown[] }; expect(body.message).toBe('Invalid body'); expect(Array.isArray(body.issues)).toBe(true); expect((body.issues ?? []).length).toBeGreaterThanOrEqual(2); // recipe_id + profile_id }); test('POST /api/recipes/66/comments leer -> 400 {message, issues}', async ({ request }) => { const r = await request.post('/api/recipes/66/comments', { data: {} }); expect(r.status()).toBe(400); const body = (await r.json()) as { message: string; issues?: unknown[] }; expect(body.message).toBe('Invalid body'); expect((body.issues ?? []).length).toBeGreaterThanOrEqual(1); // profile_id oder text }); test('PUT /api/recipes/66/favorite leer -> 400 {message, issues}', async ({ request }) => { const r = await request.put('/api/recipes/66/favorite', { data: {} }); expect(r.status()).toBe(400); const body = (await r.json()) as { message: string; issues?: unknown[] }; expect(body.message).toBe('Invalid body'); expect((body.issues ?? []).length).toBeGreaterThanOrEqual(1); }); test('POST /api/domains leer -> 400 {message, issues}', async ({ request }) => { const r = await request.post('/api/domains', { data: {} }); expect(r.status()).toBe(400); const body = (await r.json()) as { message: string; issues?: unknown[] }; expect(body.message).toBe('Invalid body'); expect((body.issues ?? []).length).toBeGreaterThanOrEqual(1); }); }); test.describe('404 auf missing Ressourcen', () => { test('GET /api/recipes/99999 -> 404 Recipe not found', async ({ request }) => { const r = await request.get('/api/recipes/99999'); expect(r.status()).toBe(404); expect(await r.json()).toEqual({ message: 'Recipe not found' }); }); }); test.describe('Positive Sanity-Checks', () => { test('GET /api/health -> 200 mit db:"ok"', async ({ request }) => { const r = await request.get('/api/health'); expect(r.status()).toBe(200); const body = (await r.json()) as { db: string }; expect(body.db).toBe('ok'); }); test('GET /api/profiles -> drei Profile', async ({ request }) => { const r = await request.get('/api/profiles'); expect(r.status()).toBe(200); const body = (await r.json()) as { id: number; name: string }[]; expect(body.length).toBeGreaterThanOrEqual(3); const names = body.map((p) => p.name).sort(); expect(names).toEqual(expect.arrayContaining(['Hendrik', 'Leana', 'Verena'])); }); test('GET /api/domains -> liefert Array', async ({ request }) => { const r = await request.get('/api/domains'); expect(r.status()).toBe(200); const body = await r.json(); expect(Array.isArray(body)).toBe(true); }); }); });