|
@@ -0,0 +1,317 @@
|
|
|
|
|
+import { test, expect } from "../fixtures"
|
|
|
|
|
+import { openSettings, closeDialog, withSession } from "../actions"
|
|
|
|
|
+import { keybindButtonSelector } from "../selectors"
|
|
|
|
|
+import { modKey } from "../utils"
|
|
|
|
|
+
|
|
|
|
|
+test("changing sidebar toggle keybind works", async ({ page, gotoSession }) => {
|
|
|
|
|
+ await gotoSession()
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("sidebar.toggle"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ const initialKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(initialKeybind).toContain("B")
|
|
|
|
|
+
|
|
|
|
|
+ await keybindButton.click()
|
|
|
|
|
+ await expect(keybindButton).toHaveText(/press/i)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+KeyH`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const newKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(newKeybind).toContain("H")
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["sidebar.toggle"]).toBe("mod+shift+h")
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+
|
|
|
|
|
+ const main = page.locator("main")
|
|
|
|
|
+ const initialClasses = (await main.getAttribute("class")) ?? ""
|
|
|
|
|
+ const initiallyClosed = initialClasses.includes("xl:border-l")
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+H`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const afterToggleClasses = (await main.getAttribute("class")) ?? ""
|
|
|
|
|
+ const afterToggleClosed = afterToggleClasses.includes("xl:border-l")
|
|
|
|
|
+ expect(afterToggleClosed).toBe(!initiallyClosed)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+H`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const finalClasses = (await main.getAttribute("class")) ?? ""
|
|
|
|
|
+ const finalClosed = finalClasses.includes("xl:border-l")
|
|
|
|
|
+ expect(finalClosed).toBe(initiallyClosed)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+test("resetting all keybinds to defaults works", async ({ page, gotoSession }) => {
|
|
|
|
|
+ await page.addInitScript(() => {
|
|
|
|
|
+ localStorage.setItem("settings.v3", JSON.stringify({ keybinds: { "sidebar.toggle": "mod+shift+x" } }))
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ await gotoSession()
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("sidebar.toggle"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ const customKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(customKeybind).toContain("X")
|
|
|
|
|
+
|
|
|
|
|
+ const resetButton = dialog.getByRole("button", { name: "Reset to defaults" })
|
|
|
|
|
+ await expect(resetButton).toBeVisible()
|
|
|
|
|
+ await expect(resetButton).toBeEnabled()
|
|
|
|
|
+ await resetButton.click()
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const restoredKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(restoredKeybind).toContain("B")
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["sidebar.toggle"]).toBeUndefined()
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+test("clearing a keybind works", async ({ page, gotoSession }) => {
|
|
|
|
|
+ await gotoSession()
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("sidebar.toggle"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ const initialKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(initialKeybind).toContain("B")
|
|
|
|
|
+
|
|
|
|
|
+ await keybindButton.click()
|
|
|
|
|
+ await expect(keybindButton).toHaveText(/press/i)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press("Delete")
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const clearedKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(clearedKeybind).toMatch(/unassigned|press/i)
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["sidebar.toggle"]).toBe("none")
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+B`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const stillOnSession = page.url().includes("/session")
|
|
|
|
|
+ expect(stillOnSession).toBe(true)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+test("changing settings open keybind works", async ({ page, gotoSession }) => {
|
|
|
|
|
+ await gotoSession()
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("settings.open"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ const initialKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(initialKeybind).toContain(",")
|
|
|
|
|
+
|
|
|
|
|
+ await keybindButton.click()
|
|
|
|
|
+ await expect(keybindButton).toHaveText(/press/i)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Slash`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const newKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(newKeybind).toContain("/")
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["settings.open"]).toBe("mod+/")
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+
|
|
|
|
|
+ const settingsDialog = page.getByRole("dialog")
|
|
|
|
|
+ await expect(settingsDialog).toHaveCount(0)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Slash`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ await expect(settingsDialog).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, settingsDialog)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+test("changing new session keybind works", async ({ page, sdk, gotoSession }) => {
|
|
|
|
|
+ await withSession(sdk, "test session for keybind", async (session) => {
|
|
|
|
|
+ await gotoSession(session.id)
|
|
|
|
|
+
|
|
|
|
|
+ const initialUrl = page.url()
|
|
|
|
|
+ expect(initialUrl).toContain(`/session/${session.id}`)
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("session.new"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ await keybindButton.click()
|
|
|
|
|
+ await expect(keybindButton).toHaveText(/press/i)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+KeyN`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const newKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(newKeybind).toContain("N")
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["session.new"]).toBe("mod+shift+n")
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+N`)
|
|
|
|
|
+ await page.waitForTimeout(200)
|
|
|
|
|
+
|
|
|
|
|
+ const newUrl = page.url()
|
|
|
|
|
+ expect(newUrl).toMatch(/\/session\/?$/)
|
|
|
|
|
+ expect(newUrl).not.toContain(session.id)
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+test("changing file open keybind works", async ({ page, gotoSession }) => {
|
|
|
|
|
+ await gotoSession()
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("file.open"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ const initialKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(initialKeybind).toContain("P")
|
|
|
|
|
+
|
|
|
|
|
+ await keybindButton.click()
|
|
|
|
|
+ await expect(keybindButton).toHaveText(/press/i)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+KeyF`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const newKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(newKeybind).toContain("F")
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["file.open"]).toBe("mod+shift+f")
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+
|
|
|
|
|
+ const filePickerDialog = page.getByRole("dialog").filter({ has: page.getByPlaceholder(/search files/i) })
|
|
|
|
|
+ await expect(filePickerDialog).toHaveCount(0)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+F`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ await expect(filePickerDialog).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press("Escape")
|
|
|
|
|
+ await expect(filePickerDialog).toHaveCount(0)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+test("changing terminal toggle keybind works", async ({ page, gotoSession }) => {
|
|
|
|
|
+ await gotoSession()
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("terminal.toggle"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ await keybindButton.click()
|
|
|
|
|
+ await expect(keybindButton).toHaveText(/press/i)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+KeyY`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const newKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(newKeybind).toContain("Y")
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["terminal.toggle"]).toBe("mod+y")
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Y`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const pageStable = await page.evaluate(() => document.readyState === "complete")
|
|
|
|
|
+ expect(pageStable).toBe(true)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+test("changing command palette keybind works", async ({ page, gotoSession }) => {
|
|
|
|
|
+ await gotoSession()
|
|
|
|
|
+
|
|
|
|
|
+ const dialog = await openSettings(page)
|
|
|
|
|
+ await dialog.getByRole("tab", { name: "Shortcuts" }).click()
|
|
|
|
|
+
|
|
|
|
|
+ const keybindButton = dialog.locator(keybindButtonSelector("command.palette"))
|
|
|
|
|
+ await expect(keybindButton).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ const initialKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(initialKeybind).toContain("P")
|
|
|
|
|
+
|
|
|
|
|
+ await keybindButton.click()
|
|
|
|
|
+ await expect(keybindButton).toHaveText(/press/i)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+KeyK`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ const newKeybind = await keybindButton.textContent()
|
|
|
|
|
+ expect(newKeybind).toContain("K")
|
|
|
|
|
+
|
|
|
|
|
+ const stored = await page.evaluate(() => {
|
|
|
|
|
+ const raw = localStorage.getItem("settings.v3")
|
|
|
|
|
+ return raw ? JSON.parse(raw) : null
|
|
|
|
|
+ })
|
|
|
|
|
+ expect(stored?.keybinds?.["command.palette"]).toBe("mod+shift+k")
|
|
|
|
|
+
|
|
|
|
|
+ await closeDialog(page, dialog)
|
|
|
|
|
+
|
|
|
|
|
+ const palette = page.getByRole("dialog").filter({ has: page.getByRole("textbox").first() })
|
|
|
|
|
+ await expect(palette).toHaveCount(0)
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press(`${modKey}+Shift+K`)
|
|
|
|
|
+ await page.waitForTimeout(100)
|
|
|
|
|
+
|
|
|
|
|
+ await expect(palette).toBeVisible()
|
|
|
|
|
+ await expect(palette.getByRole("textbox").first()).toBeVisible()
|
|
|
|
|
+
|
|
|
|
|
+ await page.keyboard.press("Escape")
|
|
|
|
|
+ await expect(palette).toHaveCount(0)
|
|
|
|
|
+})
|