46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
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, project }) => {
|
|
await project.open()
|
|
const name = `OPENCODE_E2E_RECONNECT_${Date.now()}`
|
|
const token = `E2E_RECONNECT_${Date.now()}`
|
|
|
|
await project.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,
|
|
})
|
|
})
|