158 lines
3.8 KiB
TypeScript
158 lines
3.8 KiB
TypeScript
import { renderToStaticMarkup } from "react-dom/server";
|
|
import { describe, expect, it } from "vitest";
|
|
import {
|
|
fail,
|
|
type HousekeepingResult,
|
|
ok,
|
|
} from "../../../foundation/contracts";
|
|
import { SystemAccessPage } from "./access";
|
|
import { SystemConfigurationPage } from "./configuration";
|
|
import { SystemObservabilityPage } from "./observability";
|
|
import { SystemOperationsPage } from "./operations";
|
|
|
|
const correlationId = "system-pages-test";
|
|
|
|
type PageCase = {
|
|
readonly name: string;
|
|
readonly render: (result?: HousekeepingResult<unknown>) => string;
|
|
readonly empty: unknown;
|
|
readonly partial: unknown;
|
|
readonly ready: unknown;
|
|
};
|
|
|
|
const pageCases: readonly PageCase[] = [
|
|
{
|
|
name: "access",
|
|
render: (result) =>
|
|
renderToStaticMarkup(<SystemAccessPage result={result as never} />),
|
|
empty: {
|
|
kind: "permissions",
|
|
ranks: [],
|
|
acl: { roles: 0, permissions: 0 },
|
|
partialDependencies: [],
|
|
},
|
|
partial: {
|
|
kind: "permissions",
|
|
ranks: [{ id: 4, name: "Moderator", level: 4, userCount: 2 }],
|
|
acl: { roles: 0, permissions: 0 },
|
|
partialDependencies: ["acl"],
|
|
},
|
|
ready: {
|
|
kind: "permissions",
|
|
ranks: [{ id: 4, name: "Moderator", level: 4, userCount: 2 }],
|
|
acl: { roles: 3, permissions: 18 },
|
|
partialDependencies: [],
|
|
},
|
|
},
|
|
{
|
|
name: "configuration",
|
|
render: (result) =>
|
|
renderToStaticMarkup(
|
|
<SystemConfigurationPage result={result as never} />,
|
|
),
|
|
empty: { kind: "settings", settings: [], partialDependencies: [] },
|
|
partial: {
|
|
kind: "emulator",
|
|
settings: [{ key: "hotel.name", value: "Epic" }],
|
|
texts: [],
|
|
textsTotal: 0,
|
|
partialDependencies: ["emulator-texts"],
|
|
},
|
|
ready: {
|
|
kind: "settings",
|
|
settings: [{ key: "hotel.name", value: "Epic" }],
|
|
partialDependencies: [],
|
|
},
|
|
},
|
|
{
|
|
name: "observability",
|
|
render: (result) =>
|
|
renderToStaticMarkup(
|
|
<SystemObservabilityPage result={result as never} />,
|
|
),
|
|
empty: {
|
|
kind: "logs",
|
|
metrics: [],
|
|
rows: [],
|
|
partialDependencies: [],
|
|
},
|
|
partial: {
|
|
kind: "devops",
|
|
health: null,
|
|
errors: [{ id: "1", primary: "Connection error" }],
|
|
partialDependencies: ["health"],
|
|
},
|
|
ready: {
|
|
kind: "analytics",
|
|
metrics: [{ label: "Online users", value: 12 }],
|
|
rows: [],
|
|
partialDependencies: [],
|
|
},
|
|
},
|
|
{
|
|
name: "operations",
|
|
render: (result) =>
|
|
renderToStaticMarkup(<SystemOperationsPage result={result as never} />),
|
|
empty: { kind: "alerts", alerts: [], partialDependencies: [] },
|
|
partial: {
|
|
kind: "command-center",
|
|
health: null,
|
|
onlineUsers: { count: 0, users: [] },
|
|
maintenance: {
|
|
enabled: false,
|
|
message: "",
|
|
minimumLoginRank: 5,
|
|
},
|
|
partialDependencies: ["health"],
|
|
},
|
|
ready: {
|
|
kind: "alerts",
|
|
alerts: [
|
|
{
|
|
id: 7,
|
|
severity: "warning",
|
|
type: "emulator",
|
|
message: "Connection restored",
|
|
isRead: false,
|
|
},
|
|
],
|
|
partialDependencies: [],
|
|
},
|
|
},
|
|
];
|
|
|
|
describe.each(pageCases)(
|
|
"System $name page",
|
|
({ render, empty, partial, ready }) => {
|
|
it("renders loading, forbidden, and dependency errors explicitly", () => {
|
|
expect(render()).toContain('data-housekeeping-state="loading"');
|
|
expect(
|
|
render(
|
|
fail("FORBIDDEN", "errors.housekeeping.forbidden", correlationId),
|
|
),
|
|
).toContain('data-housekeeping-state="forbidden"');
|
|
expect(
|
|
render(
|
|
fail(
|
|
"DEPENDENCY_UNAVAILABLE",
|
|
"errors.housekeeping.dependencyUnavailable",
|
|
correlationId,
|
|
),
|
|
),
|
|
).toContain('data-housekeeping-state="error"');
|
|
});
|
|
|
|
it("renders empty, partial, and ready query results explicitly", () => {
|
|
expect(render(ok(empty, correlationId))).toContain(
|
|
'data-housekeeping-state="empty"',
|
|
);
|
|
expect(render(ok(partial, correlationId))).toContain(
|
|
'data-housekeeping-state="partial"',
|
|
);
|
|
expect(render(ok(ready, correlationId))).toContain(
|
|
'data-housekeeping-state="ready"',
|
|
);
|
|
});
|
|
},
|
|
);
|