Files
calendar/packages/features/ee/workflows/lib/service/WorkflowService.test.ts
T
Benny JooandGitHub e91bf53d80 refactor: Remove circular deps between @calcom/lib and @calcom/features [2] (#24438)
* move SystemField to features

* migrate workflow service

* merge two tests for team repository

* update imports and migrate team repository

* migrate delegation credential repository

* migrate credential repository

* migrate entityPermissionUtils

* migrate hashedLink service and repository

* migrate membership service

* update imports

* remove file

* migrate buildEventUrlFromBooking

* migrate getAllUserBookings to features

* update imports

* update organizationMock

* migrate slots

* migrate date-ranges to schedules dir

* migrate getAggregatedAvailability

* fix

* refactor

* migrate useCreateEventType hook to features

* migrate assignValueToUser

* migrate validateUsername to auth features

* migrate system field back to lib

* migrate getLabelValueMapFromResponses back to lib

* update imports

* use relative path

* fix type checks

* fix

* fix

* fix tests

* update gh codeowners

* fix

* fix
2025-10-17 06:48:08 -03:00

210 lines
5.6 KiB
TypeScript

import { describe, expect, vi, beforeEach } from "vitest";
import { scheduleWorkflowReminders } from "@calcom/features/ee/workflows/lib/reminders/reminderScheduler";
import { tasker } from "@calcom/features/tasker";
import { WorkflowTriggerEvents, WorkflowActions, WorkflowTemplates, TimeUnit } from "@calcom/prisma/enums";
import { test } from "@calcom/web/test/fixtures/fixtures";
import { WorkflowService } from "./WorkflowService";
vi.mock("@calcom/features/ee/workflows/lib/reminders/reminderScheduler");
vi.mock("@calcom/features/tasker");
const mockScheduleWorkflowReminders = vi.mocked(scheduleWorkflowReminders);
const mockTasker = vi.mocked(tasker);
// Mock the getHideBranding function to return false
vi.mock("@calcom/features/profile/lib/hideBranding", () => ({
getHideBranding: vi.fn().mockResolvedValue(false),
}));
describe("WorkflowService.scheduleFormWorkflows", () => {
beforeEach(() => {
vi.clearAllMocks();
});
const mockForm = {
id: "form-123",
userId: 101,
teamId: null,
fields: [
{ type: "email", identifier: "email" },
{ type: "phone", identifier: "phone" },
],
user: {
email: "formowner@example.com",
timeFormat: 12,
locale: "en",
},
};
const mockResponses = {
email: {
value: "submitter@example.com",
response: "submitter@example.com",
},
phone: {
value: "+1234567890",
response: "+1234567890",
},
};
test("should call scheduleWorkflowReminders for FORM_SUBMITTED triggers with correct phone number", async () => {
const workflows = [
{
id: 1,
name: "Form Submitted",
userId: 101,
teamId: null,
trigger: WorkflowTriggerEvents.FORM_SUBMITTED,
time: null,
timeUnit: null,
steps: [
{
id: 1,
action: WorkflowActions.SMS_ATTENDEE,
sendTo: null,
reminderBody: "Thank you!",
emailSubject: "Form Received",
template: WorkflowTemplates.CUSTOM,
verifiedAt: new Date(),
includeCalendarEvent: false,
numberVerificationPending: false,
numberRequired: false,
},
],
},
];
await WorkflowService.scheduleFormWorkflows({
workflows,
responses: mockResponses,
form: mockForm,
});
expect(mockScheduleWorkflowReminders).toHaveBeenCalledWith({
smsReminderNumber: "+1234567890",
formData: {
responses: mockResponses,
user: { email: "formowner@example.com", timeFormat: 12, locale: "en" },
},
hideBranding: false,
workflows: [workflows[0]],
});
});
test("should create task for FORM_SUBMITTED_NO_EVENT triggers", async () => {
const workflows = [
{
id: 2,
name: "Form Follow-up",
userId: 101,
teamId: null,
trigger: WorkflowTriggerEvents.FORM_SUBMITTED_NO_EVENT,
time: 30,
timeUnit: TimeUnit.MINUTE,
steps: [
{
id: 2,
action: WorkflowActions.EMAIL_ATTENDEE,
sendTo: null,
reminderBody: "Follow up message",
emailSubject: "Follow Up",
template: WorkflowTemplates.CUSTOM,
verifiedAt: new Date(),
includeCalendarEvent: false,
numberVerificationPending: false,
numberRequired: false,
sender: null,
},
],
},
];
mockTasker.create.mockResolvedValue({ id: "task-123" });
await WorkflowService.scheduleFormWorkflows({
workflows,
responses: mockResponses,
responseId: 123,
form: mockForm,
});
expect(mockTasker.create).toHaveBeenCalledWith(
"triggerFormSubmittedNoEventWorkflow",
{
responseId: 123,
responses: mockResponses,
smsReminderNumber: "+1234567890",
hideBranding: false,
submittedAt: expect.any(Date),
form: {
id: "form-123",
userId: 101,
teamId: undefined,
user: {
email: "formowner@example.com",
timeFormat: 12,
locale: "en",
},
},
workflow: workflows[0],
},
{ scheduledAt: expect.any(Date) }
);
});
test("should handle forms without phone fields by passing null smsReminderNumber", async () => {
const formWithoutPhone = {
...mockForm,
fields: [
{ type: "email", identifier: "email" },
{ type: "text", identifier: "name" },
],
};
const workflows = [
{
id: 1,
name: "Form Submitted",
userId: 101,
teamId: null,
trigger: WorkflowTriggerEvents.FORM_SUBMITTED,
time: null,
timeUnit: null,
steps: [
{
id: 1,
action: WorkflowActions.EMAIL_ATTENDEE,
sendTo: null,
reminderBody: "Thank you!",
emailSubject: "Form Received",
template: WorkflowTemplates.CUSTOM,
verifiedAt: new Date(),
includeCalendarEvent: false,
numberVerificationPending: false,
numberRequired: false,
sender: null,
},
],
},
];
await WorkflowService.scheduleFormWorkflows({
workflows,
responses: mockResponses,
form: formWithoutPhone,
});
expect(mockScheduleWorkflowReminders).toHaveBeenCalledWith({
smsReminderNumber: null,
formData: {
responses: mockResponses,
user: { email: "formowner@example.com", timeFormat: 12, locale: "en" },
},
hideBranding: false,
workflows: [workflows[0]],
});
});
});