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