Vitest + @testing-library/jest-dom matchers wired through tests/setup.ts. Playwright with four projects: chromium-desktop, webkit-desktop, chromium-mobile-iphone-13, chromium-mobile-pixel-5; traces and screenshots retained on failure. .gitea/workflows/ui-test.yaml runs Tier 1 on every push and pull request: monorepo Go service tests (backend with -p 1 to dodge testcontainer contention; gateway, game, every pkg/<name> module), pnpm install --frozen-lockfile, playwright install --with-deps, pnpm test, pnpm exec playwright test. Uploads playwright-report and test-results on failure. Integration suite stays gated behind make -C integration integration; deprecated client/ excluded. .gitea/workflows/ui-release.yaml mirrors Tier 1 on v* tag push and keeps commented placeholders for visual regression (Phase 33) and macOS iOS smoke (Phase 32). ui/docs/testing.md documents both tiers and the local invocations that mirror what CI runs. ui/PLAN.md Phase 2 marked done; Phase 3 gains a bullet to extend the go test command with ./ui/core/...; Phase 36 has the renamed release workflow path. tools/local-ci/ ships a self-contained docker-compose for verifying workflows against a local Gitea + arm64 act_runner before pushing to a real instance. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
3.4 KiB
UI Testing Tiers
UI client test toolchain. Project-wide testing layers (service /
inter-service / system) live in ../../docs/TESTING.md;
this doc only covers the UI-specific tiers added in Phase 2 of
../PLAN.md.
Tier 1 — per-PR
Triggered by .gitea/workflows/ui-test.yaml on every push and pull
request that touches ui/**, backend/**, gateway/**, game/**,
pkg/**, client/**, go.work, or go.work.sum. Linux runner only.
Runs:
-
go testover the monorepo Go modules, excluding two areas:integration/— needs Docker + testcontainers and is the project'smake -C integration integrationgate.client/— the deprecated Fyne client (see../PLAN.md§74) is frozen; its tests are not run in CI.
The
pkg/<name>/modules are listed one by one in the workflow because they are independent go.work modules and./pkg/...does not recurse into separate modules. The exact command lives in.gitea/workflows/ui-test.yaml. -
pnpm test(Vitest +@testing-library/svelte+@testing-library/jest-dom) — component / unit tests underui/frontend/tests/**/*.test.ts. -
pnpm exec playwright test— end-to-end smoke againstpnpm run devon port 5173. Four projects:chromium-desktop(Desktop Chrome)webkit-desktop(Desktop Safari)chromium-mobile-iphone-13(iPhone 13 viewport, Chromium engine)chromium-mobile-pixel-5(Pixel 5 viewport, Chromium engine)
Playwright traces and screenshots are retained on failure and uploaded
as Gitea Actions artefacts (playwright-report and playwright-traces,
14-day retention).
Tier 2 — release
Triggered by .gitea/workflows/ui-release.yaml on tag push (v*).
Currently mirrors the Tier 1 step set; the dedicated release-only
checks land in later phases:
- Visual regression baseline check — Phase 33. Snapshots live in
ui/frontend/tests/__snapshots__/until the project shifts to Argos or another visual-diff service. - iOS smoke (Capacitor + Appium) — Phase 32. Runs on a
macos-13runner once the Capacitor mobile wrapper exists.
Both blocks are present as commented sections in
.gitea/workflows/ui-release.yaml with the phase number that
re-enables them.
Local execution
From ui/frontend/:
pnpm test # Vitest
pnpm exec playwright install # one-time
pnpm exec playwright test # all projects
pnpm exec playwright test --project=chromium-desktop
pnpm exec playwright show-report # open last HTML report
From the repository root, the same scope CI uses (backend serially because most packages spawn their own Postgres testcontainer and parallel bootstraps starve each other on constrained runners):
go test -count=1 -p 1 ./backend/...
go test -count=1 \
./gateway/... ./game/... \
./pkg/calc/... ./pkg/connector/... ./pkg/cronutil/... \
./pkg/error/... ./pkg/geoip/... ./pkg/model/... \
./pkg/postgres/... ./pkg/redisconn/... ./pkg/schema/... \
./pkg/storage/... ./pkg/transcoder/... ./pkg/util/...
CI dry-run with act
Until the Gitea Actions runner is wired up, the workflow is exercised
locally with act:
act -W .gitea/workflows/ui-test.yaml --container-architecture linux/amd64
act reads the workflow as GitHub Actions; the format is
intentionally compatible.