import { expect, test } from "@playwright/test" import { api, apiPage, deleteAll } from "./utils/api" /** * The global search: the only way to reach a node without knowing its flow. * * The load-bearing part is what the flat index turns back into — a node hit is * a flow address with that node in focus, which no list endpoint could have * answered. */ const flowName = `test_search_${Date.now().toString(36)}` test.use({ storageState: "playwright/.auth/user.json" }) test.describe.configure({ mode: "serial" }) test.beforeAll(async ({ browser }) => { const page = await apiPage(browser) await api(page, `/flows/${flowName}`, { method: "PUT", data: { name: flowName, title: "Searchable flow", nodes: [{ id: "findme", type: "python", title: "Find me" }], }, }) await page.close() }) test.afterAll(async ({ browser }) => { await deleteAll(browser, [`/flows/${flowName}`]) }) test("finds a node by name and opens its flow on it", async ({ page }) => { await page.goto("/") await page.getByRole("button", { name: "Search", exact: true }).click() await page.getByTestId("global-search-input").fill("findme") await page.getByRole("option", { name: /Find me/ }).click() await expect(page).toHaveURL(new RegExp(`/flows/${flowName}\\?node=findme$`)) }) test("opens on the keyboard from anywhere", async ({ page }) => { await page.goto("/dashboards") // The binding lives in the sidebar, so wait for it to be there to press at. await expect( page.getByRole("button", { name: "Search", exact: true }), ).toBeVisible() await page.keyboard.press("ControlOrMeta+k") await expect(page.getByTestId("global-search-input")).toBeFocused() })