Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@prefabs.tech/saas",
"version": "0.29.1",
"version": "0.29.2",
"private": true,
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion packages/fastify/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@prefabs.tech/saas-fastify",
"version": "0.29.1",
"version": "0.29.2",
"description": "saas plugin for fastify",
"homepage": "https://github.com/prefabs-tech/saas/tree/main/packages/fastify#readme",
"repository": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import type { FastifyInstance } from "fastify";
import type { RecipeInterface } from "supertokens-node/recipe/thirdpartyemailpassword";

import { beforeEach, describe, expect, it, vi } from "vitest";

const sendEmailMock = vi.fn();

vi.mock("@prefabs.tech/fastify-user", () => ({
areRolesExist: vi.fn().mockResolvedValue(true),
getUserService: vi.fn(),
sendEmail: (...arguments_: unknown[]) => sendEmailMock(...arguments_),
verifyEmail: vi.fn(),
}));

// Imported after the mock so the override picks up the mocked sendEmail.
const { default: emailPasswordSignUp } = await import("../emailPasswordSignUp");

const accountId = "76948988-1313-4ff5-9138-3dd3a3c95c70_";
const cleanEmail = "user@example.com";

const buildFastify = () =>
({
config: {
user: {
supertokens: {
sendUserAlreadyExistsWarning: true,
},
},
},
log: {
error: vi.fn(),
},
slonik: {},
}) as unknown as FastifyInstance;

const buildOriginalImplementation = () =>
({
emailPasswordSignUp: vi.fn().mockResolvedValue({
status: "EMAIL_ALREADY_EXISTS_ERROR",
}),
}) as unknown as RecipeInterface;

describe("emailPasswordSignUp duplicate email warning", () => {
beforeEach(() => {
sendEmailMock.mockClear();
});

it("sends the warning with the unprefixed email in templateData", async () => {
const fastify = buildFastify();
const handler = emailPasswordSignUp(buildOriginalImplementation(), fastify);

await handler({
email: cleanEmail,
password: "password",
tenantId: "public",
userContext: {
authEmailPrefix: accountId,
},
} as Parameters<typeof handler>[0]);

expect(sendEmailMock).toHaveBeenCalledTimes(1);

const payload = sendEmailMock.mock.calls[0][0];

// Body renders {{emailId}} verbatim, so it must be the clean email.
expect(payload.templateData.emailId).toBe(cleanEmail);
expect(payload.templateData.emailId).not.toContain(accountId);

// Recipient is also the clean email.
expect(payload.to).toBe(cleanEmail);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ const emailPasswordSignUp = (
config.user.emailOverrides?.duplicateEmail?.subject ||
"Duplicate Email Registration",
templateData: {
emailId: input.email,
emailId: originalEmail,
},
templateName:
config.user.emailOverrides?.duplicateEmail?.templateName ||
Expand Down
2 changes: 1 addition & 1 deletion packages/react/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@prefabs.tech/saas-react",
"version": "0.29.1",
"version": "0.29.2",
"description": "Saas plugin for react",
"type": "module",
"exports": {
Expand Down
2 changes: 1 addition & 1 deletion packages/vue/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@prefabs.tech/saas-vue",
"version": "0.29.1",
"version": "0.29.2",
"description": "Saas plugin for vue",
"type": "module",
"exports": {
Expand Down
Loading