From a5806cb1003ffa1045b43c209e11f6ad4e04bc70 Mon Sep 17 00:00:00 2001 From: Carina Wollendorfer <30310907+CarinaWolli@users.noreply.github.com> Date: Thu, 31 Oct 2024 04:48:36 -0400 Subject: [PATCH] fix: buffers in handleNewBooking (#17415) * send missing buffer params * add tests --------- Co-authored-by: CarinaWolli --- .../handleNewBooking/ensureAvailableUsers.ts | 2 + .../handleNewBooking/getEventTypesFromDB.ts | 2 + .../test/booking-limits.test.ts | 95 +++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts b/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts index 028c076203..a1d2518047 100644 --- a/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts +++ b/packages/features/bookings/lib/handleNewBooking/ensureAvailableUsers.ts @@ -87,6 +87,8 @@ export async function ensureAvailableUsers( returnDateOverrides: false, dateFrom: startDateTimeUtc.format(), dateTo: endDateTimeUtc.format(), + beforeEventBuffer: eventType.beforeEventBuffer, + afterEventBuffer: eventType.afterEventBuffer, }, initialData: { eventType, diff --git a/packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts b/packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts index ae3445a3d1..9bab2dd7fc 100644 --- a/packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts +++ b/packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts @@ -70,6 +70,8 @@ export const getEventTypesFromDB = async (eventTypeId: number) => { rescheduleWithSameRoundRobinHost: true, assignAllTeamMembers: true, isRRWeightsEnabled: true, + beforeEventBuffer: true, + afterEventBuffer: true, parentId: true, parent: { select: { diff --git a/packages/features/bookings/lib/handleNewBooking/test/booking-limits.test.ts b/packages/features/bookings/lib/handleNewBooking/test/booking-limits.test.ts index 0457e37fd5..81044e461f 100644 --- a/packages/features/bookings/lib/handleNewBooking/test/booking-limits.test.ts +++ b/packages/features/bookings/lib/handleNewBooking/test/booking-limits.test.ts @@ -474,6 +474,101 @@ describe("handleNewBooking", () => { ); describe("Buffers", () => { + test("should throw error when booking is not respecting buffers with event types that have before and after buffer ", async ({}) => { + const handleNewBooking = (await import("@calcom/features/bookings/lib/handleNewBooking")).default; + + const booker = getBooker({ + email: "booker@example.com", + name: "Booker", + }); + + const organizer = getOrganizer({ + name: "Organizer", + email: "organizer@example.com", + id: 101, + schedules: [TestData.schedules.IstWorkHours], + }); + + const { dateString: nextDayDateString } = getDate({ dateIncrement: 1 }); + + await createBookingScenario( + getScenarioData({ + eventTypes: [ + { + id: 1, + slotInterval: 15, + length: 15, + beforeEventBuffer: 60, + afterEventBuffer: 60, + users: [ + { + id: 101, + }, + ], + }, + ], + bookings: [ + { + eventTypeId: 1, + userId: 101, + status: BookingStatus.ACCEPTED, + startTime: `${nextDayDateString}T07:00:00.000Z`, + endTime: `${nextDayDateString}T07:15:00.000Z`, + }, + ], + organizer, + }) + ); + + // 7:00 - 7:15 busy + // 6:00 - 7:00 before event buffer + // 5:00 - 6:00 after event buffer + const mockBookingBeforeData = getMockRequestDataForBooking({ + data: { + start: `${nextDayDateString}T05:15:00.000Z`, + end: `${nextDayDateString}T05:30:00.000Z`, + eventTypeId: 1, + responses: { + email: booker.email, + name: booker.name, + location: { optionValue: "", value: "New York" }, + }, + }, + }); + + const { req: reqBookingBefore } = createMockNextJsRequest({ + method: "POST", + body: mockBookingBeforeData, + }); + await expect(async () => await handleNewBooking(reqBookingBefore)).rejects.toThrowError( + "no_available_users_found_error" + ); + + // 7:00 - 7:15 busy + // 7:17 - 8:15 after event buffer + // 8:15 - 9:15 before event buffer + const mockBookingAfterData = getMockRequestDataForBooking({ + data: { + start: `${nextDayDateString}T09:00:00.000Z`, + end: `${nextDayDateString}T09:15:00.000Z`, + eventTypeId: 1, + responses: { + email: booker.email, + name: booker.name, + location: { optionValue: "", value: "New York" }, + }, + }, + }); + + const { req: reqBookingAfter } = createMockNextJsRequest({ + method: "POST", + body: mockBookingAfterData, + }); + await expect(async () => await handleNewBooking(reqBookingAfter)).rejects.toThrowError( + "no_available_users_found_error" + ); + }); + test(`should throw error when booking is within a before event buffer of an existing booking `, async ({}) => { const handleNewBooking = (await import("@calcom/features/bookings/lib/handleNewBooking")).default;