diff --git a/packages/app/e2e/navigation.spec.ts b/packages/app/e2e/navigation.spec.ts new file mode 100644 index 0000000000..2783c5222c --- /dev/null +++ b/packages/app/e2e/navigation.spec.ts @@ -0,0 +1,24 @@ +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("project route redirects to /session", async ({ page }) => { + const directory = await getWorktree() + const slug = base64Encode(directory) + + await page.goto(`/${slug}`) + await expect(page).toHaveURL(new RegExp(`/${slug}/session`)) + await expect(page.locator('[data-component="prompt-input"]')).toBeVisible() +}) diff --git a/packages/app/e2e/palette.spec.ts b/packages/app/e2e/palette.spec.ts new file mode 100644 index 0000000000..0629456294 --- /dev/null +++ b/packages/app/e2e/palette.spec.ts @@ -0,0 +1,34 @@ +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 +} + +const mod = process.platform === "darwin" ? "Meta" : "Control" + +test("search palette opens and closes", async ({ page }) => { + const directory = await getWorktree() + const slug = base64Encode(directory) + + await page.goto(`/${slug}/session`) + await expect(page.locator('[data-component="prompt-input"]')).toBeVisible() + + await page.keyboard.press(`${mod}+P`) + + const dialog = page.getByRole("dialog") + await expect(dialog).toBeVisible() + await expect(dialog.getByRole("textbox").first()).toBeVisible() + + await page.keyboard.press("Escape") + await expect(dialog).toHaveCount(0) +}) diff --git a/packages/app/e2e/terminal.spec.ts b/packages/app/e2e/terminal.spec.ts new file mode 100644 index 0000000000..9bb9947fe3 --- /dev/null +++ b/packages/app/e2e/terminal.spec.ts @@ -0,0 +1,33 @@ +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("terminal panel can be toggled", async ({ page }) => { + const directory = await getWorktree() + const slug = base64Encode(directory) + + await page.goto(`/${slug}/session`) + await expect(page.locator('[data-component="prompt-input"]')).toBeVisible() + + const terminal = page.locator('[data-component="terminal"]') + const initiallyOpen = await terminal.isVisible() + if (initiallyOpen) { + await page.keyboard.press("Control+Backquote") + await expect(terminal).toHaveCount(0) + } + + await page.keyboard.press("Control+Backquote") + await expect(terminal).toBeVisible() +})