Four real surfaces wired to tenant-registry (settings, settings/api-keys CRUD, audit pagination, products live entitlements), five forward-looking empty states with CTAs. 56 vitest tests + 10 Playwright canaries. lib/format.ts consolidates date helpers. Refs: M10.1
55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
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);
|
|
});
|
|
});
|