/search lists each input and batch output under its qualified message, and picking one opens the flow on the label's id, which the editor now treats like a click on the label: it opens the flow's settings.
70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
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" }],
|
|
inputs: [{ spec: { name: "findme_input", dtype: "float" } }],
|
|
},
|
|
})
|
|
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("finds a flow input and opens the settings declaring it", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("/")
|
|
await page.getByRole("button", { name: "Search", exact: true }).click()
|
|
|
|
await page.getByTestId("global-search-input").fill("findme_input")
|
|
await page.getByRole("option", { name: /findme_input/ }).click()
|
|
|
|
await expect(page).toHaveURL(
|
|
new RegExp(`/flows/${flowName}\\?node=input%3A${flowName}\\.findme_input$`),
|
|
)
|
|
await expect(page.getByTestId("flow-panel")).toBeVisible()
|
|
})
|
|
|
|
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()
|
|
})
|