Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/application/sidebar/SidebarIds.test.tsx
T

104 lines
4.5 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { AdminSidebar } from "./AdminSidebar";
import { AppSidebar } from "./AppSidebar";
import { DocsSidebar } from "./DocsSidebar";
import type { SideBarItem } from "./SidebarItem";
import type { EntitySimple } from "~/utils/db/entities/entities.db.server";
import { UI_ID_PATTERNS, UI_NAV_IDS, UI_SURFACE_IDS } from "~/application/ui/uiRegistry";
function flattenSidebarItems(items: SideBarItem[]): SideBarItem[] {
return items.flatMap((item) => [item, ...flattenSidebarItems(item.items ?? [])]);
}
function expectCompleteUniqueIds(items: SideBarItem[]) {
const flattened = flattenSidebarItems(items);
const ids = flattened.map((item) => item.id);
expect(ids).not.toContain(undefined);
expect(ids.every((id) => id?.startsWith("ui."))).toBe(true);
expect(new Set(ids).size).toBe(ids.length);
}
function expectStaticItemsHaveIds(items: SideBarItem[]) {
const staticItems = flattenSidebarItems(items).filter((item) => !item.uiIdPattern);
expect(staticItems.length).toBeGreaterThan(0);
expect(staticItems.every((item) => typeof item.id === "string" && item.id.length > 0)).toBe(true);
}
function expectDynamicItemsHavePatternMetadata(items: SideBarItem[]) {
const dynamicItems = flattenSidebarItems(items).filter((item) => item.uiIdPattern);
expect(dynamicItems.every((item) => item.id && item.uiIdPattern && item.uiIdParams && Object.keys(item.uiIdParams).length > 0)).toBe(true);
}
describe("sidebar UI IDs", () => {
const t = vi.fn().mockImplementation((v: string) => v) as any;
const i18n = { exists: vi.fn().mockReturnValue(false) } as any;
it("defines the primary sidebar surface IDs", () => {
expect(UI_SURFACE_IDS.appSidebar).toBe("ui.surface.app.sidebar");
expect(UI_SURFACE_IDS.adminSidebar).toBe("ui.surface.admin.sidebar");
expect(UI_SURFACE_IDS.docsSidebar).toBe("ui.surface.docs.sidebar");
});
it("assigns unique IDs to admin sidebar items", () => {
const sidebar = AdminSidebar({ t, appConfiguration: null });
const ids = flattenSidebarItems(sidebar).map((item) => item.id);
expectCompleteUniqueIds(sidebar);
expectStaticItemsHaveIds(sidebar);
expect(ids).toContain(UI_NAV_IDS.adminDashboard);
expect(ids).toContain(UI_NAV_IDS.adminSettings);
expect(ids).toContain(UI_NAV_IDS.adminEntities);
});
it("assigns unique IDs to app sidebar static and dynamic items", () => {
const entities = [
{ id: "1", order: 1, name: "contacts", slug: "contacts", title: "Contact", titlePlural: "Contacts", active: true, type: "custom", hasApi: true, showInSidebar: true, icon: "", onEdit: null },
{ id: "2", order: 2, name: "hidden", slug: "hidden", title: "Hidden", titlePlural: "Hidden", active: true, type: "custom", hasApi: true, showInSidebar: false, icon: "", onEdit: null },
] as EntitySimple[];
const sidebar = AppSidebar({
t,
i18n,
tenantId: "acme",
entities,
entityGroups: [
{
slug: "sales",
title: "Sales",
icon: "",
collapsible: true,
section: "Operations",
entities: [{ entity: entities[0] }],
},
] as any,
appConfiguration: null,
});
const ids = flattenSidebarItems(sidebar).map((item) => item.id);
const dynamicEntity = flattenSidebarItems(sidebar).find((item) => item.id === "ui.nav.app.entity.contacts");
expectCompleteUniqueIds(sidebar);
expectStaticItemsHaveIds(sidebar);
expectDynamicItemsHavePatternMetadata(sidebar);
expect(ids).toContain(UI_NAV_IDS.appDashboard);
expect(ids).toContain(UI_NAV_IDS.appSettings);
expect(ids).toContain("ui.nav.app.entity.contacts");
expect(ids).toContain("ui.nav.app.entityGroup.sales");
expect(ids).toContain("ui.nav.app.section.operations");
expect(dynamicEntity?.uiIdPattern).toBe(UI_ID_PATTERNS.appEntity);
expect(dynamicEntity?.uiIdParams).toMatchObject({ entityName: "contacts", entitySlug: "contacts" });
});
it("assigns unique IDs to docs sidebar items", () => {
const sidebar = DocsSidebar();
const ids = flattenSidebarItems(sidebar).map((item) => item.id);
expectCompleteUniqueIds(sidebar);
expectStaticItemsHaveIds(sidebar);
expectDynamicItemsHavePatternMetadata(sidebar);
expect(ids).toContain(UI_NAV_IDS.docsIntroduction);
expect(ids).toContain("ui.nav.docs.componentsButtons");
const removedDocsPrefix = ["ui.nav.docs.page", "Blocks."].join("");
expect(ids.some((id) => id?.startsWith(removedDocsPrefix))).toBe(false);
});
});