33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { fillDailySeries, mergeRiskActivity } from "./admin-metrics";
|
|
|
|
describe("admin dashboard metrics", () => {
|
|
it("fills missing UTC registration days with zero", () => {
|
|
expect(fillDailySeries(
|
|
[{ day: "2026-07-30", count: 2 }, { day: "2026-08-01", count: 1 }],
|
|
new Date("2026-08-01T22:00:00Z"),
|
|
3,
|
|
)).toEqual([
|
|
{ day: "2026-07-30", count: 2 },
|
|
{ day: "2026-07-31", count: 0 },
|
|
{ day: "2026-08-01", count: 1 },
|
|
]);
|
|
});
|
|
|
|
it("merges complete per-user VPN summaries with each user's latest observation", () => {
|
|
const latest = [
|
|
{ userId: "user-2", classification: "tor", observedAt: new Date("2026-08-01T11:00:00Z") },
|
|
{ userId: "user-1", classification: "proxy", observedAt: new Date("2026-08-01T12:00:00Z") },
|
|
];
|
|
const summaries = [
|
|
{ userId: "user-1", count: 2000, classifications: ["proxy", "vpn"], sources: ["game", "web"] },
|
|
{ userId: "user-2", count: 1, classifications: ["tor"], sources: ["web"] },
|
|
];
|
|
|
|
expect(mergeRiskActivity(latest, summaries)).toEqual([
|
|
expect.objectContaining({ userId: "user-1", count: 2000, classification: "proxy", classifications: ["proxy", "vpn"], sources: ["game", "web"] }),
|
|
expect.objectContaining({ userId: "user-2", count: 1, classification: "tor" }),
|
|
]);
|
|
});
|
|
});
|