projects-switch.spec.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { base64Decode } from "@opencode-ai/util/encode"
  2. import { test, expect } from "../fixtures"
  3. import {
  4. defocus,
  5. createTestProject,
  6. cleanupTestProject,
  7. openSidebar,
  8. setWorkspacesEnabled,
  9. waitSession,
  10. waitSlug,
  11. } from "../actions"
  12. import { projectSwitchSelector, workspaceItemSelector, workspaceNewSessionSelector } from "../selectors"
  13. import { dirSlug, resolveDirectory } from "../utils"
  14. test("can switch between projects from sidebar", async ({ page, project }) => {
  15. await page.setViewportSize({ width: 1400, height: 800 })
  16. const other = await createTestProject()
  17. const otherSlug = dirSlug(other)
  18. try {
  19. await project.open({ extra: [other] })
  20. await defocus(page)
  21. const currentSlug = dirSlug(project.directory)
  22. const otherButton = page.locator(projectSwitchSelector(otherSlug)).first()
  23. await expect(otherButton).toBeVisible()
  24. await otherButton.click()
  25. await expect(page).toHaveURL(new RegExp(`/${otherSlug}/session`))
  26. const currentButton = page.locator(projectSwitchSelector(currentSlug)).first()
  27. await expect(currentButton).toBeVisible()
  28. await currentButton.click()
  29. await expect(page).toHaveURL(new RegExp(`/${currentSlug}/session`))
  30. } finally {
  31. await cleanupTestProject(other)
  32. }
  33. })
  34. test("switching back to a project opens the latest workspace session", async ({ page, project }) => {
  35. await page.setViewportSize({ width: 1400, height: 800 })
  36. const other = await createTestProject()
  37. const otherSlug = dirSlug(other)
  38. try {
  39. await project.open({ extra: [other] })
  40. await defocus(page)
  41. await setWorkspacesEnabled(page, project.slug, true)
  42. await openSidebar(page)
  43. await expect(page.getByRole("button", { name: "New workspace" }).first()).toBeVisible()
  44. await page.getByRole("button", { name: "New workspace" }).first().click()
  45. const raw = await waitSlug(page, [project.slug])
  46. const dir = base64Decode(raw)
  47. if (!dir) throw new Error(`Failed to decode workspace slug: ${raw}`)
  48. const space = await resolveDirectory(dir)
  49. const next = dirSlug(space)
  50. project.trackDirectory(space)
  51. await openSidebar(page)
  52. const item = page.locator(`${workspaceItemSelector(next)}, ${workspaceItemSelector(raw)}`).first()
  53. await expect(item).toBeVisible()
  54. await item.hover()
  55. const btn = page.locator(`${workspaceNewSessionSelector(next)}, ${workspaceNewSessionSelector(raw)}`).first()
  56. await expect(btn).toBeVisible()
  57. await btn.click({ force: true })
  58. await waitSession(page, { directory: space })
  59. const created = await project.user("test")
  60. await expect(page).toHaveURL(new RegExp(`/${next}/session/${created}(?:[/?#]|$)`))
  61. await openSidebar(page)
  62. const otherButton = page.locator(projectSwitchSelector(otherSlug)).first()
  63. await expect(otherButton).toBeVisible()
  64. await otherButton.click({ force: true })
  65. await waitSession(page, { directory: other })
  66. const rootButton = page.locator(projectSwitchSelector(project.slug)).first()
  67. await expect(rootButton).toBeVisible()
  68. await rootButton.click({ force: true })
  69. await waitSession(page, { directory: space, sessionID: created })
  70. await expect(page).toHaveURL(new RegExp(`/session/${created}(?:[/?#]|$)`))
  71. } finally {
  72. await cleanupTestProject(other)
  73. }
  74. })