Use local date-only parsing and formatting across date inputs and filters so clicked dates persist exactly.\n\nVerified with local format, lint, i18n, build, full unit tests, PR E2E, focused date E2E, broad smoke reruns, and GitHub PR checks.
35 lines
1.4 KiB
JavaScript
35 lines
1.4 KiB
JavaScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { endOfLocalDate, formatLocalDateOnly, parseLocalDateOnly, startOfLocalDate } from "@/services/dateOnly.js";
|
|
|
|
describe("date-only helpers", () => {
|
|
it("formats Date objects from their local calendar date", () => {
|
|
expect(formatLocalDateOnly(new Date(2026, 2, 31, 0, 0, 0, 0))).toBe("2026-03-31");
|
|
});
|
|
|
|
it("parses date input values as local calendar dates", () => {
|
|
const parsed = parseLocalDateOnly("2026-03-31");
|
|
|
|
expect(parsed.getFullYear()).toBe(2026);
|
|
expect(parsed.getMonth()).toBe(2);
|
|
expect(parsed.getDate()).toBe(31);
|
|
expect(formatLocalDateOnly(parsed)).toBe("2026-03-31");
|
|
});
|
|
|
|
it("keeps date-only prefixes from API timestamps without timezone reinterpretation", () => {
|
|
expect(formatLocalDateOnly("2026-03-31T23:30:00.000Z")).toBe("2026-03-31");
|
|
});
|
|
|
|
it("rejects impossible date input values", () => {
|
|
expect(Number.isNaN(parseLocalDateOnly("2026-02-31").getTime())).toBe(true);
|
|
});
|
|
|
|
it("builds local day boundaries from the selected date", () => {
|
|
expect(startOfLocalDate("2026-03-31").getHours()).toBe(0);
|
|
expect(startOfLocalDate("2026-03-31").getMinutes()).toBe(0);
|
|
expect(endOfLocalDate("2026-03-31").getHours()).toBe(23);
|
|
expect(endOfLocalDate("2026-03-31").getMinutes()).toBe(59);
|
|
expect(formatLocalDateOnly(endOfLocalDate("2026-03-31"))).toBe("2026-03-31");
|
|
});
|
|
});
|