carbon-components-svelte/tests/TreeView/toHierarchy.test.ts
2025-04-12 15:59:16 -07:00

255 lines
5.8 KiB
TypeScript

import { toHierarchy } from "carbon-components-svelte";
describe("toHierarchy", () => {
test("should create a flat hierarchy when no items have parents", () => {
const input = [
{ id: 1, name: "Item 1" },
{ id: 2, name: "Item 2", parentId: "invalid" },
];
const result = toHierarchy(input, (item) => item.parentId);
expect(result).toEqual([
{ id: 1, name: "Item 1" },
{ id: 2, name: "Item 2", parentId: "invalid" },
]);
});
test("should create a nested hierarchy with parent-child relationships", () => {
const input = [
{ id: 1, name: "Parent" },
{ id: 2, name: "Child", pid: 1, randomKey: "randomValue" },
{ id: 3, name: "Grandchild", pid: 2 },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{
id: 1,
name: "Parent",
nodes: [
{
id: 2,
name: "Child",
pid: 1,
nodes: [
{
id: 3,
name: "Grandchild",
pid: 2,
},
],
randomKey: "randomValue",
},
],
},
]);
});
test("should handle multiple root nodes with children", () => {
const input = [
{ id: 1, name: "Root 1" },
{ id: 2, name: "Root 2" },
{ id: 3, name: "Child 1", pid: 1 },
{ id: 4, name: "Child 2", pid: 2 },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{
id: 1,
name: "Root 1",
nodes: [
{
id: 3,
name: "Child 1",
pid: 1,
},
],
},
{
id: 2,
name: "Root 2",
nodes: [
{
id: 4,
name: "Child 2",
pid: 2,
},
],
},
]);
});
test("should remove empty nodes arrays", () => {
const input = [
{ id: 1, name: "Root" },
{ id: 2, name: "Leaf", pid: 1 },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{
id: 1,
name: "Root",
nodes: [
{
id: 2,
name: "Leaf",
pid: 1,
},
],
},
]);
expect(result[0].nodes?.[0]).not.toHaveProperty("nodes");
});
test("should handle empty input array", () => {
const result = toHierarchy<
{ id: string | number; parentId?: string | number },
"parentId"
>([], (item) => item.parentId || null);
expect(result).toEqual([]);
});
test("should handle non-existent parent IDs", () => {
const input = [
{ id: 1, name: "Root" },
{ id: 2, name: "Child", pid: 999 },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{ id: 1, name: "Root" },
{ id: 2, name: "Child", pid: 999 },
]);
});
test("should handle deeply nested structures", () => {
const input = [
{ id: 1, name: "Level 1" },
{ id: 2, name: "Level 2", pid: 1 },
{ id: 3, name: "Level 3", pid: 2 },
{ id: 4, name: "Level 4", pid: 3 },
{ id: 5, name: "Level 5", pid: 4 },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{
id: 1,
name: "Level 1",
nodes: [
{
id: 2,
name: "Level 2",
pid: 1,
nodes: [
{
id: 3,
name: "Level 3",
pid: 2,
nodes: [
{
id: 4,
name: "Level 4",
pid: 3,
nodes: [
{
id: 5,
name: "Level 5",
pid: 4,
},
],
},
],
},
],
},
],
},
]);
});
test("should handle mixed ID types", () => {
const input = [
{ id: "root", name: "Root" },
{ id: 1, name: "Child 1", pid: "root" },
{ id: "2", name: "Child 2", pid: "root" },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{
id: "root",
name: "Root",
nodes: [
{
id: 1,
name: "Child 1",
pid: "root",
},
{
id: "2",
name: "Child 2",
pid: "root",
},
],
},
]);
});
test("should preserve additional properties", () => {
const input = [
{ id: 1, name: "Root", extra: "data", meta: { key: "value" } },
{ id: 2, name: "Child", pid: 1, flag: true, count: 42 },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{
id: 1,
name: "Root",
extra: "data",
meta: { key: "value" },
nodes: [
{
id: 2,
name: "Child",
pid: 1,
flag: true,
count: 42,
},
],
},
]);
});
test("should handle null/undefined parent IDs", () => {
const input = [
{ id: 1, name: "Root 1" },
{ id: 2, name: "Root 2", pid: null },
{ id: 3, name: "Root 3", pid: undefined },
{ id: 4, name: "Child", pid: 1 },
];
const result = toHierarchy(input, (item) => item.pid);
expect(result).toEqual([
{
id: 1,
name: "Root 1",
nodes: [
{
id: 4,
name: "Child",
pid: 1,
},
],
},
{
id: 2,
name: "Root 2",
pid: null,
},
{
id: 3,
name: "Root 3",
pid: undefined,
},
]);
});
});