import { expect, test, describe } from "vitest";
import {
addTool,
compareTool,
differenceTool,
formatTool,
nowTool,
subtractTool,
} from "../tools.js";
import { add, format, sub } from "date-fns";
test("now tool", async () => {
const date = new Date();
const result = await nowTool();
expect(result.text).toBe(date.toISOString());
});
test("format tool", async () => {
const date = new Date();
const expected = format(date, "yyyy-MM-dd");
const result = await formatTool({
datetime: date.toISOString(),
format: "yyyy-MM-dd",
});
expect(result.text).toBe(expected);
});
test("add tool", async () => {
const date = new Date();
const expected = add(date, { years: 1 });
const result = await addTool({
datetime: date.toISOString(),
duration: {
years: 1,
months: 0,
weeks: 0,
days: 0,
hours: 0,
minutes: 0,
seconds: 0,
},
});
expect(result.text).toBe(expected.toISOString());
});
test("subtract tool", async () => {
const date = new Date();
const expected = sub(date, { years: 1 });
const result = await subtractTool({
datetime: date.toISOString(),
duration: {
years: 1,
months: 0,
weeks: 0,
days: 0,
hours: 0,
minutes: 0,
seconds: 0,
},
});
expect(result.text).toBe(expected.toISOString());
});
describe("difference tool", async () => {
test("difference in seconds", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { seconds: 1 });
const result = await differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "seconds",
});
expect(result.text).toBe(
`Difference between ${dateFrom.toISOString()} and ${dateTo.toISOString()} is 1 seconds`
);
});
test("difference in minutes", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { minutes: 1, seconds: 1 });
const result = await differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "minutes",
});
expect(result.text).toBe(
`Difference between ${dateFrom.toISOString()} and ${dateTo.toISOString()} is 1 minutes`
);
});
test("difference in hours", async () => {
const dateFrom = new Date();
const dateTo = await add(dateFrom, { hours: 1, minutes: 1, seconds: 1 });
const result = await differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "hours",
});
expect(result.text).toBe(
`Difference between ${dateFrom.toISOString()} and ${dateTo.toISOString()} is 1 hours`
);
});
test("difference in days", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { days: 1, hours: 1, minutes: 1, seconds: 1 });
const result = await differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "days",
});
expect(result.text).toBe(
`Difference between ${dateFrom.toISOString()} and ${dateTo.toISOString()} is 1 days`
);
});
test("difference in weeks", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, {
weeks: 1,
days: 1,
hours: 1,
minutes: 1,
seconds: 1,
});
const result = await differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "weeks",
});
expect(result.text).toBe(
`Difference between ${dateFrom.toISOString()} and ${dateTo.toISOString()} is 1 weeks`
);
});
test("difference in months", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, {
months: 1,
weeks: 1,
days: 1,
hours: 1,
minutes: 1,
seconds: 1,
});
const result = await differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "months",
});
expect(result.text).toBe(
`Difference between ${dateFrom.toISOString()} and ${dateTo.toISOString()} is 1 months`
);
});
test("difference in years", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, {
years: 1,
months: 1,
weeks: 1,
days: 1,
hours: 1,
minutes: 1,
seconds: 1,
});
const result = await differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "years",
});
expect(result.text).toBe(
`Difference between ${dateFrom.toISOString()} and ${dateTo.toISOString()} is 1 years`
);
});
test("difference in invalid unit", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { years: 1 });
await expect(
differenceTool({
datetimeFrom: dateFrom.toISOString(),
datetimeTo: dateTo.toISOString(),
unit: "something" as never,
})
).rejects.toThrow("Invalid unit: something");
});
});
describe("compare tool", async () => {
describe("compare after", async () => {
test("compare after false", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { seconds: 1 });
const result = await compareTool({
firstDatetime: dateFrom.toISOString(),
secondDatetime: dateTo.toISOString(),
operator: "after",
});
expect(result.text).toBe(`false`);
});
test("compare after true", async () => {
const dateFrom = new Date();
const dateTo = sub(dateFrom, { seconds: 1 });
const result = await compareTool({
firstDatetime: dateFrom.toISOString(),
secondDatetime: dateTo.toISOString(),
operator: "after",
});
expect(result.text).toBe(`true`);
});
});
describe("compare before", async () => {
test("compare before false", async () => {
const dateFrom = new Date();
const dateTo = sub(dateFrom, { seconds: 1 });
const result = await compareTool({
firstDatetime: dateFrom.toISOString(),
secondDatetime: dateTo.toISOString(),
operator: "before",
});
expect(result.text).toBe(`false`);
});
test("compare before true", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { seconds: 1 });
const result = await compareTool({
firstDatetime: dateFrom.toISOString(),
secondDatetime: dateTo.toISOString(),
operator: "before",
});
expect(result.text).toBe(`true`);
});
});
describe("compare equal", async () => {
test("compare equal false", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { seconds: 1 });
const result = await compareTool({
firstDatetime: dateFrom.toISOString(),
secondDatetime: dateTo.toISOString(),
operator: "equal",
});
expect(result.text).toBe(`false`);
});
test("compare equal true", async () => {
const dateFrom = new Date();
const dateTo = dateFrom;
const result = await compareTool({
firstDatetime: dateFrom.toISOString(),
secondDatetime: dateTo.toISOString(),
operator: "equal",
});
expect(result.text).toBe(`true`);
});
});
test("compare in invalid unit", async () => {
const dateFrom = new Date();
const dateTo = add(dateFrom, { years: 1 });
await expect(
compareTool({
firstDatetime: dateFrom.toISOString(),
secondDatetime: dateTo.toISOString(),
operator: "something" as never,
})
).rejects.toThrow("Invalid operator: something");
});
});