Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2ad1175
feat(web-console): search across multiple tabs
emrberk Aug 6, 2025
ab1e111
submodule
emrberk Aug 6, 2025
d004f2d
fix monaco imports
emrberk Aug 6, 2025
aff4d9c
left panel state updates
emrberk Aug 6, 2025
dceac7d
make shortcut work on both mac & !mac
bluestreak01 Aug 6, 2025
eb5e09e
add search tests & use custom search
emrberk Aug 7, 2025
ac5f587
submodule
emrberk Aug 7, 2025
63a130b
search options test case & corrections
emrberk Aug 7, 2025
6177765
submodule & navigation limit in test
emrberk Aug 7, 2025
79422f4
prevent page load race conditions and suggestion selection in editor
emrberk Aug 7, 2025
cda3d1d
don't clear local storage before clearing warnings
emrberk Aug 7, 2025
190932f
cleanup
emrberk Aug 8, 2025
11a2e41
search in tab names
emrberk Aug 12, 2025
dae20fc
submodule
emrberk Aug 12, 2025
dcfe378
handle invalid regexes
emrberk Aug 12, 2025
36437a7
submodule
emrberk Aug 12, 2025
b517dbb
search test fix
emrberk Aug 13, 2025
d755e70
editor focus & query param processing fixes
emrberk Aug 13, 2025
fb1199b
address ai reviews :)
emrberk Aug 13, 2025
8902c74
partial updates on search results, use web workers for search, fix ed…
emrberk Aug 17, 2025
905ff48
Update packages/web-console/src/providers/EditorProvider/index.tsx
emrberk Aug 17, 2025
7836fd2
Update packages/web-console/src/utils/textSearch.ts
emrberk Aug 17, 2025
cef1b1e
Merge remote-tracking branch 'origin/main' into feat/search
emrberk Aug 17, 2025
5f45c63
avoid bundling name loss on worker definition
emrberk Aug 17, 2025
68d48fb
temp buffer navigation fix, search in lines
emrberk Aug 18, 2025
b4b714d
Merge branch 'main' into feat/search
bluestreak01 Aug 18, 2025
e1a7868
bumped questdb to master
bluestreak01 Aug 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 118 additions & 33 deletions packages/browser-tests/cypress/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ require("@4tw/cypress-drag-drop");

const { ctrlOrCmd, escapeRegExp } = require("./utils");

const contextPath = process.env.QDB_HTTP_CONTEXT_WEB_CONSOLE || ""
const contextPath = process.env.QDB_HTTP_CONTEXT_WEB_CONSOLE || "";
const baseUrl = `http://localhost:9999${contextPath}`;

