diff --git a/apps/api/v1/pages/api/bookings/_post.ts b/apps/api/v1/pages/api/bookings/_post.ts index 919a7a2bfc..1d43e41fd8 100644 --- a/apps/api/v1/pages/api/bookings/_post.ts +++ b/apps/api/v1/pages/api/bookings/_post.ts @@ -47,6 +47,10 @@ import { getAccessibleUsers } from "~/lib/utils/retrieveScopedAccessibleUsers"; * type: string * format: date-time * description: 'End time of the Event' + * rescheduleUid: + * type: string + * format: UID + * description: 'Uid of the booking to reschedule' * responses: * type: object * required: diff --git a/apps/api/v1/test/lib/bookings/_post.test.ts b/apps/api/v1/test/lib/bookings/_post.test.ts index 93f0076c71..4d7453cd1e 100644 --- a/apps/api/v1/test/lib/bookings/_post.test.ts +++ b/apps/api/v1/test/lib/bookings/_post.test.ts @@ -11,6 +11,7 @@ import sendPayload from "@calcom/features/webhooks/lib/sendOrSchedulePayload"; import { ErrorCode } from "@calcom/lib/errorCodes"; import { buildBooking, buildEventType, buildWebhook } from "@calcom/lib/test/builder"; import prisma from "@calcom/prisma"; +import type { Booking } from "@calcom/prisma"; import handler from "../../../pages/api/bookings/_post"; @@ -157,6 +158,7 @@ describe.skipIf(true)("POST /api/bookings", () => { describe("Success", () => { describe("Regular event-type", () => { + let createdBooking: Booking; test("Creates one single booking", async () => { const { req, res } = createMocks({ method: "POST", @@ -181,9 +183,43 @@ describe.skipIf(true)("POST /api/bookings", () => { await handler(req, res); console.log({ statusCode: res._getStatusCode(), data: JSON.parse(res._getData()) }); - + createdBooking = JSON.parse(res._getData()); expect(prismaMock.booking.create).toHaveBeenCalledTimes(1); }); + + test("Reschedule created booking", async () => { + const { req, res } = createMocks({ + method: "POST", + body: { + name: "testReschedule", + start: dayjs().add(2, "day").format(), + end: dayjs().add(3, "day").format(), + eventTypeId: 2, + email: "test@example.com", + location: "Cal.com Video", + timeZone: "America/Montevideo", + language: "en", + customInputs: [], + metadata: {}, + userId: 4, + rescheduleUid: createdBooking.uid, + }, + prisma, + }); + + prismaMock.eventType.findUniqueOrThrow.mockResolvedValue(buildEventType()); + prismaMock.booking.findMany.mockResolvedValue([]); + + await handler(req, res); + console.log({ statusCode: res._getStatusCode(), data: JSON.parse(res._getData()) }); + const rescheduledBooking = JSON.parse(res._getData()) as Booking; + expect(prismaMock.booking.create).toHaveBeenCalledTimes(1); + expect(rescheduledBooking.fromReschedule).toEqual(createdBooking.uid); + const previousBooking = await prisma.booking.findUnique({ + where: { uid: createdBooking.uid }, + }); + expect(previousBooking?.status).toBe("cancelled"); + }); }); describe("Recurring event-type", () => {