From db30ba9de94a245e672a84fa2e393f9989125088 Mon Sep 17 00:00:00 2001 From: ilia Date: Tue, 4 Aug 2026 23:13:48 -0400 Subject: [PATCH] Enable Sprint D e2e: API-seeded admin session, un-skip vitals/scroll. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Admin review smoke seeds localStorage from FastAPI login instead of the login form — fixes CI flakes on the shared runner. --- e2e/tests/admin.review-pages.spec.ts | 34 ++++++++++++++++++++----- e2e/tests/viewer.scroll-restore.spec.ts | 2 +- e2e/tests/viewer.web-vitals.spec.ts | 2 +- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/e2e/tests/admin.review-pages.spec.ts b/e2e/tests/admin.review-pages.spec.ts index d0fb192..a322eaa 100644 --- a/e2e/tests/admin.review-pages.spec.ts +++ b/e2e/tests/admin.review-pages.spec.ts @@ -1,28 +1,50 @@ +import { z } from 'zod'; import { test, expect } from '../fixtures'; -import { AdminLoginPage } from '../pages/AdminLoginPage'; import { BUDGET_MS, expectWithinBudget } from '../timing-budgets'; import { DEFAULT_ADMIN_BASE_URL } from '../env-defaults'; +const TokenResponse = z.object({ + access_token: z.string().min(1), + refresh_token: z.string().min(1), +}); + /** * FastAPI-admin UI smoke: core review workflows load without error. * Uses E2E_API_USERNAME/PASSWORD (admin FastAPI user — not NextAuth viewer creds). */ -test.describe.skip('admin review pages @smoke', () => { +test.describe('admin review pages @smoke', () => { const adminBaseUrl = process.env.PLAYKIT_ADMIN_BASE_URL || DEFAULT_ADMIN_BASE_URL; test('identify, auto-match, and approve pages load for admin', async ({ page, + api, timings, }) => { const username = process.env.E2E_API_USERNAME || ''; const password = process.env.E2E_API_PASSWORD || ''; test.skip(!username || !password, 'E2E_API_USERNAME/PASSWORD required for admin UI'); - const login = new AdminLoginPage(page, adminBaseUrl); - await timings.measure('admin_login', async () => { - await login.openLogin(); - await login.signIn(username, password); + const tokens = await api.post>('/api/v1/auth/login', { + body: { username, password }, + expectedStatus: 200, + schema: TokenResponse, + }); + + // Seed the admin SPA session (same keys as AuthContext) — more reliable than + // driving the login form on the shared CI runner. + await page.goto(`${adminBaseUrl}/login`); + await page.evaluate( + ({ access, refresh }) => { + localStorage.setItem('access_token', access); + localStorage.setItem('refresh_token', refresh); + }, + { + access: tokens.data.access_token, + refresh: tokens.data.refresh_token, + }, + ); + await page.goto(`${adminBaseUrl}/`); await expect(page.getByRole('button', { name: 'Logout' })).toBeVisible({ timeout: 30_000, }); diff --git a/e2e/tests/viewer.scroll-restore.spec.ts b/e2e/tests/viewer.scroll-restore.spec.ts index 66acf23..b750d00 100644 --- a/e2e/tests/viewer.scroll-restore.spec.ts +++ b/e2e/tests/viewer.scroll-restore.spec.ts @@ -1,7 +1,7 @@ import { test, expect } from '../fixtures'; import { BUDGET_MS, expectWithinBudget } from '../timing-budgets'; -test.describe.skip('gallery scroll restore @smoke', () => { +test.describe('gallery scroll restore @smoke', () => { test('closing photo modal restores scroll position', async ({ page, playkitConfig, timings }) => { await timings.measure('open_gallery', async () => { await page.goto(`${playkitConfig.baseUrl}/`); diff --git a/e2e/tests/viewer.web-vitals.spec.ts b/e2e/tests/viewer.web-vitals.spec.ts index 068a8ce..3a70438 100644 --- a/e2e/tests/viewer.web-vitals.spec.ts +++ b/e2e/tests/viewer.web-vitals.spec.ts @@ -7,7 +7,7 @@ import { readWebVitals, } from '../web-vitals-budgets'; -test.describe.skip('viewer web vitals @smoke', () => { +test.describe('viewer web vitals @smoke', () => { test.beforeEach(async ({ page }) => { await installWebVitalsCollector(page); });