const tableSchemas = {
Expand Down Expand Up @@ -182,10 +182,7 @@ Cypress.Commands.add("getMountedEditor", () =>
Cypress.Commands.add("getEditor", () => cy.get(".monaco-editor.vs-dark"));

Cypress.Commands.add("getEditorContent", () =>
cy
.get(".monaco-editor")
.find("textarea")
.should("be.visible")
cy.get(".monaco-editor").find("textarea").should("be.visible")
);

Cypress.Commands.add("getEditorHitbox", () =>
Expand Down Expand Up @@ -354,49 +351,71 @@ Cypress.Commands.add("interceptQuery", (query, alias, response) => {
).as(alias);
});

Cypress.Commands.add("loginWithUserAndPassword", (username = "admin", password = "quest") => {
cy.getByDataHook("auth-login").should("be.visible");
cy.get("input[name='username']").type(username);
cy.get("input[type='password']").type(password);
cy.get("button[type='submit']").click();
Cypress.Commands.add(
"loginWithUserAndPassword",
(username = "admin", password = "quest") => {
cy.getByDataHook("auth-login").should("be.visible");
cy.get("input[name='username']").type(username);
cy.get("input[type='password']").type(password);
cy.get("button[type='submit']").click();

cy.getEditor().should("be.visible");
});
cy.getEditor().should("be.visible");
}
);

Cypress.Commands.add(
"clearStorageAndVisit",
(url, clearLocalStorage = true) => {
cy.visit(url, {
onBeforeLoad: (win) => {
if (clearLocalStorage) {
win.localStorage.clear();
}
win.indexedDB.deleteDatabase("web-console");
},
});
}
);

Cypress.Commands.add("loadConsoleWithAuth", (clearWarnings = false) => {
cy.clearLocalStorage();
indexedDB.deleteDatabase("web-console");
cy.visit(baseUrl);
cy.clearStorageAndVisit(baseUrl);
cy.loginWithUserAndPassword();
if (clearWarnings) {
cy.clearSimulatedWarnings();
indexedDB.deleteDatabase("web-console");
cy.visit(baseUrl);
cy.clearStorageAndVisit(baseUrl, false);
cy.getEditor().should("be.visible");
}
});

Cypress.Commands.add("loadConsoleAsAdminAndCreateSSOGroup", (group, externalGroup = undefined) => {
cy.loadConsoleWithAuth(true);
Cypress.Commands.add(
"loadConsoleAsAdminAndCreateSSOGroup",
(group, externalGroup = undefined) => {
cy.loadConsoleWithAuth(true);

cy.executeSQL(`CREATE GROUP '${group}' WITH EXTERNAL ALIAS '${externalGroup || group}';`);
cy.getByDataHook("success-notification").should("be.visible");
cy.executeSQL(`GRANT HTTP TO '${group}';`);
cy.getByDataHook("success-notification").should("be.visible");
cy.executeSQL(
`CREATE GROUP '${group}' WITH EXTERNAL ALIAS '${externalGroup || group}';`
);
cy.getByDataHook("success-notification").should("be.visible");
cy.executeSQL(`GRANT HTTP TO '${group}';`);
cy.getByDataHook("success-notification").should("be.visible");

cy.logout();
});
cy.logout();
}
);

Cypress.Commands.add("loadConsoleAsAdminAndCreateDBUser", (username, password = "pwd") => {
cy.loadConsoleWithAuth(true);
Cypress.Commands.add(
"loadConsoleAsAdminAndCreateDBUser",
(username, password = "pwd") => {
cy.loadConsoleWithAuth(true);

cy.executeSQL(`create user '${username}' with password '${password}'`);
cy.getByDataHook("success-notification").should("be.visible");
cy.executeSQL(`grant HTTP to '${username}'`);
cy.getByDataHook("success-notification").should("be.visible");
cy.executeSQL(`create user '${username}' with password '${password}'`);
cy.getByDataHook("success-notification").should("be.visible");
cy.executeSQL(`grant HTTP to '${username}'`);
cy.getByDataHook("success-notification").should("be.visible");

cy.logout();
});
cy.logout();
}
);

Cypress.Commands.add("logout", () => {
cy.getByDataHook("button-logout").click();
Expand Down Expand Up @@ -460,3 +479,69 @@ Cypress.Commands.add("getEditorTabs", () => {
Cypress.Commands.add("getEditorTabByTitle", (title) => {
return cy.get(`.chrome-tab[data-tab-title="${title}"]`);
});

Cypress.Commands.add("openSearchPanel", () => {
cy.getByDataHook("search-panel-button").then(($btn) => {
if ($btn.attr("data-selected") === "false") {
cy.wrap($btn).click();
}
});
cy.getByDataHook("search-input").should("be.visible");
});

Cypress.Commands.add("closeSearchPanel", () => {
cy.getByDataHook("search-panel-button").then(($btn) => {
if ($btn.attr("data-selected") === "true") {
cy.wrap($btn).click();
}
});
cy.getByDataHook("search-input").should("not.be.visible");
});

Cypress.Commands.add("ensureDataSourcesPanel", () => {
cy.getByDataHook("tables-panel-button").then(($btn) => {
if ($btn.attr("data-selected") === "false") {
cy.wrap($btn).click();
}
});
cy.getByDataHook("schema-tree").should("be.visible");
});

Cypress.Commands.add("searchFor", (query) => {
cy.getByDataHook("search-input").clear().type(query);
cy.wait(400); // Wait for debounce
});

Cypress.Commands.add("toggleSearchOption", (option) => {
const hooks = {
caseSensitive: "search-option-case-sensitive",
wholeWord: "search-option-whole-word",
useRegex: "search-option-regex",
includeDeleted: "search-option-include-closed",
};
cy.getByDataHook(hooks[option]).realHover();
cy.getByDataHook(hooks[option]).click({ force: true });
});

Cypress.Commands.add("getSearchResults", () => {
return cy.getByDataHook("search-result-match");
});

Cypress.Commands.add("getSearchResultGroups", () => {
return cy.getByDataHook("search-result-buffer-group");
});

Cypress.Commands.add("createTabWithContent", (content, title) => {
cy.getByDataHook("new-tab-button").click();
cy.get(".chrome-tab-was-just-added").should("be.visible");
cy.get(".chrome-tab-was-just-added").should("not.exist");
cy.typeQueryDirectly(content);

if (title) {
cy.get(".chrome-tab[active] .chrome-tab-drag-handle").dblclick();
cy.get(".chrome-tab[active] .chrome-tab-rename")
.should("be.visible")
.type(title + "{enter}");
cy.get(".chrome-tab[active] .chrome-tab-rename").should("not.be.visible");
}
});
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ describe("run query", () => {
cy.realPress("ArrowLeft");
}
cy.focused().type(`${ctrlOrCmd}{enter}`);
cy.getColumnName(0).should("contain", "count");
cy.getColumnName(0).should("contain", "count()");
cy.getGridRow(0).should("contain", "100");

// go inside the first query
Expand All @@ -55,7 +55,7 @@ describe("run query", () => {
cy.realPress("ArrowLeft");
}
cy.focused().type(`${ctrlOrCmd}{enter}`);
cy.getColumnName(0).should("contain", "count");
cy.getColumnName(0).should("contain", "count()");
cy.getGridRow(0).should("contain", "100");
});

Expand Down Expand Up @@ -522,10 +522,12 @@ describe("&query URL param", () => {
cy.getByDataHook("metrics-root").should("be.visible");

// when
cy.visit(`${baseUrl}?query=${encodeURIComponent("select x from long_sequence(1)")}`);
cy.visit(
`${baseUrl}?query=${encodeURIComponent("select x from long_sequence(1)")}`
);

// then
cy.getEditorContent().should("be.visible");
cy.getEditor().should("be.visible");
cy.getEditorTabs().should("have.length", 3);
cy.getEditorTabByTitle("Metrics 1").should("be.visible");
cy.getEditorTabByTitle("Query")
Expand Down Expand Up @@ -918,7 +920,7 @@ describe("handling comments", () => {
});

it("should highlight and execute sql with line comments inside", () => {
cy.typeQuery("select\n\nx\n-- y\n-- z\n from long_sequence(1);");
cy.typeQueryDirectly("select\nx\n-- y\n-- z\n from long_sequence(1);");
cy.getCursorQueryDecoration().should("have.length", 5);
cy.getCursorQueryGlyph().should("have.length", 1);
cy.runLine();
Expand Down
Loading