import { describe, expect, it } from "vitest";
import {
addParams,
compareParams,
differenceParams,
formatParams,
subtractParams,
} from "../params.js";
// Helper to make ISO string for clarity
const iso = (d: Date) => d.toISOString();
describe("formatParams", () => {
it("accepts valid params", () => {
const data = { datetime: iso(new Date()), format: "yyyy-MM-dd" };
const parsed = formatParams.parse(data);
expect(parsed).toEqual(data);
});
it.each([
{ case: "missing date", data: { format: "yyyy-MM-dd" } },
{ case: "missing format", data: { datetime: iso(new Date()) } },
{ case: "invalid date format", data: { date: "not-a-date", format: "x" } },
])("rejects invalid: $case", ({ data }) => {
expect(() => formatParams.parse(data as never)).toThrowError();
});
});
describe("addParams", () => {
it("accepts valid params", () => {
const data = { datetime: iso(new Date()), duration: { years: 1 } };
const parsed = addParams.parse(data);
expect(parsed).toEqual(data);
});
// z.custom() accepts any value, and the field is treated permissively here
it.each([
{ case: "missing duration", data: { datetime: iso(new Date()) } },
{
case: "invalid duration type",
data: {
datetime: iso(new Date()),
duration: {
years: 1,
},
},
},
])("allows duration variations: $case", ({ data }) => {
expect(() => addParams.parse(data as never)).not.toThrowError();
const parsed = addParams.parse(data as never);
expect(parsed).toEqual(data);
});
});
describe("subtractParams", () => {
it("accepts valid params", () => {
const data = { datetime: iso(new Date()), duration: { months: 2 } };
const parsed = subtractParams.parse(data);
expect(parsed).toEqual(data);
});
it.each([
{ case: "missing duration", data: { datetime: iso(new Date()) } },
{
case: "invalid duration type",
data: {
datetime: iso(new Date()),
duration: {
years: 1,
},
},
},
])("allows duration variations: $case", ({ data }) => {
expect(() => subtractParams.parse(data as never)).not.toThrowError();
const parsed = subtractParams.parse(data as never);
expect(parsed).toEqual(data);
});
});
describe("differenceParams", () => {
it("accepts valid params", () => {
const data = {
datetimeFrom: iso(new Date()),
datetimeTo: iso(new Date(Date.now() + 1000)),
unit: "seconds" as const,
};
const parsed = differenceParams.parse(data);
expect(parsed).toEqual(data);
});
});
describe("compareParams", () => {
it("accepts valid params", () => {
const data = {
firstDatetime: iso(new Date()),
secondDatetime: iso(new Date()),
operator: "after" as const,
};
const parsed = compareParams.parse(data);
expect(parsed).toEqual(data);
});
});