Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/sms templates #838

Merged
merged 9 commits into from
Sep 25, 2023
2 changes: 2 additions & 0 deletions packages/client/src/__testSetup__/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
Collection,
OrganizationData,
defaultEmailTemplates as emailTemplates,
defaultSMSTemplates as smsTemplates,
} from "@eisbuk/shared";

import { adminDb, auth } from "./firestoreSetup";
Expand Down Expand Up @@ -48,6 +49,7 @@ export const setUpOrganization: SetUpOrganization = async ({
admins: [email],
emailFrom,
emailTemplates,
smsTemplates,
...additionalSetup,
};

Expand Down
38 changes: 19 additions & 19 deletions packages/client/src/__tests__/cloudFunctions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ import { describe, expect } from "vitest";
import {
HTTPSErrors,
BookingsErrors,
ClientEmailPayload,
EmailType,
ClientMessagePayload,
ClientMessageType,
sanitizeCustomer,
CustomerBase,
Collection,
Customer,
DeliveryQueue,
ClientMessageMethod,
} from "@eisbuk/shared";
import { CloudFunction } from "@eisbuk/shared/ui";

Expand Down Expand Up @@ -53,7 +54,7 @@ describe("Cloud functions", () => {
async () => {
const { organization } = await setUpOrganization({ doLogin: false });
const payload = {
type: EmailType.SendBookingsLink,
type: ClientMessageType.SendBookingsLink,
organization,
displayName: "displayName",
bookingsLink: "bookingsLink",
Expand Down Expand Up @@ -81,14 +82,12 @@ describe("Cloud functions", () => {
},
});
const payload = {
type: EmailType.SendBookingsLink,
type: ClientMessageType.SendBookingsLink,
organization,
bookingsLink: "bookingsLink",
customer: {
name: saul.name,
surname: saul.surname,
email: saul.email,
},
name: saul.name,
surname: saul.surname,
email: saul.email,
};
await expect(
httpsCallable(functions, CloudFunction.SendEmail)(payload)
Expand Down Expand Up @@ -135,19 +134,20 @@ describe("Cloud functions", () => {
expect(Boolean(bookingsSnap.data())).toEqual(true);
});

const payload: ClientEmailPayload[EmailType.SendCalendarFile] = {
type: EmailType.SendCalendarFile,
const payload: ClientMessagePayload<
ClientMessageMethod.Email,
ClientMessageType.SendCalendarFile
> = {
type: ClientMessageType.SendCalendarFile,
organization,
attachments: {
filename: "icsFile.ics",
content: "content",
},
customer: {
name: saul.name,
surname: saul.surname,
email: saul.email || "[email protected]",
secretKey: saul.secretKey,
},
name: saul.name,
surname: saul.surname,
email: saul.email || "[email protected]",
secretKey: saul.secretKey,
};
await expect(
httpsCallable(functions, CloudFunction.SendEmail)(payload)
Expand All @@ -163,7 +163,7 @@ describe("Cloud functions", () => {
"should reject if no value for organziation provided",
async () => {
const payload = {
type: EmailType.SendBookingsLink,
type: ClientMessageType.SendBookingsLink,
displayName: "displayName",
bookingsLink: "string",
customer: {
Expand All @@ -181,7 +181,7 @@ describe("Cloud functions", () => {
testWithEmulator("should reject if no recipient provided", async () => {
const { organization } = await setUpOrganization();
const payload = {
type: EmailType.SendBookingsLink,
type: ClientMessageType.SendBookingsLink,
organization,
bookingsLink: "string",
customer: {
Expand Down
7 changes: 4 additions & 3 deletions packages/client/src/__tests__/dataTriggers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import {
SlotType,
OrganizationData,
sanitizeCustomer,
defaultEmailTemplates,
defaultEmailTemplates as emailTemplates,
defaultSMSTemplates as smsTemplates,
} from "@eisbuk/shared";

import { saul, walt } from "@eisbuk/testing/customers";
Expand Down Expand Up @@ -398,10 +399,10 @@ describe("Cloud functions -> Data triggers ->", () => {
location: "Albuquerque",
admins: ["Gus Fring"],
emailFrom: "[email protected]",
emailTemplates: defaultEmailTemplates,
emailTemplates,
emailNameFrom: "Gus",
smsFrom: "Gus",
smsTemplate: "SMS Temp here",
smsTemplates,
existingSecrets: ["authToken", "exampleSecret"],
emailBcc: "[email protected]",
};
Expand Down
16 changes: 12 additions & 4 deletions packages/client/src/__tests__/integrations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ import { describe, expect, beforeEach, afterAll } from "vitest";
import { httpsCallable } from "@firebase/functions";
import { createJestSMTPServer } from "jest-smtp";

import { ClientEmailPayload, CustomerFull, EmailType } from "@eisbuk/shared";
import {
ClientMessageMethod,
ClientMessagePayload,
ClientMessageType,
CustomerFull,
} from "@eisbuk/shared";
import { CloudFunction } from "@eisbuk/shared/ui";
import { DeliveryStatus } from "@eisbuk/firestore-process-delivery";

Expand Down Expand Up @@ -52,10 +57,13 @@ describe.skip("Email sending and delivery", () => {
done();
};

const payload: ClientEmailPayload[EmailType.SendBookingsLink] = {
type: EmailType.SendBookingsLink,
const payload: ClientMessagePayload<
ClientMessageMethod.Email,
ClientMessageType.SendBookingsLink
> = {
type: ClientMessageType.SendBookingsLink,
organization,
customer: saul as Required<CustomerFull>,
...(saul as Required<CustomerFull>),
bookingsLink: "https://eisbuk.it/saul",
};

Expand Down
46 changes: 28 additions & 18 deletions packages/client/src/__tests__/sendEmail.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import { describe, expect, test } from "vitest";
import { httpsCallable } from "@firebase/functions";

import {
ClientEmailPayload,
EmailType,
ClientMessagePayload,
ClientMessageType,
interpolateText,
defaultEmailTemplates,
defaultEmailTemplates as emailTemplates,
EmailInterpolationValues,
ClientMessageMethod,
} from "@eisbuk/shared";
import { CloudFunction } from "@eisbuk/shared/ui";

Expand All @@ -17,23 +18,32 @@ import { adminDb, functions } from "@/__testSetup__/firestoreSetup";

type SendEmailTest =
| {
type: EmailType.SendBookingsLink;
type: ClientMessageType.SendBookingsLink;
payload: Pick<
ClientEmailPayload[EmailType.SendBookingsLink],
ClientMessagePayload<
ClientMessageMethod.Email,
ClientMessageType.SendBookingsLink
>,
"bookingsLink"
>;
}
| {
type: EmailType.SendCalendarFile;
type: ClientMessageType.SendCalendarFile;
payload: Pick<
ClientEmailPayload[EmailType.SendCalendarFile],
ClientMessagePayload<
ClientMessageMethod.Email,
ClientMessageType.SendCalendarFile
>,
"attachments"
>;
}
| {
type: EmailType.SendExtendedBookingsDate;
type: ClientMessageType.SendExtendedBookingsDate;
payload: Pick<
ClientEmailPayload[EmailType.SendExtendedBookingsDate],
ClientMessagePayload<
ClientMessageMethod,
ClientMessageType.SendExtendedBookingsDate
>,
"extendedBookingsDate" | "bookingsMonth"
>;
};
Expand Down Expand Up @@ -69,7 +79,7 @@ const runSendEmailTableTests = (tests: SendEmailTest[]) => {
>(
functions,
CloudFunction.SendEmail
)({ type, ...payload, organization, customer: saul });
)({ type, ...payload, organization, ...saul });

expect(success).toEqual(true);

Expand All @@ -85,17 +95,17 @@ const runSendEmailTableTests = (tests: SendEmailTest[]) => {
};

// In case of send bookings link, add bookings link specific interpolation values
if (type === EmailType.SendBookingsLink) {
if (type === ClientMessageType.SendBookingsLink) {
interpolationValues.bookingsLink = payload.bookingsLink;
}

// In case of send calendar file, add calendar file specific interpolation values
if (type === EmailType.SendCalendarFile) {
if (type === ClientMessageType.SendCalendarFile) {
interpolationValues.calendarFile = payload.attachments.filename;
}

// In case of send extended bookings date, add extended bookings date specific interpolation values
if (type === EmailType.SendExtendedBookingsDate) {
if (type === ClientMessageType.SendExtendedBookingsDate) {
interpolationValues.bookingsMonth = payload.bookingsMonth;
interpolationValues.extendedBookingsDate = payload.extendedBookingsDate;
}
Expand All @@ -111,11 +121,11 @@ const runSendEmailTableTests = (tests: SendEmailTest[]) => {
// We're using default templates for each email type and checking against interpolation values
// provided in the test payload
subject: interpolateText(
defaultEmailTemplates[type].subject,
emailTemplates[type].subject,
interpolationValues
),
html: interpolateText(
defaultEmailTemplates[type].html,
emailTemplates[type].html,
interpolationValues
),
}),
Expand All @@ -128,13 +138,13 @@ const runSendEmailTableTests = (tests: SendEmailTest[]) => {
describe("SendEmail", () =>
runSendEmailTableTests([
{
type: EmailType.SendBookingsLink,
type: ClientMessageType.SendBookingsLink,
payload: {
bookingsLink: "https://eisbuk.com/bookings",
},
},
{
type: EmailType.SendCalendarFile,
type: ClientMessageType.SendCalendarFile,
payload: {
attachments: {
filename: "calendar.ics",
Expand All @@ -143,7 +153,7 @@ describe("SendEmail", () =>
},
},
{
type: EmailType.SendExtendedBookingsDate,
type: ClientMessageType.SendExtendedBookingsDate,
payload: {
bookingsMonth: "2021-01",
extendedBookingsDate: "2021-01-31",
Expand Down
Loading