import { expect, test } from '@playwright/test' import { queryScalar, resetDatabases, seedQuestions, sqlLiteral } from './helpers/stack' const apiBase = process.env.FULLSTACK_API_BASE_URL ?? 'http://127.0.0.1:18096' test.describe('full-stack leaderboard integration', () => { test.beforeEach(() => { resetDatabases() seedQuestions() }) test('frontend leaderboard renders data persisted through gateway into DB', async ({ page, request, }) => { const sessionID = `sess-${Date.now()}` const playerName = `Player${Date.now().toString().slice(-4)}` const updateResp = await request.post(`${apiBase}/api/v1/leaderboard/update`, { data: { session_id: sessionID, player_id: 'player-001', player_name: playerName, total_score: 12, questions_asked: 6, questions_correct: 5, hints_used: 1, duration_seconds: 150, completed_at: new Date().toISOString(), completion_type: 'completed', }, }) const updateBodyText = await updateResp.text() expect(updateResp.ok(), updateBodyText).toBeTruthy() const body = JSON.parse(updateBodyText) expect(body.success).toBeTruthy() const count = Number.parseInt( queryScalar( 'leaderboards', `SELECT COUNT(*) FROM leaderboard_entries WHERE session_id = ${sqlLiteral(sessionID)};` ), 10 ) expect(count).toBe(1) await page.goto('/leaderboard') await expect(page.getByRole('table', { name: 'top-10-leaderboard' })).toBeVisible() await expect(page.getByText(playerName)).toBeVisible() }) })