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("