You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.6 KiB
TypeScript

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()
})
})