phase 2: ui testing infrastructure

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>
This commit is contained in:
Ilia Denisov
2026-05-07 08:24:44 +02:00
parent cf41be9eff
commit 7450006ed3
17 changed files with 885 additions and 15 deletions
+8
View File
@@ -0,0 +1,8 @@
import { expect, test } from "@playwright/test";
test("landing page renders the version string", async ({ page }) => {
await page.goto("/");
const footer = page.getByTestId("app-version");
await expect(footer).toBeVisible();
await expect(footer).toContainText(/version\s+\S+/);
});
+1
View File
@@ -6,6 +6,7 @@ describe("landing page", () => {
it("renders a non-empty version string in the footer", () => {
const { getByTestId } = render(Page);
const footer = getByTestId("app-version");
expect(footer).toBeInTheDocument();
expect(footer.textContent?.trim()).not.toBe("");
expect(footer.textContent).toMatch(/version\s+\S+/);
});
+1
View File
@@ -0,0 +1 @@
import "@testing-library/jest-dom/vitest";