summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e
diff options
context:
space:
mode:
authorShoubhit Dash <[email protected]>2026-04-03 20:06:33 +0530
committerGitHub <[email protected]>2026-04-03 14:36:33 +0000
commit263dcf75b548810a149f08ea5e32e0f6754128d5 (patch)
treea97b0608d780f813806221c4e131840de6320797 /packages/app/e2e
parent7994dce0f20d0411689d4ef927be8f95f5cf508e (diff)
downloadopencode-263dcf75b548810a149f08ea5e32e0f6754128d5.tar.gz
opencode-263dcf75b548810a149f08ea5e32e0f6754128d5.zip
fix: restore prompt focus after footer selection (#20841)
Diffstat (limited to 'packages/app/e2e')
-rw-r--r--packages/app/e2e/prompt/prompt-footer-focus.spec.ts88
1 files changed, 88 insertions, 0 deletions
diff --git a/packages/app/e2e/prompt/prompt-footer-focus.spec.ts b/packages/app/e2e/prompt/prompt-footer-focus.spec.ts
new file mode 100644
index 000000000..4609f4b3d
--- /dev/null
+++ b/packages/app/e2e/prompt/prompt-footer-focus.spec.ts
@@ -0,0 +1,88 @@
+import type { Locator, Page } from "@playwright/test"
+import { test, expect } from "../fixtures"
+import { promptAgentSelector, promptModelSelector, promptSelector } from "../selectors"
+
+type Probe = {
+ agent?: string
+ model?: { providerID: string; modelID: string; name?: string }
+ models?: Array<{ providerID: string; modelID: string; name: string }>
+ agents?: Array<{ name: string }>
+}
+
+async function probe(page: Page): Promise<Probe | null> {
+ return page.evaluate(() => {
+ const win = window as Window & {
+ __opencode_e2e?: {
+ model?: {
+ current?: Probe
+ }
+ }
+ }
+ return win.__opencode_e2e?.model?.current ?? null
+ })
+}
+
+async function state(page: Page) {
+ const value = await probe(page)
+ if (!value) throw new Error("Failed to resolve model selection probe")
+ return value
+}
+
+async function ready(page: Page) {
+ const prompt = page.locator(promptSelector)
+ await prompt.click()
+ await expect(prompt).toBeFocused()
+ await prompt.pressSequentially("focus")
+ return prompt
+}
+
+async function body(prompt: Locator) {
+ return prompt.evaluate((el) => (el as HTMLElement).innerText)
+}
+
+test("agent select returns focus to the prompt", async ({ page, gotoSession }) => {
+ await gotoSession()
+
+ const prompt = await ready(page)
+
+ const info = await state(page)
+ const next = info.agents?.map((item) => item.name).find((name) => name !== info.agent)
+ test.skip(!next, "only one agent available")
+ if (!next) return
+
+ await page.locator(`${promptAgentSelector} [data-slot="select-select-trigger"]`).first().click()
+
+ const item = page.locator('[data-slot="select-select-item"]').filter({ hasText: next }).first()
+ await expect(item).toBeVisible()
+ await item.click({ force: true })
+
+ await expect(page.locator(`${promptAgentSelector} [data-slot="select-select-trigger-value"]`).first()).toHaveText(
+ next,
+ )
+ await expect(prompt).toBeFocused()
+ await prompt.pressSequentially(" agent")
+ await expect.poll(() => body(prompt)).toContain("focus agent")
+})
+
+test("model select returns focus to the prompt", async ({ page, gotoSession }) => {
+ await gotoSession()
+
+ const prompt = await ready(page)
+
+ const info = await state(page)
+ const key = info.model ? `${info.model.providerID}:${info.model.modelID}` : null
+ const next = info.models?.find((item) => `${item.providerID}:${item.modelID}` !== key)
+ test.skip(!next, "only one model available")
+ if (!next) return
+
+ await page.locator(`${promptModelSelector} [data-action="prompt-model"]`).first().click()
+
+ const item = page.locator(`[data-slot="list-item"][data-key="${next.providerID}:${next.modelID}"]`).first()
+ await expect(item).toBeVisible()
+ await item.click({ force: true })
+
+ await expect(page.locator(`${promptModelSelector} [data-action="prompt-model"] span`).first()).toHaveText(next.name)
+ await expect(prompt).toBeFocused()
+ await prompt.pressSequentially(" model")
+ await expect.poll(() => body(prompt)).toContain("focus model")
+})