workspace-new-session.spec.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import type { Page } from "@playwright/test"
  2. import { test, expect } from "../fixtures"
  3. import {
  4. openSidebar,
  5. resolveSlug,
  6. sessionIDFromUrl,
  7. setWorkspacesEnabled,
  8. waitDir,
  9. waitSession,
  10. waitSessionSaved,
  11. waitSlug,
  12. } from "../actions"
  13. import { promptSelector, workspaceItemSelector, workspaceNewSessionSelector } from "../selectors"
  14. import { createSdk } from "../utils"
  15. function item(space: { slug: string; raw: string }) {
  16. return `${workspaceItemSelector(space.slug)}, ${workspaceItemSelector(space.raw)}`
  17. }
  18. function button(space: { slug: string; raw: string }) {
  19. return `${workspaceNewSessionSelector(space.slug)}, ${workspaceNewSessionSelector(space.raw)}`
  20. }
  21. async function waitWorkspaceReady(page: Page, space: { slug: string; raw: string }) {
  22. await openSidebar(page)
  23. await expect(page.locator(item(space)).first()).toBeVisible({ timeout: 60_000 })
  24. }
  25. async function createWorkspace(page: Page, root: string, seen: string[]) {
  26. await openSidebar(page)
  27. await page.getByRole("button", { name: "New workspace" }).first().click()
  28. const next = await resolveSlug(await waitSlug(page, [root, ...seen]))
  29. await waitDir(page, next.directory)
  30. return next
  31. }
  32. async function openWorkspaceNewSession(page: Page, space: { slug: string; raw: string; directory: string }) {
  33. await waitWorkspaceReady(page, space)
  34. const row = page.locator(item(space)).first()
  35. await row.hover()
  36. const next = page.locator(button(space)).first()
  37. await expect(next).toBeVisible()
  38. await next.click({ force: true })
  39. await waitSession(page, { directory: space.directory })
  40. await expect.poll(() => sessionIDFromUrl(page.url()) ?? "").toBe("")
  41. }
  42. async function createSessionFromWorkspace(
  43. page: Page,
  44. space: { slug: string; raw: string; directory: string },
  45. text: string,
  46. ) {
  47. await openWorkspaceNewSession(page, space)
  48. const prompt = page.locator(promptSelector)
  49. await expect(prompt).toBeVisible()
  50. await prompt.fill(text)
  51. await page.keyboard.press("Enter")
  52. await expect.poll(() => sessionIDFromUrl(page.url()) ?? "", { timeout: 15_000 }).not.toBe("")
  53. const sessionID = sessionIDFromUrl(page.url())
  54. if (!sessionID) throw new Error(`Failed to parse session id from url: ${page.url()}`)
  55. await waitSessionSaved(space.directory, sessionID)
  56. await createSdk(space.directory)
  57. .session.abort({ sessionID })
  58. .catch(() => undefined)
  59. return sessionID
  60. }
  61. test("new sessions from sidebar workspace actions stay in selected workspace", async ({ page, withProject }) => {
  62. await page.setViewportSize({ width: 1400, height: 800 })
  63. await withProject(async ({ slug: root, trackDirectory, trackSession }) => {
  64. await openSidebar(page)
  65. await setWorkspacesEnabled(page, root, true)
  66. const first = await createWorkspace(page, root, [])
  67. trackDirectory(first.directory)
  68. await waitWorkspaceReady(page, first)
  69. const second = await createWorkspace(page, root, [first.slug])
  70. trackDirectory(second.directory)
  71. await waitWorkspaceReady(page, second)
  72. trackSession(await createSessionFromWorkspace(page, first, `workspace one ${Date.now()}`), first.directory)
  73. trackSession(await createSessionFromWorkspace(page, second, `workspace two ${Date.now()}`), second.directory)
  74. trackSession(await createSessionFromWorkspace(page, first, `workspace one again ${Date.now()}`), first.directory)
  75. })
  76. })