terminal-hidden.spec.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { expect, test } from "@playwright/test"
  2. import { mockOpenCodeServer } from "../utils/mock-server"
  3. import { expectSessionTitle } from "../utils/waits"
  4. const directory = "C:/OpenCode/HiddenTerminalRegression"
  5. const projectID = "proj_hidden_terminal_regression"
  6. const sessionID = "ses_hidden_terminal_regression"
  7. const title = "Hidden terminal regression"
  8. test("unmounts the terminal panel while it is hidden", async ({ page }) => {
  9. await page.setViewportSize({ width: 1400, height: 900 })
  10. await mockOpenCodeServer(page, {
  11. directory,
  12. project: {
  13. id: projectID,
  14. worktree: directory,
  15. vcs: "git",
  16. name: "hidden-terminal-regression",
  17. time: { created: 1700000000000, updated: 1700000000000 },
  18. sandboxes: [],
  19. },
  20. provider: {
  21. all: [
  22. {
  23. id: "opencode",
  24. name: "OpenCode",
  25. models: { test: { id: "test", name: "Test", limit: { context: 200_000 } } },
  26. },
  27. ],
  28. connected: ["opencode"],
  29. default: { providerID: "opencode", modelID: "test" },
  30. },
  31. sessions: [
  32. {
  33. id: sessionID,
  34. slug: "hidden-terminal-regression",
  35. projectID,
  36. directory,
  37. title,
  38. version: "dev",
  39. time: { created: 1700000000000, updated: 1700000000000 },
  40. },
  41. ],
  42. pageMessages: () => ({ items: [] }),
  43. })
  44. await page.route("**/pty", (route) =>
  45. route.fulfill({
  46. status: 200,
  47. contentType: "application/json",
  48. body: JSON.stringify({ id: "pty_hidden_terminal", title: "Terminal 1" }),
  49. }),
  50. )
  51. await page.route("**/pty/pty_hidden_terminal", (route) =>
  52. route.fulfill({ status: 200, contentType: "application/json", body: "{}" }),
  53. )
  54. await page.routeWebSocket("**/pty/pty_hidden_terminal/connect", () => undefined)
  55. await page.goto(`/${base64Encode(directory)}/session/${sessionID}`)
  56. await expectSessionTitle(page, title)
  57. await page.keyboard.press("Control+Backquote")
  58. const panel = page.locator("#terminal-panel")
  59. await expect(panel).toHaveAttribute("aria-hidden", "false")
  60. await expect(page.locator('[data-component="terminal"]')).toBeVisible()
  61. await page.keyboard.press("Control+Backquote")
  62. await expect(panel).toHaveCount(0)
  63. await expect(page.locator('[data-component="terminal"]')).toHaveCount(0)
  64. await page.setViewportSize({ width: 1200, height: 700 })
  65. await expect(page.locator('[data-component="terminal"]')).toHaveCount(0)
  66. await page.keyboard.press("Control+Backquote")
  67. await expect(panel).toBeVisible()
  68. await expect(page.locator('[data-component="terminal"]')).toBeVisible()
  69. })
  70. function base64Encode(value: string) {
  71. return Buffer.from(value, "utf8").toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "")
  72. }