|
| 1 | +import { mkdir } from "node:fs/promises"; |
| 2 | +import { test, expect } from "@playwright/test"; |
| 3 | + |
| 4 | +test("model-free first run creates and retains project, issue, and discussion", async ({ page }) => { |
| 5 | + const errors = []; |
| 6 | + page.on("pageerror", (error) => errors.push(error.message)); |
| 7 | + await page.setViewportSize({ width: 1440, height: 900 }); |
| 8 | + await page.goto("/#/commons"); |
| 9 | + await page.getByRole("group", { name: "Project sections" }) |
| 10 | + .getByRole("button", { name: "Projects", exact: true }).click(); |
| 11 | + const form = page.getByRole("region", { name: "New project" }); |
| 12 | + await form.getByLabel("Project address").fill("browser-first-run"); |
| 13 | + await form.getByLabel("Project name").fill("Browser First Run"); |
| 14 | + await form.getByLabel("Description").fill("A disposable project created without model inference."); |
| 15 | + await form.getByRole("button", { name: "Create project" }).click(); |
| 16 | + await expect(page).toHaveURL(/#\/commons\/browser-first-run$/); |
| 17 | + await expect(page.getByRole("heading", { name: "Browser First Run", exact: true })).toBeVisible(); |
| 18 | + await page.getByRole("group", { name: "Project sections" }) |
| 19 | + .getByRole("button", { name: /Issues/ }).click(); |
| 20 | + await page.getByLabel("Issue title").fill("Handle empty input"); |
| 21 | + await page.getByLabel("Problem and expected behavior") |
| 22 | + .fill("An empty argument should return a bounded error rather than throwing."); |
| 23 | + await page.getByRole("button", { name: "Open issue" }).click(); |
| 24 | + await expect(page.getByRole("heading", { name: /#1 Handle empty input/ })).toBeVisible(); |
| 25 | + await page.getByRole("button", { name: "Create task from issue" }).click(); |
| 26 | + await expect(page.getByRole("region", { name: "New task" })).toContainText("Issue #1: Handle empty input"); |
| 27 | + await expect(page.getByLabel("Task", { exact: true })) |
| 28 | + .toHaveValue("Investigate and resolve issue #1: Handle empty input"); |
| 29 | + await expect(page.getByRole("button", { name: "Run agents", exact: true })).toBeDisabled(); |
| 30 | + await page.getByRole("group", { name: "Project sections" }) |
| 31 | + .getByRole("button", { name: "Chat", exact: true }).click(); |
| 32 | + await page.getByLabel("Message", { exact: true }).fill("A model-free project discussion."); |
| 33 | + await page.getByRole("button", { name: "Send", exact: true }).click(); |
| 34 | + await expect(page.getByRole("region", { name: "Saved messages" })) |
| 35 | + .toContainText("A model-free project discussion."); |
| 36 | + if (process.env.CZ_CAPTURE_BROWSER === "1") { |
| 37 | + await mkdir("runtime/verification", { recursive: true }); |
| 38 | + await page.screenshot({ path: "runtime/verification/commons-first-run-desktop-2026-10-19.png" }); |
| 39 | + } |
| 40 | + await page.reload(); |
| 41 | + await expect(page.getByRole("heading", { name: "Browser First Run", exact: true })).toBeVisible(); |
| 42 | + await page.getByRole("group", { name: "Project sections" }) |
| 43 | + .getByRole("button", { name: "Chat", exact: true }).click(); |
| 44 | + await expect(page.getByRole("region", { name: "Saved messages" })) |
| 45 | + .toContainText("A model-free project discussion."); |
| 46 | + await page.getByRole("group", { name: "Project sections" }) |
| 47 | + .getByRole("button", { name: /Issues/ }).click(); |
| 48 | + await expect(page.getByRole("heading", { name: /#1 Handle empty input/ })).toBeVisible(); |
| 49 | + await page.setViewportSize({ width: 390, height: 844 }); |
| 50 | + expect(await page.evaluate(() => document.documentElement.scrollWidth <= document.documentElement.clientWidth)).toBe(true); |
| 51 | + if (process.env.CZ_CAPTURE_BROWSER === "1") { |
| 52 | + await page.screenshot({ path: "runtime/verification/commons-first-run-narrow-2026-10-19.png", fullPage: true }); |
| 53 | + } |
| 54 | + expect(errors).toEqual([]); |
| 55 | +}); |
0 commit comments