From fd37baa46b40bc3302c5fff2a63c80c8b214af3a Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 27 Aug 2024 18:09:04 +0530 Subject: [PATCH 1/7] fix: require confirmation cal video bug --- packages/core/EventManager.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index 1803c58b092e8a..a873520ca1a7e1 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -186,9 +186,12 @@ export default class EventManager { result.type = result.createdEvent.type; //responses data is later sent to webhook if (evt.location && evt.responses) { - evt.responses["location"].value = { - optionValue: "", - value: evt.location, + evt.responses["location"] = { + label: "", + value: { + optionValue: "", + value: evt.location, + }, }; } } From 2347e74bceb1f177f5036e94fa159b99696584d2 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 27 Aug 2024 18:18:49 +0530 Subject: [PATCH 2/7] chore: update location --- packages/core/EventManager.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index a873520ca1a7e1..3498b118c0e59c 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -187,7 +187,7 @@ export default class EventManager { //responses data is later sent to webhook if (evt.location && evt.responses) { evt.responses["location"] = { - label: "", + label: evt.responses["location"]?.label ?? "", value: { optionValue: "", value: evt.location, @@ -259,9 +259,12 @@ export default class EventManager { result.type = result.createdEvent.type; //responses data is later sent to webhook if (evt.location && evt.responses) { - evt.responses["location"].value = { - optionValue: "", - value: evt.location, + evt.responses["location"] = { + label: evt.responses["location"]?.label ?? "", + value: { + optionValue: "", + value: evt.location, + }, }; } } From 10405a8d0bdbb9c92c615824753ef9d68a83cda5 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 27 Aug 2024 18:33:59 +0530 Subject: [PATCH 3/7] fix: tests --- packages/core/EventManager.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index 3498b118c0e59c..ee469f53508734 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -187,7 +187,8 @@ export default class EventManager { //responses data is later sent to webhook if (evt.location && evt.responses) { evt.responses["location"] = { - label: evt.responses["location"]?.label ?? "", + label: evt.responses["location"]?.label ?? "location", + isHidden: evt.responses["location"]?.isHidden ?? false, value: { optionValue: "", value: evt.location, @@ -260,7 +261,8 @@ export default class EventManager { //responses data is later sent to webhook if (evt.location && evt.responses) { evt.responses["location"] = { - label: evt.responses["location"]?.label ?? "", + label: evt.responses["location"]?.label ?? "location", + isHidden: evt.responses["location"]?.isHidden ?? false, value: { optionValue: "", value: evt.location, From 537ed4b5deb92a44965120aba027609b5a702622 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Wed, 28 Aug 2024 00:05:33 +0530 Subject: [PATCH 4/7] chore --- packages/core/EventManager.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index ee469f53508734..700b1c52d2b943 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -187,8 +187,7 @@ export default class EventManager { //responses data is later sent to webhook if (evt.location && evt.responses) { evt.responses["location"] = { - label: evt.responses["location"]?.label ?? "location", - isHidden: evt.responses["location"]?.isHidden ?? false, + ...(evt.responses["location"] ?? {}), value: { optionValue: "", value: evt.location, @@ -261,8 +260,7 @@ export default class EventManager { //responses data is later sent to webhook if (evt.location && evt.responses) { evt.responses["location"] = { - label: evt.responses["location"]?.label ?? "location", - isHidden: evt.responses["location"]?.isHidden ?? false, + ...(evt.responses["location"] ?? {}), value: { optionValue: "", value: evt.location, From e680ed9688cdea5091b4beb169cc41d4e5ecf684 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Wed, 28 Aug 2024 00:07:11 +0530 Subject: [PATCH 5/7] test: add confirm booking test --- .../viewer/bookings/confirm.handler.test.ts | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts diff --git a/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts b/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts new file mode 100644 index 00000000000000..ff4a202f18f3d0 --- /dev/null +++ b/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts @@ -0,0 +1,106 @@ +import { + createBookingScenario, + TestData, + getOrganizer, + getScenarioData, + mockSuccessfulVideoMeetingCreation, + getDate, +} from "@calcom/web/test/utils/bookingScenario/bookingScenario"; +import { setupAndTeardown } from "@calcom/web/test/utils/bookingScenario/setupAndTeardown"; + +import { describe, it, beforeEach, vi, expect } from "vitest"; + +import { BookingStatus } from "@calcom/prisma/enums"; + +import type { TrpcSessionUser } from "../../../trpc"; +import { confirmHandler } from "./confirm.handler"; + +describe("confirmHandler", () => { + setupAndTeardown(); + beforeEach(() => { + // Reset all mocks before each test + vi.clearAllMocks(); + }); + + it("should successfully confirm booking", async () => { + const attendeeUser = getOrganizer({ + email: "test@example.com", + name: "test name", + }); + + const organizer = getOrganizer({ + name: "Organizer", + email: "organizer@example.com", + id: 101, + schedules: [TestData.schedules.IstWorkHours], + }); + + const uidOfBookingToBeRescheduled = "n5Wv3eHgconAED2j4gcVhP"; + const iCalUID = `${uidOfBookingToBeRescheduled}@Cal.com`; + + const { dateString: plus1DateString } = getDate({ dateIncrement: 1 }); + + await createBookingScenario( + getScenarioData({ + webhooks: [ + { + userId: organizer.id, + eventTriggers: ["BOOKING_CREATED"], + subscriberUrl: "http://my-webhook.example.com", + active: true, + eventTypeId: 1, + appId: null, + }, + ], + eventTypes: [ + { + id: 1, + slotInterval: 15, + length: 15, + location: null, + users: [ + { + id: 101, + }, + ], + }, + ], + bookings: [ + { + id: 101, + uid: uidOfBookingToBeRescheduled, + eventTypeId: 1, + status: BookingStatus.PENDING, + startTime: `${plus1DateString}T05:00:00.000Z`, + endTime: `${plus1DateString}T05:15:00.000Z`, + references: [], + iCalUID, + attendees: [attendeeUser], + responses: { name: attendeeUser.name, email: attendeeUser.email, guests: [] }, + }, + ], + organizer, + apps: [TestData.apps["daily-video"]], + }) + ); + + mockSuccessfulVideoMeetingCreation({ + metadataLookupKey: "dailyvideo", + }); + + const ctx = { + user: { + id: organizer.id, + name: organizer.name, + ...organizer, + } as NonNullable, + }; + + const res = await confirmHandler({ + ctx, + input: { bookingId: 101, confirmed: true, reason: "" }, + }); + + expect(res.status).toBe(BookingStatus.ACCEPTED); + }); +}); From 5fe99ba352f4fc7a6ec75793022c9f07e13b5e45 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Wed, 28 Aug 2024 00:21:51 +0530 Subject: [PATCH 6/7] chore: add location in test --- packages/emails/lib/generateIcsFile.ts | 2 +- .../server/routers/viewer/bookings/confirm.handler.test.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/emails/lib/generateIcsFile.ts b/packages/emails/lib/generateIcsFile.ts index cb63bbadfa9be6..6f3a99fcef9277 100644 --- a/packages/emails/lib/generateIcsFile.ts +++ b/packages/emails/lib/generateIcsFile.ts @@ -31,7 +31,7 @@ export default function generateIcsFile({ if ( role !== GenerateIcsRole.ATTENDEE && calEvent.destinationCalendar && - calEvent.destinationCalendar[0].integration === "office365_calendar" + calEvent.destinationCalendar[0]?.integration === "office365_calendar" ) return null; diff --git a/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts b/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts index ff4a202f18f3d0..5b8d20bb11285a 100644 --- a/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts +++ b/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts @@ -22,7 +22,7 @@ describe("confirmHandler", () => { vi.clearAllMocks(); }); - it("should successfully confirm booking", async () => { + it("should successfully confirm booking when event type doesn't have any default location", async () => { const attendeeUser = getOrganizer({ email: "test@example.com", name: "test name", @@ -75,6 +75,7 @@ describe("confirmHandler", () => { endTime: `${plus1DateString}T05:15:00.000Z`, references: [], iCalUID, + location: "integrations:daily", attendees: [attendeeUser], responses: { name: attendeeUser.name, email: attendeeUser.email, guests: [] }, }, From fad74b8ffc8e79fb92db464d03c4268bb24e6179 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Wed, 28 Aug 2024 00:30:19 +0530 Subject: [PATCH 7/7] fix: types --- .../viewer/bookings/confirm.handler.test.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts b/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts index 5b8d20bb11285a..5fcba1c5d6e70f 100644 --- a/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts +++ b/packages/trpc/server/routers/viewer/bookings/confirm.handler.test.ts @@ -26,6 +26,8 @@ describe("confirmHandler", () => { const attendeeUser = getOrganizer({ email: "test@example.com", name: "test name", + id: 102, + schedules: [TestData.schedules.IstWorkHours], }); const organizer = getOrganizer({ @@ -35,8 +37,8 @@ describe("confirmHandler", () => { schedules: [TestData.schedules.IstWorkHours], }); - const uidOfBookingToBeRescheduled = "n5Wv3eHgconAED2j4gcVhP"; - const iCalUID = `${uidOfBookingToBeRescheduled}@Cal.com`; + const uidOfBooking = "n5Wv3eHgconAED2j4gcVhP"; + const iCalUID = `${uidOfBooking}@Cal.com`; const { dateString: plus1DateString } = getDate({ dateIncrement: 1 }); @@ -57,7 +59,7 @@ describe("confirmHandler", () => { id: 1, slotInterval: 15, length: 15, - location: null, + locations: [], users: [ { id: 101, @@ -68,7 +70,7 @@ describe("confirmHandler", () => { bookings: [ { id: 101, - uid: uidOfBookingToBeRescheduled, + uid: uidOfBooking, eventTypeId: 1, status: BookingStatus.PENDING, startTime: `${plus1DateString}T05:00:00.000Z`, @@ -93,7 +95,8 @@ describe("confirmHandler", () => { user: { id: organizer.id, name: organizer.name, - ...organizer, + timeZone: organizer.timeZone, + username: organizer.username, } as NonNullable, }; @@ -102,6 +105,6 @@ describe("confirmHandler", () => { input: { bookingId: 101, confirmed: true, reason: "" }, }); - expect(res.status).toBe(BookingStatus.ACCEPTED); + expect(res?.status).toBe(BookingStatus.ACCEPTED); }); });