summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/prompt
diff options
context:
space:
mode:
authorFilip <[email protected]>2026-01-30 19:04:02 +0100
committerGitHub <[email protected]>2026-01-30 18:04:02 +0000
commitf48e2e56c95a7b96648176f1f783929dc4f33b37 (patch)
tree106a32d8955e3ec5f10b80d1d6dbbae01d22626a /packages/app/e2e/prompt
parentfe66ca163cbb9d689cf296c4c2f7a63414c1cf45 (diff)
downloadopencode-f48e2e56c95a7b96648176f1f783929dc4f33b37.tar.gz
opencode-f48e2e56c95a7b96648176f1f783929dc4f33b37.zip
test(app): change language test (#11295)
Diffstat (limited to 'packages/app/e2e/prompt')
-rw-r--r--packages/app/e2e/prompt/context.spec.ts45
-rw-r--r--packages/app/e2e/prompt/prompt-mention.spec.ts26
-rw-r--r--packages/app/e2e/prompt/prompt-slash-open.spec.ts22
-rw-r--r--packages/app/e2e/prompt/prompt.spec.ts62
4 files changed, 155 insertions, 0 deletions
diff --git a/packages/app/e2e/prompt/context.spec.ts b/packages/app/e2e/prompt/context.spec.ts
new file mode 100644
index 000000000..f0f3f073a
--- /dev/null
+++ b/packages/app/e2e/prompt/context.spec.ts
@@ -0,0 +1,45 @@
+import { test, expect } from "../fixtures"
+import { promptSelector } from "../utils"
+
+test("context panel can be opened from the prompt", async ({ page, sdk, gotoSession }) => {
+ const title = `e2e smoke context ${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 sdk.session.promptAsync({
+ sessionID,
+ noReply: true,
+ parts: [
+ {
+ type: "text",
+ text: "seed context",
+ },
+ ],
+ })
+
+ await expect
+ .poll(async () => {
+ const messages = await sdk.session.messages({ sessionID, limit: 1 }).then((r) => r.data ?? [])
+ return messages.length
+ })
+ .toBeGreaterThan(0)
+
+ await gotoSession(sessionID)
+
+ const contextButton = page
+ .locator('[data-component="button"]')
+ .filter({ has: page.locator('[data-component="progress-circle"]').first() })
+ .first()
+
+ await expect(contextButton).toBeVisible()
+ await contextButton.click()
+
+ const tabs = page.locator('[data-component="tabs"][data-variant="normal"]')
+ await expect(tabs.getByRole("tab", { name: "Context" })).toBeVisible()
+ } finally {
+ await sdk.session.delete({ sessionID }).catch(() => undefined)
+ }
+})
diff --git a/packages/app/e2e/prompt/prompt-mention.spec.ts b/packages/app/e2e/prompt/prompt-mention.spec.ts
new file mode 100644
index 000000000..85acb4c28
--- /dev/null
+++ b/packages/app/e2e/prompt/prompt-mention.spec.ts
@@ -0,0 +1,26 @@
+import { test, expect } from "../fixtures"
+import { promptSelector } from "../utils"
+
+test("smoke @mention inserts file pill token", async ({ page, gotoSession }) => {
+ await gotoSession()
+
+ await page.locator(promptSelector).click()
+ const sep = process.platform === "win32" ? "\\" : "/"
+ const file = ["packages", "app", "package.json"].join(sep)
+ const filePattern = /packages[\\/]+app[\\/]+\s*package\.json/
+
+ await page.keyboard.type(`@${file}`)
+
+ const suggestion = page.getByRole("button", { name: filePattern }).first()
+ await expect(suggestion).toBeVisible()
+ await suggestion.hover()
+
+ await page.keyboard.press("Tab")
+
+ const pill = page.locator(`${promptSelector} [data-type="file"]`).first()
+ await expect(pill).toBeVisible()
+ await expect(pill).toHaveAttribute("data-path", filePattern)
+
+ await page.keyboard.type(" ok")
+ await expect(page.locator(promptSelector)).toContainText("ok")
+})
diff --git a/packages/app/e2e/prompt/prompt-slash-open.spec.ts b/packages/app/e2e/prompt/prompt-slash-open.spec.ts
new file mode 100644
index 000000000..3e769e330
--- /dev/null
+++ b/packages/app/e2e/prompt/prompt-slash-open.spec.ts
@@ -0,0 +1,22 @@
+import { test, expect } from "../fixtures"
+import { promptSelector } from "../utils"
+
+test("smoke /open opens file picker dialog", async ({ page, gotoSession }) => {
+ await gotoSession()
+
+ await page.locator(promptSelector).click()
+ await page.keyboard.type("/open")
+
+ const command = page.locator('[data-slash-id="file.open"]')
+ await expect(command).toBeVisible()
+ await command.hover()
+
+ await page.keyboard.press("Enter")
+
+ 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/prompt/prompt.spec.ts b/packages/app/e2e/prompt/prompt.spec.ts
new file mode 100644
index 000000000..b58e5e296
--- /dev/null
+++ b/packages/app/e2e/prompt/prompt.spec.ts
@@ -0,0 +1,62 @@
+import { test, expect } from "../fixtures"
+import { promptSelector } from "../utils"
+
+function sessionIDFromUrl(url: string) {
+ const match = /\/session\/([^/?#]+)/.exec(url)
+ return match?.[1]
+}
+
+test("can send a prompt and receive a reply", async ({ page, sdk, gotoSession }) => {
+ test.setTimeout(120_000)
+
+ const pageErrors: string[] = []
+ const onPageError = (err: Error) => {
+ pageErrors.push(err.message)
+ }
+ page.on("pageerror", onPageError)
+
+ await gotoSession()
+
+ const token = `E2E_OK_${Date.now()}`
+
+ const prompt = page.locator(promptSelector)
+ await prompt.click()
+ await page.keyboard.type(`Reply with exactly: ${token}`)
+ await page.keyboard.press("Enter")
+
+ await expect(page).toHaveURL(/\/session\/[^/?#]+/, { timeout: 30_000 })
+
+ const sessionID = (() => {
+ const id = sessionIDFromUrl(page.url())
+ if (!id) throw new Error(`Failed to parse session id from url: ${page.url()}`)
+ return id
+ })()
+
+ try {
+ await expect
+ .poll(
+ async () => {
+ const messages = await sdk.session.messages({ sessionID, limit: 50 }).then((r) => r.data ?? [])
+ return messages
+ .filter((m) => m.info.role === "assistant")
+ .flatMap((m) => m.parts)
+ .filter((p) => p.type === "text")
+ .map((p) => p.text)
+ .join("\n")
+ },
+ { timeout: 90_000 },
+ )
+
+ .toContain(token)
+
+ const reply = page.locator('[data-slot="session-turn-summary-section"]').filter({ hasText: token }).first()
+ await expect(reply).toBeVisible({ timeout: 90_000 })
+ } finally {
+ page.off("pageerror", onPageError)
+ await sdk.session.delete({ sessionID }).catch(() => undefined)
+ }
+
+ if (pageErrors.length > 0) {
+ throw new Error(`Page error(s):\n${pageErrors.join("\n")}`)
+ }
+})