import { describe, expect, test } from "vitest"; import { formatDateTime, formatRelative, truncate } from "./format"; describe("formatRelative", () => { const NOW = new Date("2026-05-20T12:00:00Z").getTime(); test("seconds ago", () => { expect(formatRelative("2026-05-20T11:59:50Z", NOW)).toBe("10 seconds ago"); }); test("singular unit", () => { expect(formatRelative("2026-05-20T11:59:59Z", NOW)).toBe("1 second ago"); }); test("minutes ago", () => { expect(formatRelative("2026-05-20T11:55:00Z", NOW)).toBe("5 minutes ago"); }); test("hours ago", () => { expect(formatRelative("2026-05-20T09:00:00Z", NOW)).toBe("3 hours ago"); }); test("days ago", () => { expect(formatRelative("2026-05-13T12:00:00Z", NOW)).toBe("1 week ago"); }); test("future", () => { expect(formatRelative("2026-06-03T12:00:00Z", NOW)).toBe("in 2 weeks"); }); test("malformed input returns the input", () => { expect(formatRelative("not-a-date", NOW)).toBe("not-a-date"); }); test("years ago", () => { expect(formatRelative("2024-05-20T12:00:00Z", NOW)).toBe("2 years ago"); }); test("months ago", () => { expect(formatRelative("2026-01-20T12:00:00Z", NOW)).toBe("4 months ago"); }); }); describe("formatDateTime", () => { test("formats UTC", () => { expect(formatDateTime("2026-05-20T12:34:56Z")).toBe("2026-05-20 12:34:56 UTC"); }); test("malformed input returns input", () => { expect(formatDateTime("nope")).toBe("nope"); }); }); describe("truncate", () => { test("short string unchanged", () => { expect(truncate("hi", 10)).toBe("hi"); }); test("long string truncated with ellipsis", () => { expect(truncate("abcdefghij", 6)).toBe("abcde…"); }); test("default max", () => { expect(truncate("x".repeat(50)).length).toBe(40); }); });