* 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
153 lines
5.9 KiB
TypeScript
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);
|
|
});
|
|
});
|
|
});
|