summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/terminal
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-13 08:56:48 -0500
committerGitHub <[email protected]>2026-03-13 08:56:48 -0500
commitc9e9dbeee1ceb5af3d1b1ce292317390286fe7a0 (patch)
treee679df64078db58eadb3cba2d1ac65b170175360 /packages/app/e2e/terminal
parentb88b323049ed7ad7bf41fbec6ce66247ec4047ab (diff)
downloadopencode-c9e9dbeee1ceb5af3d1b1ce292317390286fe7a0.tar.gz
opencode-c9e9dbeee1ceb5af3d1b1ce292317390286fe7a0.zip
fix(app): terminal cloning without retry (#17354)
Diffstat (limited to 'packages/app/e2e/terminal')
-rw-r--r--packages/app/e2e/terminal/terminal-reconnect.spec.ts46
1 files changed, 46 insertions, 0 deletions
diff --git a/packages/app/e2e/terminal/terminal-reconnect.spec.ts b/packages/app/e2e/terminal/terminal-reconnect.spec.ts
new file mode 100644
index 000000000..b03ed8956
--- /dev/null
+++ b/packages/app/e2e/terminal/terminal-reconnect.spec.ts
@@ -0,0 +1,46 @@
+import type { Page } from "@playwright/test"
+import { disconnectTerminal, runTerminal, terminalConnects, waitTerminalReady } from "../actions"
+import { test, expect } from "../fixtures"
+import { terminalSelector } from "../selectors"
+import { terminalToggleKey } from "../utils"
+
+async function open(page: Page) {
+ const term = page.locator(terminalSelector).first()
+ const visible = await term.isVisible().catch(() => false)
+ if (!visible) await page.keyboard.press(terminalToggleKey)
+ await waitTerminalReady(page, { term })
+ return term
+}
+
+test("terminal reconnects without replacing the pty", async ({ page, withProject }) => {
+ await withProject(async ({ gotoSession }) => {
+ const name = `OPENCODE_E2E_RECONNECT_${Date.now()}`
+ const token = `E2E_RECONNECT_${Date.now()}`
+
+ await gotoSession()
+
+ const term = await open(page)
+ const id = await term.getAttribute("data-pty-id")
+ if (!id) throw new Error("Active terminal missing data-pty-id")
+
+ const prev = await terminalConnects(page, { term })
+
+ await runTerminal(page, {
+ term,
+ cmd: `export ${name}=${token}; echo ${token}`,
+ token,
+ })
+
+ await disconnectTerminal(page, { term })
+
+ await expect.poll(() => terminalConnects(page, { term }), { timeout: 15_000 }).toBeGreaterThan(prev)
+ await expect.poll(() => term.getAttribute("data-pty-id"), { timeout: 5_000 }).toBe(id)
+
+ await runTerminal(page, {
+ term,
+ cmd: `echo $${name}`,
+ token,
+ timeout: 15_000,
+ })
+ })
+})