diff --git a/packages/app/e2e/home.spec.ts b/packages/app/e2e/home.spec.ts index ff57923d5..29a070609 100644 --- a/packages/app/e2e/home.spec.ts +++ b/packages/app/e2e/home.spec.ts @@ -1,6 +1,24 @@ import { test, expect } from "@playwright/test" -test("home shows recent projects header", async ({ page }) => { +test("home renders and shows an open project entrypoint", async ({ page }) => { await page.goto("/") - await expect(page.getByText("Recent projects")).toBeVisible() + + await expect(page.getByText("Recent projects").or(page.getByText("No recent projects"))).toBeVisible() + await expect(page.getByRole("button", { name: "Open project" }).first()).toBeVisible() +}) + +test("server picker dialog opens from home", async ({ page }) => { + const host = process.env.PLAYWRIGHT_SERVER_HOST ?? "localhost" + const port = process.env.PLAYWRIGHT_SERVER_PORT ?? "4096" + const name = `${host}:${port}` + + await page.goto("/") + + const trigger = page.getByRole("button", { name }) + await expect(trigger).toBeVisible() + await trigger.click() + + const dialog = page.getByRole("dialog", { name: "Servers" }) + await expect(dialog).toBeVisible() + await expect(dialog.getByPlaceholder("Search servers")).toBeVisible() }) diff --git a/packages/app/e2e/session.spec.ts b/packages/app/e2e/session.spec.ts new file mode 100644 index 000000000..e1ca12449 --- /dev/null +++ b/packages/app/e2e/session.spec.ts @@ -0,0 +1,38 @@ +import { test, expect } from "@playwright/test" +import { createOpencodeClient } from "@opencode-ai/sdk/v2/client" +import { base64Encode } from "@opencode-ai/util/encode" + +const host = process.env.PLAYWRIGHT_SERVER_HOST ?? "localhost" +const port = process.env.PLAYWRIGHT_SERVER_PORT ?? "4096" +const url = `http://${host}:${port}` + +async function getWorktree() { + const sdk = createOpencodeClient({ baseUrl: url, throwOnError: true }) + const result = await sdk.path.get() + const data = result.data + if (!data?.worktree) throw new Error(`Failed to resolve a worktree from ${url}/path`) + return data.worktree +} + +test("can open an existing session and type into the prompt", async ({ page }) => { + const directory = await getWorktree() + const sdk = createOpencodeClient({ baseUrl: url, directory, throwOnError: true }) + const title = `e2e smoke ${Date.now()}` + const created = await sdk.session.create({ title }).then((r) => r.data) + + if (!created?.id) throw new Error("Session create did not return an id") + const sessionID = created.id + + try { + await page.goto(`/${base64Encode(directory)}/session/${sessionID}`) + + const prompt = page.locator('[data-component="prompt-input"]') + await expect(prompt).toBeVisible() + + await prompt.click() + await page.keyboard.type("hello from e2e") + await expect(prompt).toContainText("hello from e2e") + } finally { + await sdk.session.delete({ sessionID }).catch(() => undefined) + } +})