feat(portal): M10.1 — fill the 10 customer-area shells
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
This commit was merged in pull request #12.
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user