Files
dance-lessons-coach/frontend/tests/e2e/app-footer.spec.ts
Gabriel Radureau a2beadc458
Some checks failed
CI/CD Pipeline / Build Docker Cache (push) Successful in 9s
CI/CD Pipeline / CI Pipeline (push) Failing after 4m48s
CI/CD Pipeline / Trigger Docker Push (push) Has been skipped
feat(server): /api/info aggregator + frontend version footer (#40)
Co-authored-by: Gabriel Radureau <arcodange@gmail.com>
Co-committed-by: Gabriel Radureau <arcodange@gmail.com>
2026-05-05 08:29:26 +02:00

68 lines
2.5 KiB
TypeScript

import { test, expect } from '@playwright/test'
// Both specs mock /api/info so they decouple from the dev-proxy plumbing.
// The integration with the real backend is covered by the BDD scenario in
// features/info/info.feature (server-side, no frontend proxy in the loop).
test('home page footer shows version, commit and uptime', async ({ page }) => {
await page.route('**/api/info', (route) => {
route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
version: '1.4.0',
commit_short: '4a3f1bb',
build_date: '2026-05-05T00:00:00Z',
uptime_seconds: 8042,
cache_enabled: true,
healthz_status: 'healthy',
}),
})
})
await page.goto('/')
// Footer is mounted globally via layouts/default.vue
await expect(page.getByTestId('app-footer')).toBeVisible()
// The PR #32 lesson: assert content, not just visibility.
// Without the regex check the test would PASS even if the footer rendered the
// pending placeholder ("v?") indefinitely.
await expect(page.getByTestId('app-footer-info')).toBeVisible()
const versionLocator = page.getByTestId('app-footer-version')
await expect(versionLocator).toBeVisible()
await expect(versionLocator).toHaveText(/^v\d+\.\d+\.\d+$/)
// Commit and uptime should be present and non-empty.
await expect(page.getByTestId('app-footer-commit')).not.toBeEmpty()
await expect(page.getByTestId('app-footer-uptime')).not.toBeEmpty()
await page.screenshot({
path: 'tests/e2e/screenshots/app-footer-shows-version-commit-uptime.png',
fullPage: true,
})
})
// Regression spec: documents the expected error UX so we don't ship a silent failure.
// Routes /api/info to a 502 mock so the test is reproducible regardless of backend.
test('home page footer surfaces info endpoint errors gracefully', async ({ page }) => {
await page.route('**/api/info', (route) => {
route.fulfill({
status: 502,
contentType: 'application/json',
body: JSON.stringify({ error: 'simulated_backend_down' }),
})
})
await page.goto('/')
// Footer must NOT crash the page
await expect(page.getByTestId('app-footer')).toBeVisible()
await expect(page.getByTestId('app-footer-error')).toBeVisible()
// The error placeholder should NOT contain a real version pattern
await expect(page.getByTestId('app-footer-info')).not.toBeVisible()
await page.screenshot({
path: 'tests/e2e/screenshots/app-footer-surfaces-info-endpoint-errors-gracefully.png',
fullPage: true,
})
})