// @vitest-environment jsdom // // docs/DESIGN.md "Copy": a relative time in a list carries the exact moment on hover. import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/react"; import { formatDateTime, formatDateTimeSec, relativeTime } from "../../lib/format"; import i18n from "../../i18n"; // the real instance, in English: the component names time in the UI language import { RelativeTime } from "./RelativeTime"; afterEach(cleanup); const THREE_DAYS_AGO = new Date(Date.now() - 3 * 86400_000).toISOString(); describe("RelativeTime", () => { it("says how long ago, and names the exact minute on hover", () => { const { container } = render(); const el = container.querySelector("time")!; expect(el.textContent).toBe(relativeTime(THREE_DAYS_AGO, "en", i18n.t)); expect(el.getAttribute("title")).toBe(formatDateTime(THREE_DAYS_AGO, "en")); expect(el.getAttribute("dateTime")).toBe(THREE_DAYS_AGO); }); it("takes epoch millis, and the log form with seconds", () => { const ms = Date.parse(THREE_DAYS_AGO); const { container } = render(); expect(container.querySelector("time")!.getAttribute("title")).toBe( formatDateTimeSec(THREE_DAYS_AGO, "en"), ); }); it("shows the placeholder for a missing or unreadable moment, never a bare title", () => { const { container } = render( <> , ); expect(container.textContent).toBe("—"); expect(container.querySelector("time")).toBeNull(); }); });