ci: test production frontend in browser
CI and Deploy / test (push) Successful in 5m36s
CI and Deploy / deploy (push) Failing after 7m15s

This commit is contained in:
cesnimda
2026-08-29 02:25:11 +02:00
parent a3b4941447
commit eb6db7d26e
3 changed files with 8 additions and 3 deletions
+4
View File
@@ -173,6 +173,10 @@ jobs:
- name: Test browser smoke flows
working-directory: job-tracker-ui
env:
# Exercise the deployable frontend and avoid Turbopack's persistence crashes on
# this runner's slow Docker volume.
PLAYWRIGHT_STATIC_EXPORT: 'true'
# This self-hosted runner has twice corrupted Playwright's installed JS/browser
# payload (invalid control bytes followed by SIGSEGV/139). Retry the complete
# suite once from a verified, clean install. The retry is intentionally bounded;
+1
View File
@@ -21,6 +21,7 @@
- [x] Fixed fresh SQLite/MySQL startup ordering so the migration-owned UI-language column is not pre-created by schema reconciliation, then proved the full fresh-database path in Playwright.
- [x] Visually verified the revised builder at 375 px, 768 px, and 1440 px in light/dark mode, including multiple expanded sections, add-content focus return, Customize/AI surfaces, responsive overflow, multi-page preview and searchable PDF export.
- [x] Updated the full browser suite for the consolidated Workspace and revised Builder controls, then fixed CV creation to atomically persist the document and initial history revision under concurrent autosave load; all 10 Playwright flows pass.
- [x] Moved CI Playwright verification from the runner-fragile Turbopack development server to the production static build and tightened ambiguous workspace field locators.
- [x] Rechecked branch/status, recent CV work, existing tests/build tooling, and current builder architecture.
- [x] Traced builder persistence, shared preview/PDF rendering, AI endpoint, extraction pipeline, confidence/diff review, and reference CV assets.
- [x] Rendered and inspected the supplied two-page reference PDF and reviewed its HTML typography/theme tokens without modifying the originals.
+3 -3
View File
@@ -239,11 +239,11 @@ test("the dedicated application workspace survives deep links, long data and uns
const workspaceNav = page.getByRole("tablist", { name: "Workspace sections" });
await workspaceNav.getByRole("tab", { name: "Cover Letter", exact: true }).click();
await expect(page).toHaveURL(new RegExp(`/jobs/${job.id}\\?section=cover-letter$`));
await page.getByLabel("Application answer").fill("A reviewed answer that must not be lost.");
await page.getByLabel("Application answer", { exact: true }).fill("A reviewed answer that must not be lost.");
await workspaceNav.getByRole("tab", { name: "Analysis", exact: true }).click();
await expect(page.getByRole("dialog", { name: "Unsaved application changes" })).toBeVisible();
await page.getByRole("button", { name: "Keep editing" }).click();
await expect(page.getByLabel("Application answer")).toHaveValue("A reviewed answer that must not be lost.");
await expect(page.getByLabel("Application answer", { exact: true })).toHaveValue("A reviewed answer that must not be lost.");
await page.getByRole("button", { name: "Save application drafts" }).click();
await expect(page.getByText("Unsaved changes")).toHaveCount(0);
@@ -258,7 +258,7 @@ test("the dedicated application workspace survives deep links, long data and uns
await page.evaluate(() => window.localStorage.setItem("jobtracker.themeMode", "dark"));
await page.reload();
await expect(page.getByLabel("Application answer")).toHaveValue("A reviewed answer that must not be lost.");
await expect(page.getByLabel("Application answer", { exact: true })).toHaveValue("A reviewed answer that must not be lost.");
await expect(page.locator("html")).toHaveAttribute("data-color-scheme", "dark");
for (const width of [375, 768, 1440]) {