import { describe, expect, it } from "vitest"; import { nextHealthState } from "../src/services/health/state-machine.js"; const thresholds = { degradedFailures: 1, downFailures: 2, successRecoveries: 2, latencyWarnMs: 1000, }; describe("health state machine", () => { it("first success from unknown is healthy immediately", () => { const next = nextHealthState(true, 20, null, thresholds); expect(next.legacy).toBe("up"); expect(next.node).toBe("healthy"); }); it("recovery from down goes checking until consecutive successes", () => { const first = nextHealthState( true, 10, { status: "down", consecutive_failures: 3, consecutive_successes: 0 }, thresholds, ); expect(first.node).toBe("checking"); expect(first.legacy).toBe("unknown"); const second = nextHealthState( true, 10, { status: "checking", consecutive_failures: 0, consecutive_successes: first.successes, }, thresholds, ); expect(second.node).toBe("healthy"); expect(second.legacy).toBe("up"); }); it("two failures mark unhealthy", () => { const first = nextHealthState( false, 5, { status: "up", consecutive_failures: 0, consecutive_successes: 1 }, thresholds, ); expect(first.node).toBe("degraded"); const second = nextHealthState( false, 5, { status: "degraded", consecutive_failures: first.failures, consecutive_successes: 0, }, thresholds, ); expect(second.node).toBe("unhealthy"); expect(second.legacy).toBe("down"); }); });