Files
dbx/apps/desktop/src/lib/__tests__/sidebar/sidebarTreeSelection.spec.ts
T

82 lines
3.2 KiB
TypeScript
Vendored

import { describe, expect, it, vi } from "vitest";
import { filterSidebarModifierSelectionIds, pruneTreeSelectionToVisibleNodeIds, selectedSidebarBatchTargets, supportsSidebarModifierSelection } from "@/lib/sidebar/sidebarTreeSelection";
import type { TreeNode } from "@/types/database";
function node(id: string, type: TreeNode["type"]): TreeNode {
return { id, label: id, type };
}
describe("sidebar modifier selection", () => {
it("disables modifier selection for database, schema, and object-group nodes", () => {
expect(supportsSidebarModifierSelection(node("database-1", "database"))).toBe(false);
expect(supportsSidebarModifierSelection(node("schema-1", "schema"))).toBe(false);
expect(supportsSidebarModifierSelection(node("tables-1", "group-tables"))).toBe(false);
expect(supportsSidebarModifierSelection(node("views-1", "group-views"))).toBe(false);
});
it("keeps nodes with existing connection and object bulk actions selectable", () => {
expect(supportsSidebarModifierSelection(node("connection-1", "connection"))).toBe(true);
expect(supportsSidebarModifierSelection(node("table-1", "table"))).toBe(true);
expect(supportsSidebarModifierSelection(node("index-1", "index"))).toBe(true);
});
it("excludes containers reached indirectly by a modifier selection", () => {
const nodes = [node("tables-1", "group-tables"), node("table-1", "table"), node("schema-1", "schema"), node("database-1", "database"), node("table-2", "table")];
expect(
filterSidebarModifierSelectionIds(
nodes,
nodes.map((item) => item.id),
),
).toEqual(["table-1", "table-2"]);
});
});
describe("visible sidebar selection pruning", () => {
it("checks only selected identifiers against the existing visible-node index", () => {
const has = vi.fn((id: string) => id === "table-2");
expect(
pruneTreeSelectionToVisibleNodeIds(
{ has },
{
nodeIds: ["table-1", "table-2", "table-3"],
activeNodeId: "table-3",
anchorNodeId: "table-1",
},
),
).toEqual({
nodeIds: ["table-2"],
activeNodeId: "table-2",
anchorNodeId: "table-2",
});
expect(has).toHaveBeenCalledTimes(5);
});
});
describe("sidebar batch action targets", () => {
const table = (id: string, connectionId = "connection-1", database = "database-1"): TreeNode => ({
id,
label: id,
type: "table",
connectionId,
database,
});
it("keeps selected tables from the same database when the context target is selected", () => {
const first = table("table-1");
const second = table("table-2");
expect(selectedSidebarBatchTargets(second, [first, second], () => true)).toEqual([first, second]);
});
it("rejects stale, cross-database, and unsupported selections", () => {
const first = table("table-1");
const second = table("table-2");
expect(selectedSidebarBatchTargets(table("outside"), [first, second], () => true)).toEqual([]);
expect(selectedSidebarBatchTargets(second, [first, table("other", "connection-1", "database-2")], () => true)).toEqual([]);
expect(selectedSidebarBatchTargets(second, [first, second], (target) => target.id !== second.id)).toEqual([]);
});
});