Files
calendar/packages/emails/email-manager.test.ts
T
Udit TakkarandGitHub 35d6c41fff feat: Disable booking emails to guests (#25217)
* feat: disable SMS org setting

* chore: undo

* fix: cal evnet

* feat: add more settings

* tests: add email manager unit tests

* fix: update

* fix: type error

* fix: test

* refactor: UI

* refactor: UI

* perf: fetch only once

* perf: fetch only once

* chore: use org

* fix: test

* test: add unit tests

* refactor: email manager

* fix: add confirmation dialog for individual checkbox

* fix: sms

* chore: common.json
2025-12-03 17:21:31 +00:00

153 lines
5.9 KiB
TypeScript

import { describe, expect, it, vi, beforeEach } from "vitest";
import type { EventTypeMetadata } from "@calcom/prisma/zod-utils";
import { shouldSkipAttendeeEmailWithSettings, fetchOrganizationEmailSettings } from "./email-manager";
const mockGetEmailSettings = vi.fn();
vi.mock("@calcom/features/organizations/repositories/OrganizationSettingsRepository", () => ({
OrganizationSettingsRepository: vi.fn().mockImplementation(() => ({
getEmailSettings: mockGetEmailSettings,
})),
}));
vi.mock("@calcom/prisma", () => ({
prisma: {},
}));
describe("shouldSkipAttendeeEmailWithSettings", () => {
beforeEach(() => {
vi.clearAllMocks();
});
describe.each([
["confirmation", "disableAttendeeConfirmationEmail"],
["cancellation", "disableAttendeeCancellationEmail"],
["rescheduled", "disableAttendeeRescheduledEmail"],
["request", "disableAttendeeRequestEmail"],
["reassigned", "disableAttendeeReassignedEmail"],
["awaiting_payment", "disableAttendeeAwaitingPaymentEmail"],
["reschedule_request", "disableAttendeeRescheduleRequestEmail"],
["location_change", "disableAttendeeLocationChangeEmail"],
["new_event", "disableAttendeeNewEventEmail"],
] as const)("Email type: %s", (emailType, settingKey) => {
it(`should skip email when organization has ${settingKey} enabled`, async () => {
const orgSettings = {
disableAttendeeConfirmationEmail: settingKey === "disableAttendeeConfirmationEmail",
disableAttendeeCancellationEmail: settingKey === "disableAttendeeCancellationEmail",
disableAttendeeRescheduledEmail: settingKey === "disableAttendeeRescheduledEmail",
disableAttendeeRequestEmail: settingKey === "disableAttendeeRequestEmail",
disableAttendeeReassignedEmail: settingKey === "disableAttendeeReassignedEmail",
disableAttendeeAwaitingPaymentEmail: settingKey === "disableAttendeeAwaitingPaymentEmail",
disableAttendeeRescheduleRequestEmail: settingKey === "disableAttendeeRescheduleRequestEmail",
disableAttendeeLocationChangeEmail: settingKey === "disableAttendeeLocationChangeEmail",
disableAttendeeNewEventEmail: settingKey === "disableAttendeeNewEventEmail",
};
const result = shouldSkipAttendeeEmailWithSettings(undefined, orgSettings, emailType);
expect(result).toBe(true);
});
it(`should send email when organization has ${settingKey} disabled`, async () => {
const orgSettings = {
disableAttendeeConfirmationEmail: false,
disableAttendeeCancellationEmail: false,
disableAttendeeRescheduledEmail: false,
disableAttendeeRequestEmail: false,
disableAttendeeReassignedEmail: false,
disableAttendeeAwaitingPaymentEmail: false,
disableAttendeeRescheduleRequestEmail: false,
disableAttendeeLocationChangeEmail: false,
disableAttendeeNewEventEmail: false,
};
const result = shouldSkipAttendeeEmailWithSettings(undefined, orgSettings, emailType);
expect(result).toBe(false);
});
});
describe("Metadata fallback", () => {
it("should skip email when metadata has disableStandardEmails.all.attendee enabled", () => {
const metadata: EventTypeMetadata = {
disableStandardEmails: {
all: {
attendee: true,
},
},
};
const result = shouldSkipAttendeeEmailWithSettings(metadata, null, "confirmation");
expect(result).toBe(true);
});
});
describe("Priority: organization settings override metadata", () => {
it("should skip email when org setting is enabled even if metadata allows", () => {
const orgSettings = {
disableAttendeeConfirmationEmail: true,
disableAttendeeCancellationEmail: false,
disableAttendeeRescheduledEmail: false,
disableAttendeeRequestEmail: false,
disableAttendeeReassignedEmail: false,
disableAttendeeAwaitingPaymentEmail: false,
disableAttendeeRescheduleRequestEmail: false,
disableAttendeeLocationChangeEmail: false,
disableAttendeeNewEventEmail: false,
};
const metadata: EventTypeMetadata = {
disableStandardEmails: {
confirmation: {
attendee: false,
},
},
};
const result = shouldSkipAttendeeEmailWithSettings(metadata, orgSettings, "confirmation");
expect(result).toBe(true);
});
});
describe("Edge cases", () => {
it("should send email when organizationSettings is null", () => {
const result = shouldSkipAttendeeEmailWithSettings(undefined, null, "confirmation");
expect(result).toBe(false);
});
it("should send email when emailType is undefined", () => {
const orgSettings = {
disableAttendeeConfirmationEmail: true,
disableAttendeeCancellationEmail: false,
disableAttendeeRescheduledEmail: false,
disableAttendeeRequestEmail: false,
disableAttendeeReassignedEmail: false,
disableAttendeeAwaitingPaymentEmail: false,
disableAttendeeRescheduleRequestEmail: false,
disableAttendeeLocationChangeEmail: false,
disableAttendeeNewEventEmail: false,
};
const result = shouldSkipAttendeeEmailWithSettings(undefined, orgSettings, undefined);
expect(result).toBe(false);
});
it("should send email when metadata is undefined and org settings are disabled", () => {
const orgSettings = {
disableAttendeeConfirmationEmail: false,
disableAttendeeCancellationEmail: false,
disableAttendeeRescheduledEmail: false,
disableAttendeeRequestEmail: false,
disableAttendeeReassignedEmail: false,
disableAttendeeAwaitingPaymentEmail: false,
disableAttendeeRescheduleRequestEmail: false,
disableAttendeeLocationChangeEmail: false,
disableAttendeeNewEventEmail: false,
};
const result = shouldSkipAttendeeEmailWithSettings(undefined, orgSettings, "confirmation");
expect(result).toBe(false);
});
});
});