From 7202bac4e5fa943146f76ca78af0b8ae8aff1c96 Mon Sep 17 00:00:00 2001 From: Aditya Garud <153842990+yashranaway@users.noreply.github.com> Date: Thu, 29 Oct 2026 20:36:10 +0000 Subject: [PATCH] fix(web): report download link email delivery failures --- .../__tests__/unit/send-download-link.test.ts | 43 ++++++++++++++++++- apps/web/actions/send-download-link.ts | 9 +++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/apps/web/__tests__/unit/send-download-link.test.ts b/apps/web/__tests__/unit/send-download-link.test.ts index 1850083413b..e83cca31ff9 100644 --- a/apps/web/__tests__/unit/send-download-link.test.ts +++ b/apps/web/__tests__/unit/send-download-link.test.ts @@ -27,7 +27,7 @@ describe("sendDownloadLink", () => { headersMock.mockResolvedValue( new Headers({ host: "cap.test", "x-real-ip": "127.0.0.1" }), ); - sendEmailMock.mockResolvedValue(undefined); + sendEmailMock.mockResolvedValue({ data: { id: "email-1" }, error: null }); }); it("sends the email when the rate limit check passes", async () => { @@ -39,6 +39,47 @@ describe("sendDownloadLink", () => { expect(sendEmailMock).toHaveBeenCalledTimes(1); }); + it.each([ + { + data: null, + error: { + name: "validation_error", + message: "Sender domain is not verified", + }, + }, + { + data: null, + error: { + name: "email_not_configured", + message: "Email is not configured", + }, + }, + undefined, + { data: null, error: null }, + ])( + "reports unsuccessful delivery instead of claiming the email was sent: %j", + async (delivery) => { + sendEmailMock.mockResolvedValueOnce(delivery); + const { sendDownloadLink } = await import("@/actions/send-download-link"); + + expect(await sendDownloadLink("user@example.com")).toEqual({ + success: false, + error: "Something went wrong. Please try again.", + }); + expect(sendEmailMock).toHaveBeenCalledOnce(); + }, + ); + + it("reports a delivery exception", async () => { + sendEmailMock.mockRejectedValueOnce(new Error("Network failure")); + const { sendDownloadLink } = await import("@/actions/send-download-link"); + + expect(await sendDownloadLink("user@example.com")).toEqual({ + success: false, + error: "Something went wrong. Please try again.", + }); + }); + it("rejects the request when rate limited", async () => { checkRateLimitMock.mockResolvedValueOnce({ rateLimited: true }); diff --git a/apps/web/actions/send-download-link.ts b/apps/web/actions/send-download-link.ts index 15b1be66fdb..d0390e3f39c 100644 --- a/apps/web/actions/send-download-link.ts +++ b/apps/web/actions/send-download-link.ts @@ -63,13 +63,20 @@ export async function sendDownloadLink(email: string) { } try { - await sendEmail({ + const delivery = await sendEmail({ email: sanitized, subject: "Your Cap download links", react: DownloadLink({ email: sanitized }), marketing: true, }); + if (!delivery?.data) { + return { + success: false, + error: "Something went wrong. Please try again.", + }; + } + return { success: true }; } catch { return { success: false, error: "Something went wrong. Please try again." };