feat(sidebar): wildcard patterns for visible databases

Closes #7164
This commit is contained in:
t8y2 committed 2026-08-26 18:43:31 +08:00
1 parent 71344c637c
commit d06f62f9f4
36 files changed
+232 -19

No files matched your search

@@ -61,3 +61,53 @@ describe("visibleDatabases schema filtering", () => {
expect(isSystemSchemaName("kingbase", "public")).toBe(false);
});
});
describe("visible database wildcard patterns (issue #7164)", () => {
it("matches names with % and _ wildcards", async () => {
const { databaseNameMatchesVisiblePatterns } = await import("@/lib/database/visibleDatabases");
expect(databaseNameMatchesVisiblePatterns("n1_order", ["%n1%"])).toBe(true);
expect(databaseNameMatchesVisiblePatterns("main", ["%n1%"])).toBe(false);
expect(databaseNameMatchesVisiblePatterns("db1", ["db_"])).toBe(true);
expect(databaseNameMatchesVisiblePatterns("db12", ["db_"])).toBe(false);
expect(databaseNameMatchesVisiblePatterns("a.b", ["a.b"])).toBe(true);
expect(databaseNameMatchesVisiblePatterns("axb", ["a.b"])).toBe(false);
expect(databaseNameMatchesVisiblePatterns("N1_ORDER", ["%n1%"])).toBe(false);
expect(databaseNameMatchesVisiblePatterns("any", [])).toBe(false);
expect(databaseNameMatchesVisiblePatterns("any", undefined)).toBe(false);
});
it("unions exact selection with pattern matches in filterVisibleDatabaseNames", async () => {
const { filterVisibleDatabaseNames } = await import("@/lib/database/visibleDatabases");
const names = ["n1_order", "n2_user", "main", "report"];
expect(filterVisibleDatabaseNames(names, ["main"], ["%n1%"])).toEqual(["n1_order", "main"]);
expect(filterVisibleDatabaseNames(names, undefined, ["n%"])).toEqual(["n1_order", "n2_user"]);
expect(filterVisibleDatabaseNames(names, ["main"], undefined)).toEqual(["main"]);
expect(filterVisibleDatabaseNames(names, undefined, [])).toEqual(names);
});
it("applies patterns for connections in filterDatabaseNamesForConnection", async () => {
const { filterDatabaseNamesForConnection } = await import("@/lib/database/visibleDatabases");
const connection = { db_type: "mysql" as const, visible_database_patterns: ["%n1%"] };
expect(filterDatabaseNamesForConnection(["n1_order", "main", "mysql", "sys"], connection)).toEqual(["n1_order"]);
});
it("parses user pattern input with separators, trimming and dedupe", async () => {
const { parseVisibleDatabasePatternsInput } = await import("@/lib/database/visibleDatabases");
expect(parseVisibleDatabasePatternsInput(" %n1%, n2_; \n%n1% ,,")).toEqual(["%n1%", "n2_"]);
expect(parseVisibleDatabasePatternsInput(" ")).toEqual([]);
});
it("treats pattern-only configuration as a configured sidebar filter", async () => {
const { connectionHasConfiguredSidebarVisibleFilter } = await import("@/lib/sidebar/sidebarVisibleFilterSummary");
expect(connectionHasConfiguredSidebarVisibleFilter({ db_type: "mysql", visible_databases: undefined, visible_database_patterns: ["%n1%"] })).toBe(true);
expect(connectionHasConfiguredSidebarVisibleFilter({ db_type: "mysql", visible_databases: undefined, visible_database_patterns: [] })).toBe(false);
});
it("counts pattern-matched databases in the sidebar filter summary", async () => {
const { sidebarVisibleFilterSummary } = await import("@/lib/sidebar/sidebarVisibleFilterSummary");
const summary = sidebarVisibleFilterSummary({ db_type: "mysql", visible_databases: ["main"], visible_database_patterns: ["%n1%"] }, ["main", "n1_order", "n2_user", "mysql"]);
expect(summary.isActive).toBe(true);
expect(summary.selected).toBe(2);
expect(summary.total).toBe(3);
});
});