@navikt/ds-react
Version:
React components from the Norwegian Labour and Welfare Administration.
132 lines (115 loc) • 4.07 kB
text/typescript
import { renderHook } from "@testing-library/react";
import { addDays, isSameDay } from "date-fns";
import { describe, expect, test } from "vitest";
import {
useEarliestDate,
useLatestDate,
useTimelineRows,
} from "../hooks/useTimelineRows";
describe("useEarliestDate", () => {
test("returns the provided startDate if it exists", () => {
const startDate = new Date(2023, 0, 1);
const { result } = renderHook(() =>
useEarliestDate({ startDate, rows: [] }),
);
expect(result.current).toEqual(startDate);
});
test("returns the earliest date from the rows if startDate is not provided", () => {
const rows = [
[{ start: new Date(2023, 0, 1) }],
[{ start: new Date(2022, 0, 1) }],
];
const { result } = renderHook(() => useEarliestDate({ rows }));
expect(result.current).toEqual(new Date(2022, 0, 1));
});
test("returns the earliest date from the rows if startDate is not provided and date is later than todays date", () => {
const earliestDate = addDays(new Date(), 400);
const rows = [
[{ start: earliestDate }],
[{ start: addDays(earliestDate, 40) }],
];
const { result } = renderHook(() => useEarliestDate({ rows }));
expect(result.current).toEqual(earliestDate);
});
test("returns the current date if no startDate and rows are empty", () => {
const { result } = renderHook(() => useEarliestDate({ rows: [] }));
expect(isSameDay(result.current, new Date())).toBeTruthy();
});
});
describe("useLatestDate", () => {
test("returns the provided endDate if it exists", () => {
const endDate = new Date(2023, 0, 1);
const { result } = renderHook(() => useLatestDate({ endDate, rows: [] }));
expect(result.current).toEqual(endDate);
});
test("returns the latest date from the rows plus one day if endDate is not provided", () => {
const rows = [
[{ start: new Date(2023, 0, 1), end: new Date(2023, 0, 10) }],
[{ start: new Date(2022, 0, 1), end: new Date(2022, 0, 5) }],
];
const { result } = renderHook(() => useLatestDate({ rows }));
expect(result.current).toEqual(addDays(new Date(2023, 0, 10), 1));
});
test("returns the current date plus one day if no endDate and rows are empty", () => {
const { result } = renderHook(() => useLatestDate({ rows: [] }));
expect(result.current).toEqual(addDays(new Date(0), 1));
});
});
describe("useTimelineRows", () => {
const rows = [
{
label: "Row 1",
periods: [
{
start: new Date(2023, 0, 1),
end: new Date(2023, 0, 10),
status: "active",
},
{
start: new Date(2023, 0, 15),
end: new Date(2023, 0, 20),
status: "inactive",
},
],
},
{
label: "Row 2",
periods: [
{
start: new Date(2022, 0, 1),
end: new Date(2022, 0, 5),
status: "active",
},
],
},
];
test("returns the correct timeline rows", () => {
const startDate = new Date(2022, 0, 1);
const endDate = new Date(2023, 0, 31);
const direction = "left";
const { result } = renderHook(() =>
useTimelineRows(rows, startDate, endDate, direction),
);
expect(result.current).toHaveLength(2);
expect(result.current[0].periods).toHaveLength(2);
expect(result.current[1].periods).toHaveLength(1);
});
test("handles empty rows", () => {
const startDate = new Date(2022, 0, 1);
const endDate = new Date(2023, 0, 31);
const direction = "left";
const { result } = renderHook(() =>
useTimelineRows([], startDate, endDate, direction),
);
expect(result.current).toHaveLength(0);
});
test("handles different directions", () => {
const startDate = new Date(2022, 0, 1);
const endDate = new Date(2023, 0, 31);
const direction = "right";
const { result } = renderHook(() =>
useTimelineRows(rows, startDate, endDate, direction),
);
expect(result.current[0].periods[0].start).toEqual(new Date(2023, 0, 15));
});
});