tests: add tests for organizer default app location
parent
2831fb2b57
commit
d22a81e3a0
|
@ -17,6 +17,7 @@ import logger from "@calcom/lib/logger";
|
||||||
import { safeStringify } from "@calcom/lib/safeStringify";
|
import { safeStringify } from "@calcom/lib/safeStringify";
|
||||||
import type { SchedulingType } from "@calcom/prisma/enums";
|
import type { SchedulingType } from "@calcom/prisma/enums";
|
||||||
import type { BookingStatus } from "@calcom/prisma/enums";
|
import type { BookingStatus } from "@calcom/prisma/enums";
|
||||||
|
import type { userMetadata } from "@calcom/prisma/zod-utils";
|
||||||
import type { AppMeta } from "@calcom/types/App";
|
import type { AppMeta } from "@calcom/types/App";
|
||||||
import type { NewCalendarEventType } from "@calcom/types/Calendar";
|
import type { NewCalendarEventType } from "@calcom/types/Calendar";
|
||||||
import type { EventBusyDate } from "@calcom/types/Calendar";
|
import type { EventBusyDate } from "@calcom/types/Calendar";
|
||||||
|
@ -710,6 +711,7 @@ export function getOrganizer({
|
||||||
selectedCalendars,
|
selectedCalendars,
|
||||||
destinationCalendar,
|
destinationCalendar,
|
||||||
defaultScheduleId,
|
defaultScheduleId,
|
||||||
|
metadata,
|
||||||
}: {
|
}: {
|
||||||
name: string;
|
name: string;
|
||||||
email: string;
|
email: string;
|
||||||
|
@ -719,6 +721,7 @@ export function getOrganizer({
|
||||||
selectedCalendars?: InputSelectedCalendar[];
|
selectedCalendars?: InputSelectedCalendar[];
|
||||||
defaultScheduleId?: number | null;
|
defaultScheduleId?: number | null;
|
||||||
destinationCalendar?: Prisma.DestinationCalendarCreateInput;
|
destinationCalendar?: Prisma.DestinationCalendarCreateInput;
|
||||||
|
metadata?: userMetadata;
|
||||||
}) {
|
}) {
|
||||||
return {
|
return {
|
||||||
...TestData.users.example,
|
...TestData.users.example,
|
||||||
|
@ -730,6 +733,7 @@ export function getOrganizer({
|
||||||
selectedCalendars,
|
selectedCalendars,
|
||||||
destinationCalendar,
|
destinationCalendar,
|
||||||
defaultScheduleId,
|
defaultScheduleId,
|
||||||
|
metadata,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1009,7 +1009,7 @@ async function handler(
|
||||||
organizerOrFirstDynamicGroupMemberDefaultLocationUrl =
|
organizerOrFirstDynamicGroupMemberDefaultLocationUrl =
|
||||||
organizerMetadata?.defaultConferencingApp?.appLink;
|
organizerMetadata?.defaultConferencingApp?.appLink;
|
||||||
} else {
|
} else {
|
||||||
locationBodyString = "";
|
locationBodyString = "integrations:daily";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1073,6 +1073,210 @@ describe("handleNewBooking", () => {
|
||||||
},
|
},
|
||||||
timeout
|
timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// TODO: Fix this test
|
||||||
|
test(
|
||||||
|
`Team Event Type when location is Organizer Default App and User Metadata is {} (Empty Object).`,
|
||||||
|
async ({ emails }) => {
|
||||||
|
const handleNewBooking = (await import("@calcom/features/bookings/lib/handleNewBooking")).default;
|
||||||
|
const booker = getBooker({
|
||||||
|
email: "booker@example.com",
|
||||||
|
name: "Booker",
|
||||||
|
});
|
||||||
|
|
||||||
|
const otherTeamMembers = [
|
||||||
|
{
|
||||||
|
name: "Other Team Member 1",
|
||||||
|
username: "other-team-member-1",
|
||||||
|
timeZone: Timezones["+5:30"],
|
||||||
|
defaultScheduleId: 1001,
|
||||||
|
email: "other-team-member-1@example.com",
|
||||||
|
id: 102,
|
||||||
|
schedules: [
|
||||||
|
{
|
||||||
|
...TestData.schedules.IstWorkHours,
|
||||||
|
// Specify an ID directly here because we want to be able to use that ID in defaultScheduleId above.
|
||||||
|
id: 1001,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
credentials: [getGoogleCalendarCredential()],
|
||||||
|
selectedCalendars: [TestData.selectedCalendars.google],
|
||||||
|
destinationCalendar: {
|
||||||
|
integration: TestData.apps["google-calendar"].type,
|
||||||
|
externalId: "other-team-member-1@google-calendar.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const organizer = getOrganizer({
|
||||||
|
name: "Organizer",
|
||||||
|
email: "organizer@example.com",
|
||||||
|
id: 101,
|
||||||
|
schedules: [TestData.schedules.IstWorkHours],
|
||||||
|
credentials: [
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
...getGoogleCalendarCredential(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
...getZoomAppCredential(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
metadata: {},
|
||||||
|
selectedCalendars: [TestData.selectedCalendars.google],
|
||||||
|
destinationCalendar: {
|
||||||
|
integration: TestData.apps["google-calendar"].type,
|
||||||
|
externalId: "organizer@google-calendar.com",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { eventTypes } = 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: 45,
|
||||||
|
schedulingType: SchedulingType.COLLECTIVE,
|
||||||
|
length: 45,
|
||||||
|
users: [
|
||||||
|
{
|
||||||
|
id: 101,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 102,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
locations: [
|
||||||
|
{
|
||||||
|
type: "conferencing",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
destinationCalendar: {
|
||||||
|
integration: TestData.apps["google-calendar"].type,
|
||||||
|
externalId: "event-type-1@google-calendar.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
organizer,
|
||||||
|
usersApartFromOrganizer: otherTeamMembers,
|
||||||
|
apps: [
|
||||||
|
TestData.apps["google-calendar"],
|
||||||
|
TestData.apps["daily-video"],
|
||||||
|
TestData.apps["zoomvideo"],
|
||||||
|
],
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
mockSuccessfulVideoMeetingCreation({
|
||||||
|
metadataLookupKey: appStoreMetadata.dailyvideo.dirName,
|
||||||
|
videoMeetingData: {
|
||||||
|
id: "MOCK_ID",
|
||||||
|
password: "MOCK_PASS",
|
||||||
|
url: `http://mock-dailyvideo.example.com/meeting-1`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const calendarMock = mockCalendarToHaveNoBusySlots("googlecalendar", {
|
||||||
|
create: {
|
||||||
|
id: "MOCKED_GOOGLE_CALENDAR_EVENT_ID",
|
||||||
|
iCalUID: "MOCKED_GOOGLE_CALENDAR_ICS_ID",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const mockBookingData = getMockRequestDataForBooking({
|
||||||
|
data: {
|
||||||
|
start: `${getDate({ dateIncrement: 1 }).dateString}T05:00:00.000Z`,
|
||||||
|
end: `${getDate({ dateIncrement: 1 }).dateString}T05:30:00.000Z`,
|
||||||
|
eventTypeId: 1,
|
||||||
|
responses: {
|
||||||
|
email: booker.email,
|
||||||
|
name: booker.name,
|
||||||
|
location: { optionValue: "", value: "conferencing" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { req } = createMockNextJsRequest({
|
||||||
|
method: "POST",
|
||||||
|
body: mockBookingData,
|
||||||
|
});
|
||||||
|
|
||||||
|
const createdBooking = await handleNewBooking(req);
|
||||||
|
|
||||||
|
await expectBookingToBeInDatabase({
|
||||||
|
description: "",
|
||||||
|
location: BookingLocations.CalVideo,
|
||||||
|
// location: "",
|
||||||
|
responses: expect.objectContaining({
|
||||||
|
email: booker.email,
|
||||||
|
name: booker.name,
|
||||||
|
}),
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||||
|
uid: createdBooking.uid!,
|
||||||
|
eventTypeId: mockBookingData.eventTypeId,
|
||||||
|
status: BookingStatus.ACCEPTED,
|
||||||
|
references: [
|
||||||
|
{
|
||||||
|
type: appStoreMetadata.dailyvideo.type,
|
||||||
|
uid: "MOCK_ID",
|
||||||
|
meetingId: "MOCK_ID",
|
||||||
|
meetingPassword: "MOCK_PASS",
|
||||||
|
meetingUrl: "http://mock-dailyvideo.example.com/meeting-1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: TestData.apps["google-calendar"].type,
|
||||||
|
uid: "MOCKED_GOOGLE_CALENDAR_EVENT_ID",
|
||||||
|
meetingId: "MOCKED_GOOGLE_CALENDAR_EVENT_ID",
|
||||||
|
meetingPassword: "MOCK_PASSWORD",
|
||||||
|
meetingUrl: "https://UNUSED_URL",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
expectWorkflowToBeTriggered();
|
||||||
|
expectSuccessfulCalendarEventCreationInCalendar(calendarMock, {
|
||||||
|
destinationCalendars: [
|
||||||
|
{
|
||||||
|
integration: TestData.apps["google-calendar"].type,
|
||||||
|
externalId: "event-type-1@google-calendar.com",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
integration: TestData.apps["google-calendar"].type,
|
||||||
|
externalId: "other-team-member-1@google-calendar.com",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
videoCallUrl: "http://mock-dailyvideo.example.com/meeting-1",
|
||||||
|
});
|
||||||
|
|
||||||
|
expectSuccessfulBookingCreationEmails({
|
||||||
|
booker,
|
||||||
|
organizer,
|
||||||
|
otherTeamMembers,
|
||||||
|
emails,
|
||||||
|
iCalUID: "MOCKED_GOOGLE_CALENDAR_ICS_ID",
|
||||||
|
});
|
||||||
|
|
||||||
|
expectBookingCreatedWebhookToHaveBeenFired({
|
||||||
|
booker,
|
||||||
|
organizer,
|
||||||
|
location: BookingLocations.CalVideo,
|
||||||
|
subscriberUrl: "http://my-webhook.example.com",
|
||||||
|
videoCallUrl: `${WEBAPP_URL}/video/${createdBooking.uid}`,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
timeout
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test.todo("Round Robin booking");
|
test.todo("Round Robin booking");
|
||||||
|
|
Loading…
Reference in New Issue