import { describe, expect, it } from "vitest"; import { discoverySignificance, eventFingerprint, eventTitle, significanceFor, TRACKED_FACILITY_FIELDS } from "./events.js"; const spec = (field: string) => TRACKED_FACILITY_FIELDS.find((s) => s.field === field)!; describe("event fingerprint", () => { it("is stable for the same entity/type/value/day and differs otherwise", () => { const a = eventFingerprint("facility", "fac_1", "capacity_changed", 48, "2026-09-11"); expect(a).toBe(eventFingerprint("facility", "fac_1", "capacity_changed", 48, "2026-09-11")); expect(a).not.toBe(eventFingerprint("facility", "fac_1", "capacity_changed", 48, "2026-09-12")); expect(a).not.toBe(eventFingerprint("facility", "fac_1", "capacity_changed", 60, "2026-09-11")); expect(a).not.toBe(eventFingerprint("facility", "fac_2", "capacity_changed", 48, "2026-09-11")); expect(a).toMatch(/^[0-9a-f]{64}$/); }); }); describe("significance", () => { it("follows the documented scale", () => { expect(significanceFor(spec("status"), "announced", "under_construction")).toBe(90); expect(significanceFor(spec("operatorId"), "op_a", "op_b")).toBe(85); expect(significanceFor(spec("itCapacityMw"), 100, 125)).toBe(80); // +25 % expect(significanceFor(spec("itCapacityMw"), 100, 110)).toBe(50); // +10 % expect(significanceFor(spec("plannedPowerMw"), 120, 180)).toBe(80); expect(significanceFor(spec("openedOn"), "2026", "2027-Q2")).toBe(60); expect(significanceFor(spec("facilityType"), "colocation", "hyperscale")).toBe(20); }); it("discovery: 65 for big or pipeline facilities, 40 otherwise", () => { expect(discoverySignificance(80, false)).toBe(65); expect(discoverySignificance(10, true)).toBe(65); expect(discoverySignificance(10, false)).toBe(40); expect(discoverySignificance(null, false)).toBe(40); }); }); describe("titles", () => { it("renders the planned capacity template", () => { const t = eventTitle("Compass Red Oak", spec("plannedPowerMw"), 120, 180); expect(t.summary).toBe("Planned capacity changed from 120 MW to 180 MW."); expect(t.title).toContain("planned capacity changed to 180 MW"); }); it("renders status and date templates", () => { expect(eventTitle("X", spec("status"), "announced", "under_construction").summary).toBe("Status changed from announced to under construction."); expect(eventTitle("X", spec("openedOn"), "2026", "2027-Q2").summary).toBe("Opening date changed from 2026 to Q2 2027."); }); });