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 # regenerated (the same model as the Go committed jet/fbs output). on: push: paths: - 'ui/**' - '.gitea/workflows/ui-test.yaml' pull_request: paths: - 'ui/**' - '.gitea/workflows/ui-test.yaml' jobs: test: runs-on: ubuntu-latest defaults: run: shell: bash working-directory: ui steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Node uses: actions/setup-node@v4 with: node-version: 22 - name: Install pnpm run: npm install -g pnpm@11.0.9 - name: Install deps run: pnpm install --frozen-lockfile - name: Type-check run: pnpm run check - name: Unit tests run: pnpm run test:unit - name: Build run: pnpm run build - name: Bundle-size budget run: node scripts/bundle-size.mjs # 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 timeout-minutes: 5 - name: E2E smoke (mock) run: pnpm run test:e2e timeout-minutes: 5