Skip to content

Commit

Permalink
tests: add unit tests for create CRM Event
Browse files Browse the repository at this point in the history
  • Loading branch information
Udit-takkar committed Dec 31, 2024
1 parent c3386b1 commit 08b16a0
Showing 1 changed file with 258 additions and 0 deletions.
258 changes: 258 additions & 0 deletions packages/features/tasker/tasks/crm/__tests__/createCRMEvent.test.ts
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: [],
});
});
});

0 comments on commit 08b16a0

Please sign in to comment.