From e8f5af8b87fae2d8f265f2d329e6e4c7f8344aa7 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Thu, 21 May 2026 22:57:25 +0200 Subject: [PATCH] test(websub): add missing error-path tests for verify functions --- src/utils/websub.test.ts | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/utils/websub.test.ts b/src/utils/websub.test.ts index c55f4f7..773fdd5 100644 --- a/src/utils/websub.test.ts +++ b/src/utils/websub.test.ts @@ -313,6 +313,29 @@ describe("verifyAndStoreSubscription", () => { const subs = await getSubscriptions("feed1", env); expect(subs).toHaveLength(0); }); + + it("returns false when callback returns non-ok HTTP status", async () => { + const env = mockEnv(); + server.use( + http.get("https://reader.example/callback", ({ request }) => { + const challenge = + new URL(request.url).searchParams.get("hub.challenge") ?? ""; + return HttpResponse.text(challenge, { status: 500 }); + }), + ); + + const result = await verifyAndStoreSubscription( + "feed1", + "https://reader.example/callback", + undefined, + 86400, + env, + ); + + expect(result).toBe(false); + const subs = await getSubscriptions("feed1", env); + expect(subs).toHaveLength(0); + }); }); describe("verifyAndDeleteSubscription", () => { @@ -375,4 +398,31 @@ describe("verifyAndDeleteSubscription", () => { const subs = await getSubscriptions("feed1", env); expect(subs).toHaveLength(1); }); + + it("returns false and leaves subscription intact when callback fetch fails", async () => { + const env = mockEnv(); + await saveSubscriptions( + "feed1", + [ + { + callbackUrl: "https://reader.example/callback", + expiresAt: Date.now() + 60000, + }, + ], + env, + ); + + server.use( + http.get("https://reader.example/callback", () => HttpResponse.error()), + ); + + const result = await verifyAndDeleteSubscription( + "feed1", + "https://reader.example/callback", + env, + ); + expect(result).toBe(false); + const subs = await getSubscriptions("feed1", env); + expect(subs).toHaveLength(1); + }); });