mirror of
https://github.com/hanzoai/calendar.git
synced 2026-09-24 22:42:24 +00:00
* feat: Cal.diy — community-driven MIT-licensed fork of Cal.com This squashed commit contains all Cal.diy changes applied on top of calcom/cal.com main: - Rebrand Cal.com to Cal.diy across the entire codebase - Remove Enterprise Edition (EE) features, license checks, and AGPL restrictions - Switch license from AGPL-3.0 to MIT - Remove docs/ directory (migrated to Nextra at cal.diy) - Remove dead code: org tests, EE tips, platform nav, premium username, SAML/SSO, etc. - Clean up .env.example for self-hosted Cal.diy - Update Docker image references to calcom/cal.diy - Update README, CONTRIBUTING.md, and issue templates for Cal.diy community fork - Add PR welcome bot for Cal.diy contributors - Fix API v2 breaking changes oasdiff ignore entries - Replace Blacksmith CI runners with default GitHub Actions 3893 files changed, 20789 insertions(+), 411020 deletions(-) Co-Authored-By: [email protected] <[email protected]> * refactor: remove org-specific /organizations/:orgId endpoints from API v2 atoms controllers (#1701) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: revert Cal.diy Inc to Cal.com, Inc. in license files, copyright notices, and package metadata (#1702) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * rip out org related comments in api v2 --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
136 lines
3.6 KiB
TypeScript
136 lines
3.6 KiB
TypeScript
import { calendar_v3 } from "@googleapis/calendar";
|
|
import type { Page } from "@playwright/test";
|
|
import { expect } from "@playwright/test";
|
|
|
|
import prisma from "@calcom/prisma";
|
|
import type { Prisma } from "@calcom/prisma/client";
|
|
import { bookTimeSlot, selectSecondAvailableTimeSlotNextMonth } from "@calcom/web/playwright/lib/testUtils";
|
|
|
|
import metadata from "../_metadata";
|
|
import { createGoogleCalendarServiceWithGoogleType } from "../lib/CalendarService";
|
|
|
|
/**
|
|
* Creates the booking on Cal.diy and makes the GCal call to fetch the event.
|
|
* Ends on the booking success page
|
|
* @param page
|
|
*
|
|
* @returns the raw GCal event GET response and the booking reference
|
|
*/
|
|
export const createBookingAndFetchGCalEvent = async (
|
|
page: Page,
|
|
qaGCalCredential: Prisma.CredentialGetPayload<{ select: { id: true } }> | null,
|
|
qaUsername: string
|
|
) => {
|
|
await page.goto(`/${qaUsername}/15min`);
|
|
await selectSecondAvailableTimeSlotNextMonth(page);
|
|
await bookTimeSlot(page);
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore
|
|
await page.waitForNavigation({ state: "networkidle" });
|
|
await page.locator("[data-testid=success-page]");
|
|
|
|
const bookingUrl = await page.url();
|
|
const bookingUid = bookingUrl.match(/booking\/([^/?]+)/);
|
|
assertValueExists(bookingUid, "bookingUid");
|
|
|
|
const [gCalReference, booking] = await Promise.all([
|
|
prisma.bookingReference.findFirst({
|
|
where: {
|
|
booking: {
|
|
uid: bookingUid[1],
|
|
},
|
|
type: metadata.type,
|
|
credentialId: qaGCalCredential?.id,
|
|
deleted: null,
|
|
},
|
|
select: {
|
|
uid: true,
|
|
booking: {},
|
|
},
|
|
}),
|
|
prisma.booking.findFirst({
|
|
where: {
|
|
uid: bookingUid[1],
|
|
},
|
|
select: {
|
|
uid: true,
|
|
startTime: true,
|
|
endTime: true,
|
|
title: true,
|
|
attendees: {
|
|
select: {
|
|
email: true,
|
|
},
|
|
},
|
|
user: {
|
|
select: {
|
|
email: true,
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
]);
|
|
assertValueExists(gCalReference, "gCalReference");
|
|
|
|
assertValueExists(booking, "booking");
|
|
|
|
// Need to refresh keys from DB
|
|
const refreshedCredential = await prisma.credential.findFirst({
|
|
where: {
|
|
id: qaGCalCredential?.id,
|
|
},
|
|
include: {
|
|
user: {
|
|
select: {
|
|
email: true,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(refreshedCredential).toBeTruthy();
|
|
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
//@ts-ignore
|
|
const googleCalendarService = createGoogleCalendarServiceWithGoogleType(refreshedCredential);
|
|
|
|
const authedCalendar = await googleCalendarService.authedCalendar();
|
|
|
|
const gCalEventResponse = await authedCalendar.events.get({
|
|
calendarId: "primary",
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
//@ts-ignore
|
|
eventId: gCalReference.uid,
|
|
});
|
|
|
|
expect(gCalEventResponse.status).toBe(200);
|
|
|
|
return { gCalEvent: gCalEventResponse.data, gCalReference, booking, authedCalendar };
|
|
};
|
|
|
|
export const deleteBookingAndEvent = async (
|
|
authedCalendar: calendar_v3.Calendar,
|
|
bookingUid: string,
|
|
gCalReferenceUid?: string
|
|
) => {
|
|
// After test passes we can delete the booking and GCal event
|
|
await prisma.booking.delete({
|
|
where: {
|
|
uid: bookingUid,
|
|
},
|
|
});
|
|
|
|
if (gCalReferenceUid) {
|
|
await authedCalendar.events.delete({
|
|
calendarId: "primary",
|
|
eventId: gCalReferenceUid,
|
|
});
|
|
}
|
|
};
|
|
|
|
export function assertValueExists(value: unknown, variableName?: string): asserts value {
|
|
if (!value) {
|
|
throw new Error(`Value is not defined: ${variableName}`);
|
|
}
|
|
}
|