78 lines
2.0 KiB
TypeScript
78 lines
2.0 KiB
TypeScript
import { createTranslator } from "next-intl";
|
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
import { expect, it, vi } from "vitest";
|
|
import messages from "@/messages/en.json";
|
|
|
|
const mocks = vi.hoisted(() => ({ read: vi.fn(), allowed: false }));
|
|
vi.mock("@/lib/permissions", () => ({
|
|
getAdminContext: async () => ({
|
|
session: { user: { rank: 1 } },
|
|
permissions: {},
|
|
}),
|
|
canAccess: () => mocks.allowed,
|
|
PERMS: { DEVOPS_VIEW: "devops.view" },
|
|
}));
|
|
vi.mock("next/navigation", () => ({
|
|
redirect: () => {
|
|
throw new Error("redirect");
|
|
},
|
|
}));
|
|
vi.mock("@/lib/performance-store", () => ({ readPerformance: mocks.read }));
|
|
vi.mock("@/components/link", () => ({ default: () => null }));
|
|
|
|
vi.mock("next-intl/server", () => ({
|
|
getTranslations: async () =>
|
|
createTranslator({
|
|
locale: "en",
|
|
messages: messages.pages.admin.performance,
|
|
}),
|
|
}));
|
|
|
|
import Page from "./page";
|
|
|
|
it("rejects unauthorized users before reading timing records", async () => {
|
|
await expect(Page({ searchParams: Promise.resolve({}) })).rejects.toThrow(
|
|
"redirect",
|
|
);
|
|
expect(mocks.read).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("renders filtered slow records and explains incomplete streaming timings", async () => {
|
|
mocks.allowed = true;
|
|
const metrics = {
|
|
durationMs: 1500,
|
|
database: { count: 2, durationMs: 300, errors: 0 },
|
|
external: { count: 1, durationMs: 400, errors: 1 },
|
|
};
|
|
mocks.read.mockResolvedValue({
|
|
shared: false,
|
|
samples: [
|
|
{
|
|
operationId: "slow-op",
|
|
route: "/api/admin/studio",
|
|
method: "GET",
|
|
status: 200,
|
|
at: 1000,
|
|
streaming: true,
|
|
metrics,
|
|
},
|
|
{
|
|
operationId: "fast-op",
|
|
route: "/api/admin/users",
|
|
method: "GET",
|
|
status: 200,
|
|
at: 1001,
|
|
streaming: false,
|
|
metrics: { ...metrics, durationMs: 10 },
|
|
},
|
|
],
|
|
});
|
|
const html = renderToStaticMarkup(
|
|
await Page({ searchParams: Promise.resolve({ slow: "1" }) }),
|
|
);
|
|
expect(html).toContain("slow-op");
|
|
expect(html).not.toContain("fast-op");
|
|
expect(html).toContain("Streaming response");
|
|
expect(html).toContain("Local diagnostics");
|
|
});
|