import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { formatDuration, formatTime, escapeHtml, fmtNum, truncate, padZero, getBadgeClass, getTypeShort, animateValue, timeAgo, formatMarkdown, } from "./helpers"; describe("helpers", () => { describe("formatDuration", () => { it("returns em dash for null/undefined", () => { expect(formatDuration(null)).toBe("\u2014"); expect(formatDuration(undefined)).toBe("\u2014"); }); it("formats seconds (< 60)", () => { expect(formatDuration(0)).toBe("0s"); expect(formatDuration(30)).toBe("30s"); expect(formatDuration(59)).toBe("59s"); }); it("formats minutes and seconds (60-3599)", () => { expect(formatDuration(60)).toBe("1m 0s"); expect(formatDuration(90)).toBe("1m 30s"); expect(formatDuration(125)).toBe("2m 5s"); expect(formatDuration(3599)).toBe("59m 59s"); }); it("formats hours and minutes (>= 3600)", () => { expect(formatDuration(3600)).toBe("1h 0m"); expect(formatDuration(3661)).toBe("1h 1m"); expect(formatDuration(7325)).toBe("2h 2m"); }); it("floors fractional seconds", () => { expect(formatDuration(59.9)).toBe("59s"); expect(formatDuration(60.9)).toBe("1m 0s"); }); it("handles negative values (formats as seconds when abs < 60)", () => { expect(formatDuration(-5)).toBe("-5s"); expect(formatDuration(-65)).toBe("-65s"); }); }); describe("formatTime", () => { it("returns em dash for null/undefined/empty", () => { expect(formatTime(null)).toBe("\u2014"); expect(formatTime(undefined)).toBe("\u2014"); expect(formatTime("")).toBe("\u2014"); }); it("formats ISO string as HH:MM:SS (local time)", () => { const result = formatTime("2025-02-17T14:30:45Z"); expect(result).toMatch(/^\d{2}:\d{2}:\d{2}$/); const [, , sec] = result.split(":"); expect(Number(sec)).toBe(45); }); }); describe("escapeHtml", () => { it("returns empty string for null/undefined", () => { expect(escapeHtml(null)).toBe(""); expect(escapeHtml(undefined)).toBe(""); }); it("escapes XSS characters", () => { expect(escapeHtml(""); expect(result).toContain("<script>"); expect(result).not.toContain("