summaryrefslogtreecommitdiffhomepage
path: root/packages/app/e2e/projects
diff options
context:
space:
mode:
Diffstat (limited to 'packages/app/e2e/projects')
-rw-r--r--packages/app/e2e/projects/project-edit.spec.ts47
-rw-r--r--packages/app/e2e/projects/projects-close.spec.ts77
-rw-r--r--packages/app/e2e/projects/projects-switch.spec.ts34
3 files changed, 158 insertions, 0 deletions
diff --git a/packages/app/e2e/projects/project-edit.spec.ts b/packages/app/e2e/projects/project-edit.spec.ts
new file mode 100644
index 000000000..22d053f3d
--- /dev/null
+++ b/packages/app/e2e/projects/project-edit.spec.ts
@@ -0,0 +1,47 @@
+import { test, expect } from "../fixtures"
+import { openSidebar } from "../actions"
+
+test("dialog edit project updates name and startup script", async ({ page, gotoSession }) => {
+ await gotoSession()
+ await page.setViewportSize({ width: 1400, height: 800 })
+
+ await openSidebar(page)
+
+ const open = async () => {
+ const header = page.locator(".group\\/project").first()
+ await header.hover()
+ const trigger = header.getByRole("button", { name: "More options" }).first()
+ await expect(trigger).toBeVisible()
+ await trigger.click({ force: true })
+
+ await page.getByRole("menuitem", { name: "Edit" }).click()
+
+ const dialog = page.getByRole("dialog")
+ await expect(dialog).toBeVisible()
+ await expect(dialog.getByRole("heading", { level: 2 })).toHaveText("Edit project")
+ return dialog
+ }
+
+ const name = `e2e project ${Date.now()}`
+ const startup = `echo e2e_${Date.now()}`
+
+ const dialog = await open()
+
+ const nameInput = dialog.getByLabel("Name")
+ await nameInput.fill(name)
+
+ const startupInput = dialog.getByLabel("Workspace startup script")
+ await startupInput.fill(startup)
+
+ await dialog.getByRole("button", { name: "Save" }).click()
+ await expect(dialog).toHaveCount(0)
+
+ const header = page.locator(".group\\/project").first()
+ await expect(header).toContainText(name)
+
+ const reopened = await open()
+ await expect(reopened.getByLabel("Name")).toHaveValue(name)
+ await expect(reopened.getByLabel("Workspace startup script")).toHaveValue(startup)
+ await reopened.getByRole("button", { name: "Cancel" }).click()
+ await expect(reopened).toHaveCount(0)
+})
diff --git a/packages/app/e2e/projects/projects-close.spec.ts b/packages/app/e2e/projects/projects-close.spec.ts
new file mode 100644
index 000000000..c3618740d
--- /dev/null
+++ b/packages/app/e2e/projects/projects-close.spec.ts
@@ -0,0 +1,77 @@
+import { test, expect } from "../fixtures"
+import { createTestProject, seedProjects, cleanupTestProject, openSidebar } from "../actions"
+import { projectCloseHoverSelector, projectCloseMenuSelector, projectSwitchSelector } from "../selectors"
+import { dirSlug } from "../utils"
+
+test("can close a project via hover card close button", async ({ page, directory, gotoSession }) => {
+ await page.setViewportSize({ width: 1400, height: 800 })
+
+ const other = await createTestProject()
+ const otherSlug = dirSlug(other)
+ await seedProjects(page, { directory, extra: [other] })
+
+ try {
+ await gotoSession()
+
+ await openSidebar(page)
+
+ const otherButton = page.locator(projectSwitchSelector(otherSlug)).first()
+ await expect(otherButton).toBeVisible()
+ await otherButton.hover()
+
+ const close = page.locator(projectCloseHoverSelector(otherSlug)).first()
+ await expect(close).toBeVisible()
+ await close.click()
+
+ await expect(otherButton).toHaveCount(0)
+ } finally {
+ await cleanupTestProject(other)
+ }
+})
+
+test("can close a project via project header more options menu", async ({ page, directory, gotoSession }) => {
+ await page.setViewportSize({ width: 1400, height: 800 })
+
+ const other = await createTestProject()
+ const otherName = other.split("/").pop()
+ const otherSlug = dirSlug(other)
+ await seedProjects(page, { directory, extra: [other] })
+
+ try {
+ await gotoSession()
+
+ await openSidebar(page)
+
+ const otherButton = page.locator(projectSwitchSelector(otherSlug)).first()
+ await expect(otherButton).toBeVisible()
+ await otherButton.click()
+
+ await expect(page).toHaveURL(new RegExp(`/${otherSlug}/session`))
+
+ const header = page
+ .locator(".group\\/project")
+ .filter({ has: page.locator(`[data-action="project-menu"][data-project="${otherSlug}"]`) })
+ .first()
+ await expect(header).toContainText(otherName)
+
+ const trigger = header.locator(`[data-action="project-menu"][data-project="${otherSlug}"]`).first()
+ await expect(trigger).toHaveCount(1)
+ await trigger.focus()
+ await page.keyboard.press("Enter")
+
+ const close = page
+ .locator(projectCloseMenuSelector(otherSlug))
+ .or(page.getByRole("menuitem", { name: "Close" }))
+ .or(
+ page
+ .locator('[data-component="dropdown-menu-content"] [data-slot="dropdown-menu-item"]')
+ .filter({ hasText: "Close" }),
+ )
+ .first()
+ await expect(close).toBeVisible({ timeout: 10_000 })
+ await close.click({ force: true })
+ await expect(otherButton).toHaveCount(0)
+ } finally {
+ await cleanupTestProject(other)
+ }
+})
diff --git a/packages/app/e2e/projects/projects-switch.spec.ts b/packages/app/e2e/projects/projects-switch.spec.ts
new file mode 100644
index 000000000..829ed8e57
--- /dev/null
+++ b/packages/app/e2e/projects/projects-switch.spec.ts
@@ -0,0 +1,34 @@
+import { test, expect } from "../fixtures"
+import { defocus, createTestProject, seedProjects, cleanupTestProject } from "../actions"
+import { projectSwitchSelector } from "../selectors"
+import { dirSlug } from "../utils"
+
+test("can switch between projects from sidebar", async ({ page, directory, gotoSession }) => {
+ await page.setViewportSize({ width: 1400, height: 800 })
+
+ const other = await createTestProject()
+ const otherSlug = dirSlug(other)
+
+ await seedProjects(page, { directory, extra: [other] })
+
+ try {
+ await gotoSession()
+
+ await defocus(page)
+
+ const currentSlug = dirSlug(directory)
+ const otherButton = page.locator(projectSwitchSelector(otherSlug)).first()
+ await expect(otherButton).toBeVisible()
+ await otherButton.click()
+
+ await expect(page).toHaveURL(new RegExp(`/${otherSlug}/session`))
+
+ const currentButton = page.locator(projectSwitchSelector(currentSlug)).first()
+ await expect(currentButton).toBeVisible()
+ await currentButton.click()
+
+ await expect(page).toHaveURL(new RegExp(`/${currentSlug}/session`))
+ } finally {
+ await cleanupTestProject(other)
+ }
+})