103 lines
3.5 KiB
TypeScript
103 lines
3.5 KiB
TypeScript
import { readFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { describe, expect, test } from "vitest";
|
|
import { type DashboardDocument } from "@dimensionlab/dashboard-model";
|
|
import { dimensionLabDashboardFixture } from "$lib/dashboard-seed/dimensionlab";
|
|
import { genericDashboardFixture } from "@dimensionlab/dashboard-model/fixtures";
|
|
import { dashboardDocumentToUiDashboard } from "./model-renderer";
|
|
|
|
const appRoot = process.cwd().endsWith(`${join("apps", "web")}`)
|
|
? process.cwd()
|
|
: join(process.cwd(), "apps", "web");
|
|
|
|
describe("dashboard model renderer", () => {
|
|
test("projects the Dimension Lab model into UI component props", () => {
|
|
const dashboard = dashboardDocumentToUiDashboard(dimensionLabDashboardFixture);
|
|
|
|
expect(dashboard.title).toBe(dimensionLabDashboardFixture.metadata.title);
|
|
expect(dashboard.subtitle).toBe(dimensionLabDashboardFixture.metadata.subtitle);
|
|
expect(dashboard.telemetry.map((card) => card.id)).toEqual(
|
|
dimensionLabDashboardFixture.layout.telemetry,
|
|
);
|
|
expect(dashboard.telemetry[0]).toMatchObject({
|
|
label: "Infra RAM",
|
|
icon: "mdi:memory",
|
|
severity: "ok",
|
|
});
|
|
expect(dashboard.serviceGroups.map((group) => group.id)).toEqual(
|
|
dimensionLabDashboardFixture.layout.serviceGroups,
|
|
);
|
|
expect(dashboard.serviceGroups.find((group) => group.id === "runtime-health")?.layout).toBe(
|
|
"grid",
|
|
);
|
|
expect(dashboard.modules.map((module) => module.id)).toEqual([
|
|
"weather-amsterdam",
|
|
"runtime-health-summary",
|
|
]);
|
|
expect(dashboard.statusItems.map((item) => item.id)).toEqual([
|
|
"footer-status:system-status",
|
|
"footer-status:last-sync",
|
|
"footer-status:uptime",
|
|
"footer-status:load-avg",
|
|
"footer-status:auto-refresh",
|
|
]);
|
|
expect(dashboard.statusStripId).toBe("footer-status");
|
|
});
|
|
|
|
test("projects a second fixture through the same mapper", () => {
|
|
const dashboard = dashboardDocumentToUiDashboard(genericDashboardFixture);
|
|
|
|
expect(dashboard.title).toBe("Operations Console");
|
|
expect(dashboard.telemetry.map((card) => card.id)).toEqual([
|
|
"service-uptime",
|
|
"queue-depth",
|
|
]);
|
|
expect(dashboard.serviceGroups[0]?.services.map((service) => service.id)).toEqual([
|
|
"identity",
|
|
"scheduler",
|
|
]);
|
|
expect(dashboard.modules[0]).toMatchObject({
|
|
id: "ambient",
|
|
title: "Environment",
|
|
icon: "mdi:radar",
|
|
});
|
|
});
|
|
|
|
test("returns intentional empty arrays for missing optional sections", () => {
|
|
const emptyModel: DashboardDocument = {
|
|
...genericDashboardFixture,
|
|
layout: {
|
|
density: "compact",
|
|
telemetry: [],
|
|
serviceGroups: [],
|
|
statusStrips: [],
|
|
modules: [],
|
|
},
|
|
telemetry: [],
|
|
serviceGroups: [],
|
|
statusStrips: [],
|
|
modules: [],
|
|
};
|
|
|
|
const dashboard = dashboardDocumentToUiDashboard(emptyModel);
|
|
|
|
expect(dashboard.telemetry).toEqual([]);
|
|
expect(dashboard.serviceGroups).toEqual([]);
|
|
expect(dashboard.statusItems).toEqual([]);
|
|
expect(dashboard.modules).toEqual([]);
|
|
});
|
|
|
|
test("does not hardcode environment-specific content in mapper source", () => {
|
|
const source = readFileSync(
|
|
join(appRoot, "src/lib/ui-adapter/model-renderer.ts"),
|
|
"utf8",
|
|
)
|
|
.toLowerCase()
|
|
.replaceAll("@dimensionlab/dashboard-model", "@internal/dashboard-model")
|
|
.replaceAll("@dimensionlab/ui", "@internal/ui");
|
|
|
|
expect(source).not.toContain("dimension");
|
|
expect(source).not.toContain("vaultwarden");
|
|
expect(source).not.toContain("forgejo");
|
|
});
|
|
});
|