From f54c5675d6015a7451c4cd4a78debe9eb5c9d865 Mon Sep 17 00:00:00 2001 From: CarinaWolli Date: Tue, 31 Oct 2023 15:17:56 -0400 Subject: [PATCH] add test --- apps/web/test/lib/getSchedule.test.ts | 123 ++++++++++++++++++ .../utils/bookingScenario/bookingScenario.ts | 4 + 2 files changed, 127 insertions(+) diff --git a/apps/web/test/lib/getSchedule.test.ts b/apps/web/test/lib/getSchedule.test.ts index 77fd0bcb32..7f7753c890 100644 --- a/apps/web/test/lib/getSchedule.test.ts +++ b/apps/web/test/lib/getSchedule.test.ts @@ -4,6 +4,7 @@ import prismock from "../../../../tests/libs/__mocks__/prisma"; import { diff } from "jest-diff"; import { describe, expect, vi, beforeEach, afterEach, test } from "vitest"; +import dayjs from "@calcom/dayjs"; import type { BookingStatus } from "@calcom/prisma/enums"; import type { Slot } from "@calcom/trpc/server/routers/viewer/slots/types"; import { getAvailableSlots as getSchedule } from "@calcom/trpc/server/routers/viewer/slots/util"; @@ -874,6 +875,128 @@ describe("getSchedule", () => { } ); }); + test("test that booking limit is working correctly if user is all day available", async () => { + const { dateString: plus1DateString } = getDate({ dateIncrement: 1 }); + const { dateString: plus2DateString } = getDate({ dateIncrement: 2 }); + const { dateString: plus3DateString } = getDate({ dateIncrement: 3 }); + + const scenarioData = { + eventTypes: [ + { + id: 1, + length: 60, + beforeEventBuffer: 0, + afterEventBuffer: 0, + bookingLimits: { + PER_DAY: 1, + }, + users: [ + { + id: 101, + }, + ], + }, + { + id: 2, + length: 60, + beforeEventBuffer: 0, + afterEventBuffer: 0, + bookingLimits: { + PER_DAY: 2, + }, + users: [ + { + id: 101, + }, + ], + }, + ], + users: [ + { + ...TestData.users.example, + id: 101, + schedules: [ + { + id: 1, + name: "All Day available", + availability: [ + { + userId: null, + eventTypeId: null, + days: [0, 1, 2, 3, 4, 5, 6], + startTime: new Date("1970-01-01T00:00:00.000Z"), + endTime: new Date("1970-01-01T23:59:59.999Z"), + date: null, + }, + ], + timeZone: Timezones["+5:30"], + }, + ], + }, + ], + bookings: [ + { + userId: 101, + eventTypeId: 1, + startTime: `${plus2DateString}T08:30:00.000Z`, + endTime: `${plus2DateString}T08:29:59.999Z`, + status: "ACCEPTED" as BookingStatus, + }, + { + userId: 101, + eventTypeId: 2, + startTime: `${plus2DateString}T08:30:00.000Z`, + endTime: `${plus2DateString}T08:29:59.999Z`, + status: "ACCEPTED" as BookingStatus, + }, + ], + }; + + await createBookingScenario(scenarioData); + + const thisUserAvailabilityBookingLimitOne = await getSchedule({ + input: { + eventTypeId: 1, + eventTypeSlug: "", + startTime: `${plus1DateString}T00:00:00.000Z`, + endTime: `${plus3DateString}T23:59:59.999Z`, + timeZone: Timezones["+5:30"], + isTeamEvent: false, + }, + }); + + const thisUserAvailabilityBookingLimitTwo = await getSchedule({ + input: { + eventTypeId: 2, + eventTypeSlug: "", + startTime: `${plus1DateString}T00:00:00.000Z`, + endTime: `${plus3DateString}T23:59:59.999Z`, + timeZone: Timezones["+5:30"], + isTeamEvent: false, + }, + }); + + let countSlotsOnDayWithBooking = 0; + for (const date in thisUserAvailabilityBookingLimitOne.slots) { + for (const timeObj of thisUserAvailabilityBookingLimitOne.slots[date]) { + if (dayjs(timeObj.time).tz(Timezones["+5:30"]).format().startsWith(plus2DateString)) { + countSlotsOnDayWithBooking++; + } + } + } + + expect(countSlotsOnDayWithBooking).toBe(0); // 1 booking per day as limit + + countSlotsOnDayWithBooking = 0; + for (const date in thisUserAvailabilityBookingLimitTwo.slots) { + for (const timeObj of thisUserAvailabilityBookingLimitTwo.slots[date]) { + if (dayjs(timeObj.time).tz(Timezones["+5:30"]).format().startsWith(plus2DateString)) { + countSlotsOnDayWithBooking++; + } + } + } + expect(countSlotsOnDayWithBooking).toBe(23); // 2 booking per day as limit + }); }); describe("Team Event", () => { diff --git a/apps/web/test/utils/bookingScenario/bookingScenario.ts b/apps/web/test/utils/bookingScenario/bookingScenario.ts index 2420851ae8..0a3809721c 100644 --- a/apps/web/test/utils/bookingScenario/bookingScenario.ts +++ b/apps/web/test/utils/bookingScenario/bookingScenario.ts @@ -101,6 +101,9 @@ export type InputEventType = { requiresConfirmation?: boolean; destinationCalendar?: Prisma.DestinationCalendarCreateInput; schedule?: InputUser["schedules"][number]; + bookingLimits?: { + PER_DAY?: number; + }; } & Partial>; type WhiteListedBookingProps = { @@ -199,6 +202,7 @@ async function addEventTypes(eventTypes: InputEventType[], usersStore: InputUser timeZone: null, beforeEventBuffer: 0, afterEventBuffer: 0, + bookingLimits: {}, schedulingType: null, length: 15, //TODO: What is the purpose of periodStartDate and periodEndDate? Test these?