diff --git a/.gitea/workflows/ui-test.yaml b/.gitea/workflows/ui-test.yaml index fc3657a..ae54c63 100644 --- a/.gitea/workflows/ui-test.yaml +++ b/.gitea/workflows/ui-test.yaml @@ -1,8 +1,8 @@ name: Tests ยท UI # Hermetic UI checks: type-check, Vitest unit tests, production build with a -# bundle-size budget, and a Playwright smoke against the in-memory mock transport -# (no backend/gateway/Postgres). The committed src/gen/ codegen is built, not +# bundle-size budget, and a Playwright smoke (Chromium + WebKit) against the in-memory +# mock transport (no backend/gateway/Postgres). The committed src/gen/ codegen is built, not # regenerated (the same model as the Go committed jet/fbs output). on: @@ -51,12 +51,15 @@ jobs: # The Playwright system libraries are provisioned once on the runner host # (`sudo npx playwright@ install-deps chromium`), so the job needs no - # apt and no sudo: it only downloads the browser binary into the runner cache - # (persisted by the host executor) and runs the smoke. The timeouts guard - # against a future hang. Keep this in lockstep with @playwright/test in - # package.json โ€” re-run install-deps on the host after a major bump. - - name: Install Playwright browser - run: pnpm exec playwright install chromium + # apt and no sudo: it only downloads the browser binaries into the runner cache + # (persisted by the host executor) and runs the suite. WebKit's Debian build + # bundles most of its own libraries and runs headless without extra host deps; if + # a runner ever lacks one, provision it once on the host with + # `sudo npx playwright install-deps webkit`. The timeouts guard against a future + # hang. Keep this in lockstep with @playwright/test in package.json โ€” re-run + # install-deps on the host after a major bump. + - name: Install Playwright browsers + run: pnpm exec playwright install chromium webkit timeout-minutes: 5 - name: E2E smoke (mock) diff --git a/ui/playwright.config.ts b/ui/playwright.config.ts index bac1679..cc28f70 100644 --- a/ui/playwright.config.ts +++ b/ui/playwright.config.ts @@ -18,5 +18,12 @@ export default defineConfig({ reuseExistingServer: !process.env.CI, timeout: 60_000, }, - projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }], + // Run the same hermetic specs in Chromium and WebKit (Safari's engine) so the UI is + // exercised in both rendering/JS engines. Note: desktop WebKit on Linux does not + // reproduce iOS Safari's text auto-inflation, so the `text-size-adjust` guard in + // app.css is not regression-covered here โ€” but engine-level CSS/JS differences are. + projects: [ + { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, + { name: 'webkit', use: { ...devices['Desktop Safari'] } }, + ], });