import { expect, test } from '@playwright/test'; test('overview shows status, totals and leaderboards', async ({ page }) => { await page.goto('/'); await expect(page.getByText('Spieler online')).toBeVisible(); await expect(page.getByText('Spielzeit gesamt')).toBeVisible(); await expect(page.getByRole('heading', { name: 'Bestenlisten' })).toBeVisible(); await expect(page.getByRole('heading', { name: 'Dauerzocker' })).toBeVisible(); const overflow = await page.evaluate(() => document.documentElement.scrollWidth > window.innerWidth); expect(overflow).toBe(false); }); test('clicking a player opens the profile', async ({ page }) => { await page.goto('/leaderboards/playtime'); const first = page.locator('ol li a').first(); const name = (await first.textContent())!.trim(); await first.click(); await expect(page.getByRole('heading', { level: 1, name })).toBeVisible(); await expect(page.getByRole('heading', { name: 'Wann gespielt wird' })).toBeVisible(); }); test('leaderboard periods switch', async ({ page }) => { await page.goto('/leaderboards/deaths'); await page.getByRole('link', { name: '7 Tage' }).click(); await expect(page).toHaveURL(/period=7d/); await expect(page.getByText('Zuwachs der letzten 7 Tage', { exact: false })).toBeVisible(); }); test('unknown player shows the not-found page', async ({ page }) => { const res = await page.goto('/players/DiesenSpielerGibtEsNicht'); expect(res?.status()).toBe(404); await expect(page.getByText('Hier gibt es nichts abzubauen')).toBeVisible(); }); test('live endpoint streams server-sent events', async ({ page }) => { await page.goto('/'); const first = await page.evaluate(async () => { const ctrl = new AbortController(); const res = await fetch('/api/live', { signal: ctrl.signal }); const reader = res.body!.getReader(); const { value } = await reader.read(); ctrl.abort(); return { type: res.headers.get('content-type'), text: new TextDecoder().decode(value) }; }); expect(first.type).toContain('text/event-stream'); expect(first.text).toContain(': connected'); });