milestone 30: overview as a dashboard, explicit health contract, period aggregations
Gates / frontend (push) Successful in 1m32s
Gates / test (push) Successful in 1m54s
Gates / package (push) Successful in 5m28s
Gates / container (push) Successful in 14s
Gates / test-aarch64 (push) Failing after 3h10m0s
CI / gates (push) Failing after 3h11m55s
Gates / frontend (push) Successful in 1m32s
Gates / test (push) Successful in 1m54s
Gates / package (push) Successful in 5m28s
Gates / container (push) Successful in 14s
Gates / test-aarch64 (push) Failing after 3h10m0s
CI / gates (push) Failing after 3h11m55s
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* The health-fact matrix, migrated whole from the Overview status rows this
|
||||
* replaces. Same states, same words, same link matrix — with the Diagnostics
|
||||
* links now narrowing the page the strip sits on rather than navigating to it.
|
||||
*/
|
||||
|
||||
import { health } from "@/lib/healthFixture";
|
||||
import { healthFacts, type HealthFact } from "./healthFacts";
|
||||
|
||||
const LOCALE = "en-GB";
|
||||
const TZ = "UTC";
|
||||
|
||||
function factsBy(overrides: Parameters<typeof health>[0] = {}): Record<string, HealthFact> {
|
||||
return Object.fromEntries(healthFacts(health(overrides), LOCALE, TZ).map((fact) => [fact.key, fact]));
|
||||
}
|
||||
|
||||
test("a healthy box is five quiet facts, none of them linking anywhere", () => {
|
||||
const facts = healthFacts(health(), LOCALE, TZ);
|
||||
expect(facts.map((fact) => fact.key)).toEqual(["protection", "upstreams", "query_history", "diagnostics", "disk"]);
|
||||
expect(facts.every((fact) => fact.tone === "ok")).toBe(true);
|
||||
expect(facts.every((fact) => fact.link === undefined)).toBe(true);
|
||||
});
|
||||
|
||||
test("protection: active, paused indefinitely, paused until a time, unavailable", () => {
|
||||
expect(factsBy()["protection"].value).toBe("Active");
|
||||
expect(factsBy({ protection: { state: "paused", until: null } })["protection"].value).toBe("Paused");
|
||||
const timed = factsBy({ protection: { state: "paused", until: Date.UTC(2026, 0, 1, 14, 5) / 1000 } })["protection"];
|
||||
expect(timed.value).toBe("Paused until 14:05");
|
||||
const gone = factsBy({ protection: { state: "unavailable", until: null } })["protection"];
|
||||
expect(gone.value).toBe("Unavailable");
|
||||
expect(gone.link).toEqual({ kind: "route", to: "/blocklists", label: "Blocklists" });
|
||||
});
|
||||
|
||||
test("a pause never reads as a fault, and never carries a way out", () => {
|
||||
const paused = factsBy({ protection: { state: "paused", until: null } })["protection"];
|
||||
expect(paused.tone).toBe("notice");
|
||||
expect(paused.link).toBeUndefined();
|
||||
});
|
||||
|
||||
test("upstreams count the enabled pool, and only an empty one links out", () => {
|
||||
const ok = factsBy({ upstreams: { state: "ok", available: 1, total: 3 } })["upstreams"];
|
||||
expect(ok.value).toBe("Available");
|
||||
expect(ok.detail).toBe("1 of 3 enabled");
|
||||
expect(ok.link).toBeUndefined();
|
||||
const none = factsBy({ upstreams: { state: "unavailable", available: 0, total: 3 } })["upstreams"];
|
||||
expect(none.value).toBe("None reachable");
|
||||
expect(none.link).toEqual({ kind: "route", to: "/upstreams", label: "Upstreams" });
|
||||
});
|
||||
|
||||
test("query history: losing blames the disk gate, a failed writer blames the query log", () => {
|
||||
const losing = factsBy({ query_history: { state: "losing", dropped_total: 0, last_drop_s: null } })[
|
||||
"query_history"
|
||||
];
|
||||
expect(losing.value).toBe("Losing rows");
|
||||
expect(losing.link).toEqual({ kind: "filter", component: "disk", label: "Disk diagnostics" });
|
||||
const failed = factsBy({ query_history: { state: "failed", dropped_total: 0, last_drop_s: null } })[
|
||||
"query_history"
|
||||
];
|
||||
expect(failed.value).toBe("Writer failed");
|
||||
expect(failed.link).toEqual({ kind: "filter", component: "query_log", label: "Query log diagnostics" });
|
||||
});
|
||||
|
||||
test("drops are reported while recording, with or without a stamp on the last one", () => {
|
||||
const stamped = factsBy({
|
||||
query_history: { state: "recording", dropped_total: 5, last_drop_s: Date.UTC(2026, 0, 1, 9, 30) / 1000 },
|
||||
})["query_history"];
|
||||
expect(stamped.tone).toBe("ok");
|
||||
expect(stamped.detail).toBe("5 queries dropped, last at 09:30");
|
||||
const unstamped = factsBy({ query_history: { state: "recording", dropped_total: 1, last_drop_s: null } })[
|
||||
"query_history"
|
||||
];
|
||||
expect(unstamped.detail).toBe("1 query dropped");
|
||||
expect(factsBy()["query_history"].detail).toBeUndefined();
|
||||
});
|
||||
|
||||
test("an unavailable diagnostics store explains itself and links nowhere", () => {
|
||||
const fact = factsBy({ diagnostics: { state: "unavailable", active_warnings: 0, active_errors: 0 } })[
|
||||
"diagnostics"
|
||||
];
|
||||
expect(fact.value).toBe("Unavailable");
|
||||
expect(fact.detail).toContain("not being recorded");
|
||||
// The page a link would filter is the thing that is broken.
|
||||
expect(fact.link).toBeUndefined();
|
||||
});
|
||||
|
||||
test("storage names the three disk states and always shows what is free", () => {
|
||||
expect(factsBy()["disk"].value).toBe("OK");
|
||||
expect(factsBy()["disk"].link).toBeUndefined();
|
||||
const low = factsBy({ disk: { state: "low", free_bytes: 1024 } })["disk"];
|
||||
expect(low.value).toBe("Low");
|
||||
expect(low.tone).toBe("warn");
|
||||
expect(low.link).toEqual({ kind: "filter", component: "disk", label: "Disk diagnostics" });
|
||||
const critical = factsBy({ disk: { state: "critical", free_bytes: 0 } })["disk"];
|
||||
expect(critical.value).toBe("Critical");
|
||||
expect(critical.tone).toBe("danger");
|
||||
expect(critical.detail).toBe("0 B free");
|
||||
});
|
||||
Reference in New Issue
Block a user