Files
Benny JooGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
c7ee3984ef refactor: move feature-flags, calendars, and schedules components from packages/features to apps/web/modules (#27222)
* refactor: move feature-flags, calendars, and schedules components from packages/features to apps/web/modules

Co-Authored-By: [email protected] <[email protected]>

* fix

* fix

* fix

* fix: move DatePicker and DateOverrideInputDialog to apps/web/modules and update imports

Co-Authored-By: [email protected] <[email protected]>

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* rename

* fix

* fix

* fix

* fix

* fix

* fix

* fix

* fix

* fix

* fix

* wip

* wip

* wip

* fix unit tests

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-01-29 16:41:44 +02:00

123 lines
3.5 KiB
TypeScript

import { TooltipProvider } from "@radix-ui/react-tooltip";
import { render, renderHook, screen } from "@testing-library/react";
// eslint-disable-next-line no-restricted-imports
import { noop } from "lodash";
import { useFieldArray, useForm, FormProvider } from "react-hook-form";
import { vi } from "vitest";
import dayjs from "@calcom/dayjs";
import DateOverrideList from "@calcom/features/schedules/components/DateOverrideList";
import type { TimeRange } from "@calcom/types/schedule";
vi.mock("next/navigation", async (importOriginal) => {
const actual = await importOriginal<typeof import("next/navigation")>();
return {
...actual,
useRouter: vi.fn(() => ({
push: vi.fn(() => {
return;
}),
})),
};
});
type FormValues = {
dateOverrides: { ranges: TimeRange[] }[];
};
describe("DateOverrideList", () => {
it("renders DateOverrideList component in military time", () => {
const { result } = renderHook(() =>
useForm<FormValues>({
values: {
dateOverrides: [
{
ranges: [
{
start: dayjs.utc().startOf("day").add(540, "minute").toDate(),
end: dayjs.utc().startOf("day").add(1020, "minute").toDate(),
},
],
},
],
},
})
);
const methods = result.current;
const { control } = methods;
const { result: fieldArrayResult } = renderHook(() => useFieldArray({ control, name: "dateOverrides" }));
render(
<TooltipProvider>
<FormProvider {...methods}>
<DateOverrideList
hour12={false}
userTimeFormat={24}
fields={fieldArrayResult.current.fields}
replace={fieldArrayResult.current.replace}
workingHours={[]}
handleAvailabilityUpdate={noop}
/>
</FormProvider>
</TooltipProvider>
);
const dateString = new Intl.DateTimeFormat("en", {
weekday: "long",
month: "long",
day: "numeric",
timeZone: "UTC",
}).format(new Date());
expect(screen.getByText(dateString)).toBeInTheDocument();
expect(screen.getByText(`09:00 - 17:00`)).toBeInTheDocument();
});
it("renders DateOverrideList component in AM/PM", () => {
const { result } = renderHook(() =>
useForm<FormValues>({
values: {
dateOverrides: [
{
ranges: [
{
start: dayjs.utc().startOf("day").add(540, "minute").toDate(),
end: dayjs.utc().startOf("day").add(1020, "minute").toDate(),
},
],
},
],
},
})
);
const methods = result.current;
const { control } = methods;
const { result: fieldArrayResult } = renderHook(() => useFieldArray({ control, name: "dateOverrides" }));
render(
<TooltipProvider>
<FormProvider {...methods}>
<DateOverrideList
hour12={true}
userTimeFormat={12}
fields={fieldArrayResult.current.fields}
replace={fieldArrayResult.current.replace}
workingHours={[]}
handleAvailabilityUpdate={noop}
/>
</FormProvider>
</TooltipProvider>
);
const dateString = new Intl.DateTimeFormat("en", {
weekday: "long",
month: "long",
day: "numeric",
timeZone: "UTC",
}).format(new Date());
expect(screen.getByText(dateString)).toBeInTheDocument();
expect(screen.getByText(`9:00 AM - 5:00 PM`)).toBeInTheDocument();
});
});