|
@@ -0,0 +1,85 @@
|
|
|
|
|
+/* @vitest-environment node */
|
|
|
|
|
+
|
|
|
|
|
+import { describe, it, expect } from "vitest";
|
|
|
|
|
+import {
|
|
|
|
|
+ normalizeDayClickArgs,
|
|
|
|
|
+ buildCalendarState,
|
|
|
|
|
+} from "./dateRangePickerUtils.js";
|
|
|
|
|
+
|
|
|
|
|
+describe("lib/frontend/search/dateRangePickerUtils", () => {
|
|
|
|
|
+ describe("normalizeDayClickArgs", () => {
|
|
|
|
|
+ it("supports (day, modifiers) signature", () => {
|
|
|
|
|
+ const day = new Date(2026, 0, 10);
|
|
|
|
|
+ const modifiers = { disabled: false };
|
|
|
|
|
+
|
|
|
|
|
+ const out = normalizeDayClickArgs([day, modifiers]);
|
|
|
|
|
+ expect(out.day).toBe(day);
|
|
|
|
|
+ expect(out.modifiers).toBe(modifiers);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("supports (event, day, modifiers) signature", () => {
|
|
|
|
|
+ const day = new Date(2026, 0, 10);
|
|
|
|
|
+ const modifiers = { disabled: true };
|
|
|
|
|
+
|
|
|
|
|
+ const out = normalizeDayClickArgs([{}, day, modifiers]);
|
|
|
|
|
+ expect(out.day).toBe(day);
|
|
|
|
|
+ expect(out.modifiers).toBe(modifiers);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("returns nulls for unknown inputs", () => {
|
|
|
|
|
+ const out = normalizeDayClickArgs([{}, {}, {}]);
|
|
|
|
|
+ expect(out).toEqual({ day: null, modifiers: null });
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ describe("buildCalendarState", () => {
|
|
|
|
|
+ it("builds a valid selected range", () => {
|
|
|
|
|
+ const from = new Date(2026, 0, 1);
|
|
|
|
|
+ const to = new Date(2026, 0, 5);
|
|
|
|
|
+
|
|
|
|
|
+ const out = buildCalendarState({
|
|
|
|
|
+ fromDate: from,
|
|
|
|
|
+ toDate: to,
|
|
|
|
|
+ isRangeInvalid: false,
|
|
|
|
|
+ });
|
|
|
|
|
+ expect(out.calendarSelected).toEqual({ from, to });
|
|
|
|
|
+ expect(out.calendarModifiers).toBe(undefined);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("builds an invalid interval and modifiers when range is invalid", () => {
|
|
|
|
|
+ const from = new Date(2026, 0, 10);
|
|
|
|
|
+ const to = new Date(2026, 0, 5);
|
|
|
|
|
+
|
|
|
|
|
+ const out = buildCalendarState({
|
|
|
|
|
+ fromDate: from,
|
|
|
|
|
+ toDate: to,
|
|
|
|
|
+ isRangeInvalid: true,
|
|
|
|
|
+ });
|
|
|
|
|
+ expect(out.calendarSelected.from <= out.calendarSelected.to).toBe(true);
|
|
|
|
|
+ expect(out.calendarModifiers).toBeTruthy();
|
|
|
|
|
+ expect(out.calendarModifiersClassNames).toBeTruthy();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("supports open range (from only)", () => {
|
|
|
|
|
+ const from = new Date(2026, 0, 2);
|
|
|
|
|
+
|
|
|
|
|
+ const out = buildCalendarState({
|
|
|
|
|
+ fromDate: from,
|
|
|
|
|
+ toDate: null,
|
|
|
|
|
+ isRangeInvalid: false,
|
|
|
|
|
+ });
|
|
|
|
|
+ expect(out.calendarSelected).toEqual({ from, to: undefined });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("supports to-only (single-day range)", () => {
|
|
|
|
|
+ const to = new Date(2026, 0, 2);
|
|
|
|
|
+
|
|
|
|
|
+ const out = buildCalendarState({
|
|
|
|
|
+ fromDate: null,
|
|
|
|
|
+ toDate: to,
|
|
|
|
|
+ isRangeInvalid: false,
|
|
|
|
|
+ });
|
|
|
|
|
+ expect(out.calendarSelected).toEqual({ from: to, to });
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+});
|