|
|
@@ -0,0 +1,77 @@
|
|
|
+import { DateTimeFormat } from "src/locale";
|
|
|
+import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
|
+
|
|
|
+describe("DateFormatter", () => {
|
|
|
+ // Keep a reference to the real Intl to restore later
|
|
|
+ const RealIntl = global.Intl;
|
|
|
+ const desiredTimeZone = "Europe/London";
|
|
|
+ const desiredLocale = "en-GB";
|
|
|
+
|
|
|
+ beforeAll(() => {
|
|
|
+ // Ensure Node-based libs using TZ behave deterministically
|
|
|
+ try {
|
|
|
+ process.env.TZ = desiredTimeZone;
|
|
|
+ } catch {
|
|
|
+ // ignore if not available
|
|
|
+ }
|
|
|
+
|
|
|
+ // Mock Intl.DateTimeFormat so formatting is stable regardless of host
|
|
|
+ const MockedDateTimeFormat = class extends RealIntl.DateTimeFormat {
|
|
|
+ constructor(
|
|
|
+ _locales?: string | string[],
|
|
|
+ options?: Intl.DateTimeFormatOptions,
|
|
|
+ ) {
|
|
|
+ super(desiredLocale, {
|
|
|
+ ...options,
|
|
|
+ timeZone: desiredTimeZone,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } as unknown as typeof Intl.DateTimeFormat;
|
|
|
+
|
|
|
+ global.Intl = {
|
|
|
+ ...RealIntl,
|
|
|
+ DateTimeFormat: MockedDateTimeFormat,
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ afterAll(() => {
|
|
|
+ // Restore original Intl after tests
|
|
|
+ global.Intl = RealIntl;
|
|
|
+ });
|
|
|
+
|
|
|
+ it("format date from iso date", () => {
|
|
|
+ const value = "2024-01-01T00:00:00.000Z";
|
|
|
+ const text = DateTimeFormat(value);
|
|
|
+ expect(text).toBe("Monday, 01/01/2024, 12:00:00 am");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("format date from unix timestamp number", () => {
|
|
|
+ const value = 1762476112;
|
|
|
+ const text = DateTimeFormat(value);
|
|
|
+ expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("format date from unix timestamp string", () => {
|
|
|
+ const value = "1762476112";
|
|
|
+ const text = DateTimeFormat(value);
|
|
|
+ expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("catch bad format from string", () => {
|
|
|
+ const value = "this is not a good date";
|
|
|
+ const text = DateTimeFormat(value);
|
|
|
+ expect(text).toBe("this is not a good date");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("catch bad format from number", () => {
|
|
|
+ const value = -100;
|
|
|
+ const text = DateTimeFormat(value);
|
|
|
+ expect(text).toBe("-100");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("catch bad format from number as string", () => {
|
|
|
+ const value = "-100";
|
|
|
+ const text = DateTimeFormat(value);
|
|
|
+ expect(text).toBe("-100");
|
|
|
+ });
|
|
|
+});
|