Files
calendar/packages/lib/test/builder.ts
T
c28eb90928 chore: Upgrade prisma to 6.7.0 (#21264)
* chore: Upgrade prisma to 6.7.0

* Build fixes

* type fixes

Signed-off-by: Omar López <zomars@me.com>

* Update schema.prisma

* Patching

* Revert "Update schema.prisma"

This reverts commit 47d8618bf89ef4d007b30084df766f17281e21a1.

* Revert "Patching"

This reverts commit a1d2e3040e71690a44d4324db95d73b4d68c6adb.

* Revert schema changes

Signed-off-by: Omar López <zomars@me.com>

* WIP

Signed-off-by: Omar López <zomars@me.com>

* Update getPublicEvent.ts

* Update imports

Signed-off-by: Omar López <zomars@me.com>

* Update gitignore

Signed-off-by: Omar López <zomars@me.com>

* update remaining imports

Signed-off-by: Omar López <zomars@me.com>

* Delete .cursor/config.json

* Discard changes to packages/features/eventtypes/lib/getPublicEvent.ts

* Update _get.ts

* Update user.ts

* Update .gitignore

* update

* Update WorkflowStepContainer.tsx

* Update next-auth-custom-adapter.ts

* Update getPublicEvent.ts

* Update workflow.ts

* Update next-auth-custom-adapter.ts

* Update next-auth-options.ts

* Update bookingScenario.ts

* fix missing imports

* upgrades prismock

Signed-off-by: Omar López <zomars@me.com>

* patches prismock

Signed-off-by: Omar López <zomars@me.com>

* Update reschedule.test.ts

* Update prisma.ts

* patch prismock

Signed-off-by: Omar López <zomars@me.com>

* fix enums imports

Signed-off-by: Omar López <zomars@me.com>

* Revert "Update prisma.ts"

This reverts commit 64edcf8db54171ff4456c209d563b5d431d99619.

* Revert "patch prismock"

This reverts commit e95819113dc9d88e7130947aa120cd42710977c8.

* fix patch

* Fix test that overrun the boundary, it shouldn't test too much

* Move prisma import to changeSMSLockState

* Bring back broken test without illegal imports

* Merge with main and fix filter hosts by same round robin host

* Fixed buildDryRunBooking fn tests

* Fix and move ooo create or update handler test

* Fix packages/features/eventtypes/lib/isCurrentlyAvailable.test.ts

* Fix packages/trpc/server/routers/viewer/organizations/listMembers.handler.test.ts

* Mock @calcom/prisma

* Fix: verify-email.test.ts

* fix: Moved WebhookService test and fixed default import mock

* Fix: Added missing prisma mock, handleNewBooking uses that of course

* We're not testing createContext here

* fix: Prisma mock fix for listMembers.test.ts

* More fixes to broken testcases

* Forgot to remove borked test

* Prevent the need to mock a lot of dependencies by moving out buildBaseWhereCondition to its own file

* Temporarily skip getCalendarEvents, needs a rewrite

* Fix: turns out you can access protected in testcases

* fix further mocks

* Added packages/features/insights/server/buildBaseWhereCondition.ts, types

* Always great to have a mock and then not use it

* And one less again.

* fix: confirm.handler.test, didn't mock prisma

* fix: Address minor nit by @eunjae & fix ImpersonationProvider test

* Updated isPrismaAvailableCheck that doesn't crash on import

* fix: Get Prisma directly from the client, it usually involves the Validator and does not need 'local' inclusion

* Add zod-prisma-types without the generator enabled (commented out)

* Uncomment and see what happens

* Change method of import as imports did not work in Input Schemas

* Remove custom 'zod' booking model, it does not belong with Prisma

* Fix all other global Model imports

* Rewrite most schema includes AND remove barrel file

* Add bookingCreateBodySchema to features/bookings

* Flurry of type fixes for compatibility with new zod gen

* Refactor out the custom prisma type createEventTypeInput

* Work around nullable eventTypeLocations

* HandlePayment type fix

* More fixes, final fix remaining is CompleteEventType

* Should fix a bunch more booking related type errors

* Missed one

* Some props missing from BookingCreateBodySchema

* Fix location type in handleChildrenEventTypes

* Little bit hacky imo but it works

* Final type error \o/

* Forgot to include Prisma

* Do not include zod-utils in booker/types

* Oops, was already including Booker/types

* Fix membership type, also disallow updating createdAt/updatedAt, make part of patch/post

* Fix api v1 type errors

* Fix EventTypeDescription typings

* Remove getParserWithGeneric, use userBodySchema with UserSchema

* use centralized timeZoneSchema

* Implement feedback by @zomars

* Couple of WIP pushes

* Fix tests

* Type fixes in `handleChildrenEventTypes` test

* Try and parse metadata before use

* Change zod-prisma-types configuration for optimal performance

* Fix prisma validator error in `prisma/selects/credential`

* Disable seperate relations model, hits a bug

* Import absolute - this makes rollup work in @platform/libraries

* Attempt at removing resolutions override

* Refactor using `Prisma.validator` to `satisfies`

* Build atoms using @calcom/prisma/client

* Build atoms using @calcom/prisma/client

* fixes

* Update eventTypeSelect.ts

* Adjust `eventTypeMetaDataSchemaWithUntypedApps` from `unknown` to `record(any)`

* `EventTypeDescription` rely on `descriptionAsSafeHTML` instead of `description`

* Add `seatsPerTimeSlot` to event type public select

* Fix typing in `users-public-view` getServerSide props

* Add missing `schedulingType` to prop

* chore: bump platform libraries

* Function return type is illegal, not sure how this passed eslint (#21567)

* Merged with main

* Update updateTokenObject.ts

* Update handleResponse.ts

* Update index.ts

* Update handleChildrenEventTypes.ts

* Update booking-idempotency-key.ts

* Update WebhookService.test.ts

* Update events.test.ts

* Update queued-response.test.ts

* Update events.test.ts

* Update getRoutedUrl.test.ts

* fix: type checks

Signed-off-by: Omar López <zomars@me.com>

* fixes

Signed-off-by: Omar López <zomars@me.com>

* chore: bump platform libraries

* Update yarn.lock

* more fixes

Signed-off-by: Omar López <zomars@me.com>

* fixes

Signed-off-by: Omar López <zomars@me.com>

* biuld fixes

* chore: bump platform libraries

* Update conferencing.repository.ts

* Update conferencing.repository.ts

* Update getCalendarsEvents.test.ts

* Update vite.config.js

* chore: bump platform libraries

* Update users.ts

* Discard changes to docs/api-reference/v2/openapi.json

* Update vite.config.ts

* updated platform libraries

* Update get.handler.test.ts

* Update get.handler.test.ts

* Update schema.prisma

* Discard changes to docs/api-reference/v2/openapi.json

* Update next-auth-custom-adapter.ts

* Update team.ts

* Flurry of type fixes

* Fix majority of insight related type errors

* Type fixes for unlink of account

* Make user nullable again

* Fixed a bunch of unit tests and one type error

* Attempted mock fix

* Attempted fix for Attribute type

* Ensure default import becomes prisma, but not direct usage

* Import default as prisma in prisma.module

* Add attributeOption to attribute type

* Fix calcom/prisma mock

* Refactor Prisma client imports to @calcom/prisma/client

Updated all imports from '@prisma/client' to '@calcom/prisma/client' across tests and repository files for consistency and to use the correct Prisma client package. This change improves maintainability and ensures the correct client is referenced throughout the codebase.

* Undo removal of max-warnings=0 to get main to merge

* Remove unit tests for e2e fixtures, provide new prisma mock

* Mock @calcom/prisma in event manager

* Mock @calcom/prisma in event manager

* Add correct format even with --no-verify

* Mock prisma in CalendarManager

* Add mock for permission-check.service

* Better injection in PrismaApiKeyRepository imports

* More mock fixes :)

* Fix listMembers.handler.test

* Fix User import

* Appropriately adjust all types to be imported as types, there were a lot of types imported as normal deps

* Why was this a thing?

* Strictly speaking; Not using prismock anymore

* Ditched patch file for prismock

* Fix output.service.ts platform type imports, need concrete for plainToClass

* Better typing and tests for unlinkConnectedAccount.handler

* Small type fix

* Disable calendar cache tests as they are dependent on prismock

* chore: bump platform lib

* getRoutedUrl test remove of unused import

* Extract select to external const on getEventTypesFromDB

* Direct select of userSelect from selects/user

* fix type error from merging 23653

* Fixed integration tests by removing hardcoded values that were possible due to mocking, but as its now directly hitting the db no longer

* fix: vite config atoms prisma client type location

* revert: example app prisma client

* revert: example app prisma client

* bump platform libs

* fix: use class instead of type for DI of PlatformBookingsService

* update platform libs

* remove unused variable

* chore: generate prisma client for api v2

* fix: api v2 e2e

* fix: atoms e2e

* fix: atoms e2e

* fix: atoms e2e

* fix: api v2 e2e

* fix: tsconfig apiv2 enums

* publish libraries

* Simplify check for existence teamId

---------

Signed-off-by: Omar López <zomars@me.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com>
Co-authored-by: supalarry <laurisskraucis@gmail.com>
Co-authored-by: cal.com <morgan@cal.com>
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
Co-authored-by: Benny Joo <sldisek783@gmail.com>
2025-09-11 15:27:50 +01:00

344 lines
9.1 KiB
TypeScript

import { faker } from "@faker-js/faker";
import type { TFunction } from "i18next";
import getICalUID from "@calcom/emails/lib/getICalUID";
import type { Booking, EventType, Prisma, Webhook, BookingReference } from "@calcom/prisma/client";
import { CreationSource } from "@calcom/prisma/enums";
import { BookingStatus } from "@calcom/prisma/enums";
import type { CalendarEvent, Person, VideoCallData } from "@calcom/types/Calendar";
export const buildVideoCallData = (callData?: Partial<VideoCallData>): VideoCallData => {
return {
type: faker.helpers.arrayElement(["zoom_video", "stream_video"]),
id: faker.datatype.uuid(),
password: faker.internet.password(),
url: faker.internet.url(),
...callData,
};
};
export const buildPerson = (person?: Partial<Person>): Person => {
return {
name: faker.name.firstName(),
email: faker.internet.email(),
timeZone: faker.address.timeZone(),
username: faker.internet.userName(),
id: faker.datatype.number(),
language: {
locale: faker.random.locale(),
translate: ((key: string) => key) as TFunction,
},
...person,
};
};
export const buildBooking = (
booking?: Partial<Booking> & { references?: Partial<BookingReference>[] }
): Booking & { references?: Partial<BookingReference>[]; attendees?: [] } => {
const uid = faker.datatype.uuid();
return {
id: faker.datatype.number(),
uid,
userId: null,
eventTypeId: null,
idempotencyKey: null,
userPrimaryEmail: null,
title: faker.lorem.sentence(),
description: faker.lorem.paragraph(),
customInputs: null,
startTime: faker.date.future(),
endTime: faker.date.future(),
location: null,
createdAt: new Date(),
updatedAt: null,
status: BookingStatus.ACCEPTED,
paid: false,
destinationCalendarId: null,
cancelledBy: null,
rescheduledBy: null,
cancellationReason: null,
reassignReason: null,
rejectionReason: null,
dynamicEventSlugRef: null,
dynamicGroupSlugRef: null,
rescheduled: null,
fromReschedule: null,
recurringEventId: null,
smsReminderNumber: null,
reassignById: null,
scheduledJobs: [],
metadata: null,
responses: null,
isRecorded: false,
iCalUID: getICalUID({ uid }),
iCalSequence: 0,
rating: null,
noShowHost: null,
ratingFeedback: null,
attendees: [],
oneTimePassword: null,
creationSource: CreationSource.WEBAPP,
...booking,
};
};
export const buildEventType = (eventType?: Partial<EventType>): EventType => {
return {
id: faker.datatype.number(),
title: faker.lorem.sentence(),
slug: faker.lorem.slug(),
description: faker.lorem.paragraph(),
interfaceLanguage: null,
position: 1,
isInstantEvent: false,
instantMeetingParameters: [],
instantMeetingExpiryTimeOffsetInSeconds: 90,
instantMeetingScheduleId: null,
locations: null,
length: 15,
offsetStart: 0,
hidden: false,
userId: null,
teamId: null,
requiresBookerEmailVerification: false,
canSendCalVideoTranscriptionEmails: true,
useEventTypeDestinationCalendarEmail: false,
eventName: faker.lorem.words(),
timeZone: null,
periodType: "UNLIMITED",
periodStartDate: null,
periodEndDate: null,
periodDays: null,
periodCountCalendarDays: null,
recurringEvent: null,
lockTimeZoneToggleOnBookingPage: false,
lockedTimeZone: null,
requiresConfirmation: false,
requiresConfirmationForFreeEmail: false,
requiresConfirmationWillBlockSlot: false,
disableGuests: false,
hideCalendarNotes: false,
hideCalendarEventDetails: false,
minimumBookingNotice: 120,
beforeEventBuffer: 0,
afterEventBuffer: 0,
onlyShowFirstAvailableSlot: false,
showOptimizedSlots: false,
seatsPerTimeSlot: null,
seatsShowAttendees: null,
disableCancelling: false,
disableRescheduling: false,
allowReschedulingCancelledBookings: false,
seatsShowAvailabilityCount: null,
maxLeadThreshold: null,
includeNoShowInRRCalculation: false,
schedulingType: null,
scheduleId: null,
bookingLimits: null,
maxActiveBookingsPerBooker: null,
maxActiveBookingPerBookerOfferReschedule: false,
durationLimits: null,
assignAllTeamMembers: false,
rescheduleWithSameRoundRobinHost: false,
price: 0,
currency: "usd",
slotInterval: null,
metadata: null,
successRedirectUrl: null,
forwardParamsSuccessRedirect: true,
bookingFields: [],
parentId: null,
profileId: null,
secondaryEmailId: null,
isRRWeightsEnabled: false,
eventTypeColor: null,
assignRRMembersUsingSegment: false,
rrSegmentQueryValue: null,
autoTranslateDescriptionEnabled: false,
useEventLevelSelectedCalendars: false,
allowReschedulingPastBookings: false,
hideOrganizerEmail: false,
customReplyToEmail: null,
restrictionScheduleId: null,
useBookerTimezone: false,
bookingRequiresAuthentication: false,
...eventType,
};
};
export const buildWebhook = (webhook?: Partial<Webhook>): Webhook => {
return {
id: faker.datatype.uuid(),
eventTypeId: faker.datatype.number(),
subscriberUrl: "http://mockedURL.com",
payloadTemplate: null,
createdAt: faker.datatype.datetime(),
appId: null,
userId: null,
secret: faker.lorem.slug(),
active: true,
eventTriggers: [],
teamId: null,
platformOAuthClientId: null,
time: null,
timeUnit: null,
...webhook,
platform: false,
};
};
export const buildSubscriberEvent = (booking?: Partial<Booking>) => {
return {
type: booking?.title || "",
title: booking?.title,
description: "",
additionalNotes: "",
customInputs: {},
startTime: booking?.startTime,
endTime: booking?.endTime,
organizer: {
name: "",
email: "",
timeZone: "",
language: {
locale: "en",
},
},
attendees: [],
location: "",
destinationCalendar: null,
hideCalendar: false,
uid: booking?.uid,
metadata: {},
};
};
export const buildCalendarEvent = (
event?: Partial<CalendarEvent>,
omitVideoCallData?: boolean
): CalendarEvent => {
const uid = faker.datatype.uuid();
return {
uid,
iCalUID: getICalUID({ uid }),
type: faker.helpers.arrayElement(["event", "meeting"]),
title: faker.lorem.sentence(),
startTime: faker.date.future().toISOString(),
endTime: faker.date.future().toISOString(),
location: faker.address.city(),
description: faker.lorem.paragraph(),
attendees: [],
customInputs: {},
additionalNotes: faker.lorem.paragraph(),
organizer: buildPerson(),
...(!omitVideoCallData && { videoCallData: buildVideoCallData() }),
...event,
};
};
type UserPayload = Prisma.UserGetPayload<{
select: {
locked: true;
name: true;
email: true;
timeZone: true;
username: true;
id: true;
allowDynamicBooking: true;
credentials: true;
destinationCalendar: true;
availability: true;
selectedCalendars: true;
schedules: true;
avatarUrl: true;
backupCodes: true;
bio: true;
brandColor: true;
completedOnboarding: true;
createdDate: true;
bufferTime: true;
darkBrandColor: true;
defaultScheduleId: true;
disableImpersonation: true;
emailVerified: true;
endTime: true;
hideBranding: true;
identityProvider: true;
identityProviderId: true;
invitedTo: true;
locale: true;
metadata: true;
role: true;
startTime: true;
theme: true;
appTheme: true;
timeFormat: true;
trialEndsAt: true;
twoFactorEnabled: true;
twoFactorSecret: true;
verified: true;
weekStart: true;
organizationId: true;
allowSEOIndexing: true;
receiveMonthlyDigestEmail: true;
movedToProfileId: true;
isPlatformManaged: true;
smsLockState: true;
};
}>;
export const buildUser = <T extends Partial<UserPayload>>(
user?: T & { priority?: number; weight?: number }
): UserPayload & { priority: number; weight: number } => {
return {
locked: false,
smsLockState: "UNLOCKED",
name: faker.name.firstName(),
email: faker.internet.email(),
timeZone: faker.address.timeZone(),
username: faker.internet.userName(),
id: 0,
allowDynamicBooking: true,
availability: [],
avatarUrl: "",
backupCodes: null,
bio: null,
brandColor: "#292929",
bufferTime: 0,
completedOnboarding: false,
createdDate: new Date(),
credentials: [],
darkBrandColor: "#fafafa",
defaultScheduleId: null,
destinationCalendar: null,
disableImpersonation: false,
emailVerified: null,
endTime: 0,
hideBranding: true,
identityProvider: "CAL",
identityProviderId: null,
invitedTo: null,
locale: "en",
metadata: null,
role: "USER",
schedules: [],
selectedCalendars: [],
startTime: 0,
theme: null,
appTheme: null,
timeFormat: null,
trialEndsAt: null,
twoFactorEnabled: false,
twoFactorSecret: null,
verified: false,
weekStart: "",
organizationId: null,
allowSEOIndexing: null,
receiveMonthlyDigestEmail: null,
movedToProfileId: null,
priority: user?.priority ?? 2,
weight: user?.weight ?? 100,
isPlatformManaged: false,
...user,
};
};