workspace-new-session.spec.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. waitSlug,
  11. } from "../actions"
  12. import { workspaceItemSelector, workspaceNewSessionSelector } from "../selectors"
  13. function item(space: { slug: string; raw: string }) {
  14. return `${workspaceItemSelector(space.slug)}, ${workspaceItemSelector(space.raw)}`
  15. }
  16. function button(space: { slug: string; raw: string }) {
  17. return `${workspaceNewSessionSelector(space.slug)}, ${workspaceNewSessionSelector(space.raw)}`
  18. }
  19. async function waitWorkspaceReady(page: Page, space: { slug: string; raw: string }) {
  20. await openSidebar(page)
  21. await expect(page.locator(item(space)).first()).toBeVisible({ timeout: 60_000 })
  22. }
  23. async function createWorkspace(page: Page, root: string, seen: string[]) {
  24. await openSidebar(page)
  25. await page.getByRole("button", { name: "New workspace" }).first().click()
  26. const next = await resolveSlug(await waitSlug(page, [root, ...seen]))
  27. await waitDir(page, next.directory)
  28. return next
  29. }
  30. async function openWorkspaceNewSession(page: Page, space: { slug: string; raw: string; directory: string }) {
  31. await waitWorkspaceReady(page, space)
  32. const row = page.locator(item(space)).first()
  33. await row.hover()
  34. const next = page.locator(button(space)).first()
  35. await expect(next).toBeVisible()
  36. await next.click({ force: true })
  37. await waitSession(page, { directory: space.directory })
  38. await expect.poll(() => sessionIDFromUrl(page.url()) ?? "").toBe("")
  39. }
  40. async function createSessionFromWorkspace(
  41. project: Parameters<typeof test>[0]["project"],
  42. page: Page,
  43. space: { slug: string; raw: string; directory: string },
  44. text: string,
  45. ) {
  46. await openWorkspaceNewSession(page, space)
  47. return project.user(text)
  48. }
  49. test("new sessions from sidebar workspace actions stay in selected workspace", async ({ page, project }) => {
  50. await page.setViewportSize({ width: 1400, height: 800 })
  51. await project.open()
  52. await openSidebar(page)
  53. await setWorkspacesEnabled(page, project.slug, true)
  54. const first = await createWorkspace(page, project.slug, [])
  55. project.trackDirectory(first.directory)
  56. await waitWorkspaceReady(page, first)
  57. const second = await createWorkspace(page, project.slug, [first.slug])
  58. project.trackDirectory(second.directory)
  59. await waitWorkspaceReady(page, second)
  60. await createSessionFromWorkspace(project, page, first, `workspace one ${Date.now()}`)
  61. await createSessionFromWorkspace(project, page, second, `workspace two ${Date.now()}`)
  62. await createSessionFromWorkspace(project, page, first, `workspace one again ${Date.now()}`)
  63. })