diff --git a/packages/console/app/src/routes/stripe/webhook.ts b/packages/console/app/src/routes/stripe/webhook.ts index dfff3bd809b4..f7999f505f1a 100644 --- a/packages/console/app/src/routes/stripe/webhook.ts +++ b/packages/console/app/src/routes/stripe/webhook.ts @@ -178,8 +178,6 @@ export async function POST(input: APIEvent) { await Referral.completeFromLiteSubscription({ workspaceID, userID, - }).catch((error) => { - console.error("Referral sync failed", error) }) }) } diff --git a/packages/console/core/src/referral.ts b/packages/console/core/src/referral.ts index 66b14dbe3923..9fb4ed38f990 100644 --- a/packages/console/core/src/referral.ts +++ b/packages/console/core/src/referral.ts @@ -355,7 +355,7 @@ export namespace Referral { .from(ReferralTable) .where(and(eq(ReferralTable.inviteeAccountID, invitee.accountID), isNull(ReferralTable.timeDeleted))) .then((rows) => rows[0]) - if (!referral) throw new Error("Referral not found") + if (!referral) return const result = await tx .insert(ReferralRewardTable) diff --git a/packages/console/core/test/referral.test.ts b/packages/console/core/test/referral.test.ts new file mode 100644 index 000000000000..6a23192075b9 --- /dev/null +++ b/packages/console/core/test/referral.test.ts @@ -0,0 +1,57 @@ +import { afterEach, describe, expect, mock, test } from "bun:test" +import { Database } from "../src/drizzle" + +void mock.module("../src/billing", () => ({ + Billing: { + subtractLiteUsage: async () => {}, + }, +})) + +void mock.module("../src/lite", () => ({ + LiteData: {}, +})) + +const { Referral } = await import("../src/referral") + +const originalTransaction = Database.transaction + +afterEach(() => { + Database.transaction = originalTransaction +}) + +describe("Referral.completeFromLiteSubscription", () => { + test("returns without error when invitee has no referral", async () => { + const selectedRows = [{ accountID: "account_1" }, undefined] + let insertCalls = 0 + + Database.transaction = async (callback) => + callback({ + select: () => ({ + from: () => ({ + where: () => ({ + then: (resolve: (rows: unknown[]) => unknown) => { + const row = selectedRows.shift() + return Promise.resolve(resolve(row ? [row] : [])) + }, + }), + }), + }), + insert: () => ({ + ignore: () => ({ + values: () => { + insertCalls += 1 + return Promise.resolve({ rowsAffected: 2 }) + }, + }), + }), + } as never) + + await expect( + Referral.completeFromLiteSubscription({ + workspaceID: "workspace_1", + userID: "user_1", + }), + ).resolves.toBeUndefined() + expect(insertCalls).toBe(0) + }) +})