import { describe, expect, it } from "@suaveplan/testing/runner"; import { TemplateEngine } from "../../engine/TemplateEngine.js"; import { createDateTimePlugin } from "./DateTimePlugin.js"; // Fixed clock: 2024-06-15 09:05:03.007 const FIXED_MS = new Date(2024, 5, 15, 9, 5, 3, 7).getTime(); const clock = () => FIXED_MS; function engine() { return new TemplateEngine().use(createDateTimePlugin({ clock })); } describe("createDateTimePlugin", () => { it("formats _date as YYYY-MM-DD", { timeout: 5000 }, () => { expect(engine().parse("{_date}", {})).toBe("2024-06-15"); }); it("formats _date with custom pattern", { timeout: 5000 }, () => { expect(engine().parse("{_date:DD/MM/YYYY}", {})).toBe("15/06/2024"); }); it("formats _time as HH:mm:ss", { timeout: 5000 }, () => { expect(engine().parse("{_time}", {})).toBe("09:05:03"); }); it("formats _time with custom pattern", { timeout: 5000 }, () => { expect(engine().parse("{_time:HH:mm}", {})).toBe("09:05"); }); it("formats _datetime with default pattern", { timeout: 5000 }, () => { expect(engine().parse("{_datetime}", {})).toBe("2024-06-15 09:05:03"); }); it("formats _timestamp in milliseconds", { timeout: 5000 }, () => { expect(engine().parse("{_timestamp}", {})).toBe(String(FIXED_MS)); }); it("formats _timestamp in seconds", { timeout: 5000 }, () => { expect(engine().parse("{_timestamp:s}", {})).toBe( String(Math.floor(FIXED_MS / 1000)) ); }); it("uses real Date.now when no clock provided", { timeout: 5000 }, () => { const e = new TemplateEngine().use(createDateTimePlugin()); const result = e.parse("{_date}", {}); // Should be a valid date string expect(result).toMatch(/^\d{4}-\d{2}-\d{2}$/); }); it("returns original match for unknown type", { timeout: 5000 }, () => { // The pattern won't match unknown types, this tests the default branch // We inject directly by calling transform const plugin = createDateTimePlugin({ clock }); const match = { match: "{_other}", groups: Object.assign(["{_other}", "other", undefined], { index: 0, input: "{_other}", }) as RegExpMatchArray, index: 0, }; expect(plugin.transform(match)).toBe("{_other}"); }); });