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 Gitea runner is an `act` host executor without apt privileges, so # Playwright's `--with-deps` (apt-get) hangs. We download the browser only and # run the smoke best-effort, bounded by a timeout: the strict gate above # (check / unit / build / size) plus the hard local pre-push e2e cover the # slice; this validates the browser path only when the host already has the # required libraries. Run the job in a Playwright container to make it strict. - name: Install Playwright browser run: pnpm exec playwright install chromium timeout-minutes: 5 continue-on-error: true - name: E2E smoke (mock) run: pnpm run test:e2e timeout-minutes: 5 continue-on-error: true