-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tests: add unit tests for create CRM Event
- Loading branch information
1 parent
c3386b1
commit 08b16a0
Showing
1 changed file
with
258 additions
and
0 deletions.
There are no files selected for viewing
258 changes: 258 additions & 0 deletions
258
packages/features/tasker/tasks/crm/__tests__/createCRMEvent.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,258 @@ | ||
import prismaMock from "../../../../../../tests/libs/__mocks__/prismaMock"; | ||
|
||
import { describe, expect, it, beforeEach, vi } from "vitest"; | ||
|
||
import { BookingStatus } from "@calcom/prisma/enums"; | ||
|
||
import { createCRMEvent } from "../createCRMEvent"; | ||
|
||
interface User { | ||
id: number; | ||
email: string; | ||
name: string; | ||
} | ||
|
||
interface EventTypeMetadata { | ||
apps: { | ||
salesforce: { | ||
enabled: boolean; | ||
credentialId: number; | ||
appCategories: string[]; | ||
}; | ||
}; | ||
} | ||
|
||
interface Booking { | ||
id: number; | ||
uid: string; | ||
status: BookingStatus; | ||
title: string; | ||
startTime: Date; | ||
endTime: Date; | ||
user: User; | ||
eventType: { | ||
metadata: EventTypeMetadata; | ||
}; | ||
} | ||
|
||
interface CRMCredential { | ||
id: number; | ||
type: string; | ||
key: { | ||
access_token?: string; | ||
refresh_token?: string; | ||
expiry_date?: number; | ||
key1?: string; | ||
}; | ||
userId: number; | ||
} | ||
|
||
interface CRMManagerInterface { | ||
createEvent: (event: unknown) => Promise<{ id: string }>; | ||
} | ||
|
||
vi.mock("../lib/buildCalendarEvent", () => ({ | ||
default: vi.fn().mockResolvedValue({ | ||
title: "Test Event", | ||
description: "Test Description", | ||
startTime: new Date(), | ||
endTime: new Date(), | ||
}), | ||
})); | ||
|
||
const mockCreateEvent = vi.fn().mockResolvedValue({ id: "sf-event-123" }); | ||
vi.mock("@calcom/core/crmManager/crmManager", () => ({ | ||
default: class MockCrmManager { | ||
private credential: CRMCredential; | ||
|
||
constructor(credential: CRMCredential) { | ||
this.credential = credential; | ||
} | ||
|
||
createEvent = mockCreateEvent; | ||
|
||
getManager(): CRMManagerInterface { | ||
return { | ||
createEvent: this.createEvent, | ||
}; | ||
} | ||
}, | ||
})); | ||
|
||
describe("createCRMEvent", () => { | ||
beforeEach(() => { | ||
vi.clearAllMocks(); | ||
mockCreateEvent.mockClear(); | ||
// Clear Prisma mocks | ||
prismaMock.booking.findUnique.mockReset(); | ||
prismaMock.credential.findUnique.mockReset(); | ||
prismaMock.bookingReference.createMany.mockReset(); | ||
}); | ||
|
||
it("should successfully create a Salesforce CRM event", async () => { | ||
const mockBooking: Booking = { | ||
id: 1, | ||
uid: "booking-123", | ||
status: BookingStatus.ACCEPTED, | ||
title: "Test Booking", | ||
startTime: new Date(), | ||
endTime: new Date(), | ||
user: { | ||
id: 1, | ||
email: "[email protected]", | ||
name: "Test User", | ||
}, | ||
eventType: { | ||
metadata: { | ||
apps: { | ||
salesforce: { | ||
enabled: true, | ||
credentialId: 1, | ||
appCategories: ["crm"], | ||
}, | ||
}, | ||
}, | ||
}, | ||
}; | ||
|
||
const mockCredential: CRMCredential = { | ||
id: 1, | ||
type: "salesforce_crm", | ||
key: { | ||
access_token: "mock_token", | ||
refresh_token: "mock_refresh", | ||
expiry_date: new Date().getTime() + 3600000, | ||
}, | ||
userId: 1, | ||
}; | ||
|
||
// Set up Prisma mocks with proper return values | ||
prismaMock.booking.findUnique.mockResolvedValueOnce(mockBooking); | ||
prismaMock.credential.findUnique.mockResolvedValueOnce(mockCredential); | ||
prismaMock.bookingReference.createMany.mockResolvedValueOnce({ count: 1 }); | ||
|
||
const payload = JSON.stringify({ | ||
bookingUid: "booking-123", | ||
}); | ||
|
||
await createCRMEvent(payload); | ||
|
||
expect(mockCreateEvent).toHaveBeenCalled(); | ||
expect(prismaMock.bookingReference.createMany).toHaveBeenCalledWith({ | ||
data: [ | ||
{ | ||
type: "salesforce_crm", | ||
uid: "sf-event-123", | ||
meetingId: "sf-event-123", | ||
credentialId: 1, | ||
bookingId: 1, | ||
}, | ||
], | ||
}); | ||
}); | ||
|
||
it("should throw error for invalid payload", async () => { | ||
const invalidPayload = JSON.stringify({ | ||
invalidField: "test", | ||
}); | ||
|
||
await expect(createCRMEvent(invalidPayload)).rejects.toThrow("malformed payload in createCRMEvent"); | ||
}); | ||
|
||
it("should throw error when booking is not found", async () => { | ||
prismaMock.booking.findUnique.mockResolvedValue(null); | ||
|
||
const payload = JSON.stringify({ | ||
bookingUid: "non-existent-booking", | ||
}); | ||
|
||
await expect(createCRMEvent(payload)).rejects.toThrow("booking not found"); | ||
}); | ||
|
||
it("should handle case when Salesforce CRM is not enabled", async () => { | ||
const mockBooking: Booking = { | ||
id: 1, | ||
uid: "booking-123", | ||
status: BookingStatus.ACCEPTED, | ||
title: "Test Booking", | ||
startTime: new Date(), | ||
endTime: new Date(), | ||
user: { | ||
id: 1, | ||
email: "[email protected]", | ||
name: "Test User", | ||
}, | ||
eventType: { | ||
metadata: { | ||
apps: { | ||
salesforce: { | ||
enabled: false, | ||
credentialId: 1, | ||
appCategories: ["crm"], | ||
}, | ||
}, | ||
}, | ||
}, | ||
}; | ||
|
||
prismaMock.booking.findUnique.mockResolvedValue(mockBooking); | ||
|
||
const payload = JSON.stringify({ | ||
bookingUid: "booking-123", | ||
}); | ||
|
||
await createCRMEvent(payload); | ||
|
||
expect(prismaMock.bookingReference.createMany).toHaveBeenCalledWith({ | ||
data: [], | ||
}); | ||
}); | ||
|
||
it("should handle CRM creation error gracefully", async () => { | ||
const mockBooking: Booking = { | ||
id: 1, | ||
uid: "booking-123", | ||
status: BookingStatus.ACCEPTED, | ||
title: "Test Booking", | ||
startTime: new Date(), | ||
endTime: new Date(), | ||
user: { | ||
id: 1, | ||
email: "[email protected]", | ||
name: "Test User", | ||
}, | ||
eventType: { | ||
metadata: { | ||
apps: { | ||
salesforce: { | ||
enabled: true, | ||
credentialId: 1, | ||
appCategories: ["crm"], | ||
}, | ||
}, | ||
}, | ||
}, | ||
}; | ||
|
||
const mockCredential: CRMCredential = { | ||
id: 1, | ||
type: "salesforce_crm", | ||
key: { key1: "value1" }, | ||
userId: 1, | ||
}; | ||
|
||
prismaMock.booking.findUnique.mockResolvedValue(mockBooking); | ||
prismaMock.credential.findFirst.mockResolvedValue(mockCredential); | ||
mockCreateEvent.mockRejectedValue(new Error("Salesforce API error")); | ||
|
||
const payload = JSON.stringify({ | ||
bookingUid: "booking-123", | ||
}); | ||
|
||
await createCRMEvent(payload); | ||
|
||
expect(prismaMock.bookingReference.createMany).toHaveBeenCalledWith({ | ||
data: [], | ||
}); | ||
}); | ||
}); |