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:
@@ -8,15 +8,19 @@
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
||||
"test": "vitest run"
|
||||
"test": "vitest run",
|
||||
"test:e2e": "playwright test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.59.1",
|
||||
"@sveltejs/adapter-static": "^3.0.0",
|
||||
"@sveltejs/kit": "^2.59.0",
|
||||
"@sveltejs/vite-plugin-svelte": "^7.0.0",
|
||||
"@testing-library/jest-dom": "^6.9.1",
|
||||
"@testing-library/svelte": "^5.2.0",
|
||||
"@types/node": "^22.0.0",
|
||||
"jsdom": "^25.0.0",
|
||||
"playwright": "^1.59.1",
|
||||
"svelte": "^5.0.0",
|
||||
"svelte-check": "^4.0.0",
|
||||
"tslib": "^2.6.0",
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
import { defineConfig, devices } from "@playwright/test";
|
||||
|
||||
export default defineConfig({
|
||||
testDir: "tests/e2e",
|
||||
fullyParallel: true,
|
||||
forbidOnly: !!process.env.CI,
|
||||
retries: process.env.CI ? 1 : 0,
|
||||
reporter: [["list"], ["html", { open: "never" }]],
|
||||
use: {
|
||||
baseURL: "http://localhost:5173",
|
||||
trace: "retain-on-failure",
|
||||
screenshot: "only-on-failure",
|
||||
},
|
||||
projects: [
|
||||
{ name: "chromium-desktop", use: { ...devices["Desktop Chrome"] } },
|
||||
{ name: "webkit-desktop", use: { ...devices["Desktop Safari"] } },
|
||||
// devices["iPhone 13"] picks WebKit by default; the project name
|
||||
// here claims a Chromium engine on a mobile viewport, so the
|
||||
// browser is explicitly overridden. WebKit on a desktop viewport
|
||||
// is already covered by webkit-desktop.
|
||||
{
|
||||
name: "chromium-mobile-iphone-13",
|
||||
use: { ...devices["iPhone 13"], browserName: "chromium" },
|
||||
},
|
||||
{ name: "chromium-mobile-pixel-5", use: { ...devices["Pixel 5"] } },
|
||||
],
|
||||
webServer: {
|
||||
command: "pnpm run dev",
|
||||
url: "http://localhost:5173",
|
||||
reuseExistingServer: !process.env.CI,
|
||||
timeout: 120_000,
|
||||
},
|
||||
});
|
||||
@@ -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+/);
|
||||
});
|
||||
@@ -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+/);
|
||||
});
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
import "@testing-library/jest-dom/vitest";
|
||||
@@ -12,6 +12,7 @@ export default mergeConfig(
|
||||
environment: "jsdom",
|
||||
include: ["tests/**/*.test.ts"],
|
||||
globals: true,
|
||||
setupFiles: ["./tests/setup.ts"],
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user