import { describe, expect, it } from "@effect/vitest";import { formatRelativeTime } from "./relative-time";const now = Date.UTC(2026, 6, 27, 12, 0, 0);const ago = (ms: number): number => now - ms;const MINUTE = 60_000;const HOUR = 60 * MINUTE;const DAY = 24 * HOUR;describe("formatRelativeTime", () => { it("collapses anything under a minute to 'just now'", () => { expect(formatRelativeTime(now, now)).toBe("just now"); expect(formatRelativeTime(ago(59_000), now)).toBe("just now"); }); it("counts minutes, then hours, then days", () => { expect(formatRelativeTime(ago(MINUTE), now)).toBe("1m ago"); expect(formatRelativeTime(ago(59 * MINUTE), now)).toBe("59m ago"); expect(formatRelativeTime(ago(HOUR), now)).toBe("1h ago"); expect(formatRelativeTime(ago(23 * HOUR), now)).toBe("23h ago"); expect(formatRelativeTime(ago(DAY), now)).toBe("1d ago"); expect(formatRelativeTime(ago(6 * DAY), now)).toBe("6d ago"); }); it("falls back to an absolute date once a week has passed", () => { // Beyond a week the relative figure stops being useful, so the exact date // is shown instead of an ever-growing day count. expect(formatRelativeTime(ago(7 * DAY), now)).not.toContain("ago"); }); it("never renders a future timestamp as negative", () => { // Clock skew between server and browser must not produce "-3m ago". expect(formatRelativeTime(now + HOUR, now)).toBe("just now"); });});
import { describe, expect, it } from "@effect/vitest";
import { formatRelativeTime } from "./relative-time";
const now = Date.UTC(2026, 6, 27, 12, 0, 0);
const ago = (ms: number): number => now - ms;
const MINUTE = 60_000;
const HOUR = 60 * MINUTE;
const DAY = 24 * HOUR;
describe("formatRelativeTime", () => {
it("collapses anything under a minute to 'just now'", () => {
expect(formatRelativeTime(now, now)).toBe("just now");
expect(formatRelativeTime(ago(59_000), now)).toBe("just now");
});
it("counts minutes, then hours, then days", () => {
expect(formatRelativeTime(ago(MINUTE), now)).toBe("1m ago");
expect(formatRelativeTime(ago(59 * MINUTE), now)).toBe("59m ago");
expect(formatRelativeTime(ago(HOUR), now)).toBe("1h ago");
expect(formatRelativeTime(ago(23 * HOUR), now)).toBe("23h ago");
expect(formatRelativeTime(ago(DAY), now)).toBe("1d ago");
expect(formatRelativeTime(ago(6 * DAY), now)).toBe("6d ago");
});
it("falls back to an absolute date once a week has passed", () => {
// Beyond a week the relative figure stops being useful, so the exact date
// is shown instead of an ever-growing day count.
expect(formatRelativeTime(ago(7 * DAY), now)).not.toContain("ago");
});
it("never renders a future timestamp as negative", () => {
// Clock skew between server and browser must not produce "-3m ago".
expect(formatRelativeTime(now + HOUR, now)).toBe("just now");
});
});