80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import {
|
|
buildDatabaseTreeNodes,
|
|
buildDuckDbConnectionTreeNodes,
|
|
sortSidebarNames,
|
|
shouldIncludeDefaultDatabaseNode,
|
|
} from "../../apps/desktop/src/lib/databaseTree.ts";
|
|
|
|
test("数据库节点按自然名称排序", () => {
|
|
const nodes = buildDatabaseTreeNodes("conn-1", [
|
|
{ name: "db10" },
|
|
{ name: "db2" },
|
|
{ name: "campaign_data" },
|
|
{ name: "cms" },
|
|
{ name: "mk_campaign" },
|
|
]);
|
|
|
|
assert.deepEqual(
|
|
nodes.map((node) => node.database),
|
|
["campaign_data", "cms", "db2", "db10", "mk_campaign"],
|
|
);
|
|
assert.equal(nodes.find((node) => node.database === "mk_campaign")?.id, "conn-1:mk_campaign");
|
|
});
|
|
|
|
test("catalogless database metadata gets a visible default node", () => {
|
|
const nodes = buildDatabaseTreeNodes("conn-1", [{ name: " " }], { includeDefaultWhenEmpty: true });
|
|
|
|
assert.deepEqual(nodes, [
|
|
{
|
|
id: "conn-1:",
|
|
label: "tree.defaultDatabase",
|
|
type: "database",
|
|
connectionId: "conn-1",
|
|
database: "",
|
|
isExpanded: false,
|
|
children: [],
|
|
},
|
|
]);
|
|
});
|
|
|
|
test("tree schema mode can show a default node when no catalog is returned", () => {
|
|
const nodes = buildDatabaseTreeNodes("conn-1", [], { includeDefaultWhenEmpty: true });
|
|
|
|
assert.equal(nodes.length, 1);
|
|
assert.equal(nodes[0].database, "");
|
|
assert.equal(nodes[0].label, "tree.defaultDatabase");
|
|
});
|
|
|
|
test("MySQL-compatible catalogless services can opt into the default database node", () => {
|
|
assert.equal(shouldIncludeDefaultDatabaseNode({ db_type: "mysql" }, [{ name: "" }]), true);
|
|
assert.equal(shouldIncludeDefaultDatabaseNode({ db_type: "mysql" }, [{ name: "app" }]), false);
|
|
assert.equal(shouldIncludeDefaultDatabaseNode({ db_type: "postgres" }, [{ name: "" }]), false);
|
|
});
|
|
|
|
test("DuckDB shows primary catalog schemas directly under the connection", () => {
|
|
const nodes = buildDuckDbConnectionTreeNodes(
|
|
"conn-1",
|
|
[{ name: "main" }, { name: "attached_reports" }, { name: "analytics_20" }, { name: "analytics_3" }],
|
|
["prod_sales", "main", "mysql"],
|
|
);
|
|
|
|
assert.deepEqual(
|
|
nodes.map((node) => [node.type, node.label, node.database, node.schema]),
|
|
[
|
|
["schema", "main", "main", "main"],
|
|
["schema", "mysql", "main", "mysql"],
|
|
["schema", "prod_sales", "main", "prod_sales"],
|
|
["database", "analytics_3", "analytics_3", undefined],
|
|
["database", "analytics_20", "analytics_20", undefined],
|
|
["database", "attached_reports", "attached_reports", undefined],
|
|
],
|
|
);
|
|
assert.equal(nodes.find((node) => node.label === "mysql")?.id, "conn-1:main:mysql");
|
|
});
|
|
|
|
test("sidebar name sorting uses numeric-aware ordering", () => {
|
|
assert.deepEqual(sortSidebarNames(["db10", "db2", "db1"]), ["db1", "db2", "db10"]);
|
|
});
|