/** * Tests for cooldown-history shape — status-derivation + pagination cursor. */ import { describe, expect, it } from "vitest"; type CooldownRow = { id: string; reason: string | null; cooldownStartedAt: Date; cooldownEndsAt: Date; resolvedAt: Date | null; cancelledAt: Date | null; }; // Inline-replication of the endpoint's status-derivation logic — keeps test // fast and independent of full nitro-event-handler boot. function deriveStatus(r: CooldownRow): "active" | "resolved" | "cancelled" { if (r.cancelledAt) return "cancelled"; if (r.resolvedAt || r.cooldownEndsAt <= new Date()) return "resolved"; return "active"; } describe("cooldown-history status derivation", () => { it("returns 'cancelled' if cancelledAt is set", () => { expect( deriveStatus({ id: "1", reason: null, cooldownStartedAt: new Date("2026-04-01"), cooldownEndsAt: new Date("2026-04-02"), resolvedAt: null, cancelledAt: new Date("2026-04-01T12:00"), }), ).toBe("cancelled"); }); it("returns 'resolved' if resolvedAt is set", () => { expect( deriveStatus({ id: "1", reason: null, cooldownStartedAt: new Date("2026-04-01"), cooldownEndsAt: new Date("2026-04-02"), resolvedAt: new Date("2026-04-02"), cancelledAt: null, }), ).toBe("resolved"); }); it("returns 'resolved' if cooldownEndsAt is in the past (auto-resolved)", () => { expect( deriveStatus({ id: "1", reason: null, cooldownStartedAt: new Date("2026-01-01"), cooldownEndsAt: new Date("2026-01-02"), resolvedAt: null, cancelledAt: null, }), ).toBe("resolved"); }); it("returns 'active' if cooldownEndsAt is in the future + nothing set", () => { const future = new Date(Date.now() + 24 * 60 * 60 * 1000); expect( deriveStatus({ id: "1", reason: null, cooldownStartedAt: new Date(), cooldownEndsAt: future, resolvedAt: null, cancelledAt: null, }), ).toBe("active"); }); }); describe("cooldown-history pagination math", () => { it("computes durationMinutes correctly", () => { const start = new Date("2026-04-01T10:00:00Z"); const end = new Date("2026-04-01T22:00:00Z"); const minutes = Math.round((end.getTime() - start.getTime()) / 60_000); expect(minutes).toBe(720); // 12h }); it("clamps limit to MAX_LIMIT=50", () => { const requested = 9999; const limit = Math.min(50, Math.max(1, requested)); expect(limit).toBe(50); }); it("falls back to default 20 when limit is missing/invalid", () => { const limit = Math.min(50, Math.max(1, parseInt("" as string, 10) || 20)); expect(limit).toBe(20); }); });