File size: 1,966 Bytes
76289e7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | // Console timestamp tests cover timestamp prefixes for console logging.
import { afterEach, describe, expect, it, vi } from "vitest";
import { formatConsoleTimestamp } from "./console.js";
describe("formatConsoleTimestamp", () => {
afterEach(() => {
vi.useRealTimers();
});
function pad2(n: number) {
return String(n).padStart(2, "0");
}
function pad3(n: number) {
return String(n).padStart(3, "0");
}
function formatExpectedLocalIsoWithOffset(now: Date) {
const year = now.getFullYear();
const month = pad2(now.getMonth() + 1);
const day = pad2(now.getDate());
const h = pad2(now.getHours());
const m = pad2(now.getMinutes());
const s = pad2(now.getSeconds());
const ms = pad3(now.getMilliseconds());
const tzOffset = now.getTimezoneOffset();
const tzSign = tzOffset <= 0 ? "+" : "-";
const tzHours = pad2(Math.floor(Math.abs(tzOffset) / 60));
const tzMinutes = pad2(Math.abs(tzOffset) % 60);
return `${year}-${month}-${day}T${h}:${m}:${s}.${ms}${tzSign}${tzHours}:${tzMinutes}`;
}
it("pretty style returns local HH:MM:SS without timezone suffix", () => {
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-01-17T18:01:02.345Z"));
const result = formatConsoleTimestamp("pretty");
const now = new Date();
const h = pad2(now.getHours());
const m = pad2(now.getMinutes());
const s = pad2(now.getSeconds());
expect(result).toBe(`${h}:${m}:${s}`);
});
it.each(["compact", "json"] as const)(
"%s style returns local ISO-like timestamp with timezone offset",
(style) => {
const result = formatConsoleTimestamp(style);
expect(result).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{2}:\d{2}$/);
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-01-17T18:01:02.345Z"));
const now = new Date();
expect(formatConsoleTimestamp(style)).toBe(formatExpectedLocalIsoWithOffset(now));
},
);
});
|