test(jetstream): cover dispatchAll resilience and header handling
Some checks failed
CI / check (push) Failing after 13s
Some checks failed
CI / check (push) Failing after 13s
This commit is contained in:
94
tests/jetstream_webhooks_test.ts
Normal file
94
tests/jetstream_webhooks_test.ts
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
import { assertEquals } from "@std/assert";
|
||||||
|
import { dispatchAll } from "../src/jetstream/webhooks.ts";
|
||||||
|
import { installFetchStub, jsonResponse } from "./_helpers/fetch_stub.ts";
|
||||||
|
|
||||||
|
Deno.test("dispatchAll is a noop on empty webhook list", async () => {
|
||||||
|
const stub = installFetchStub(() =>
|
||||||
|
jsonResponse({ should: "not be called" })
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
await dispatchAll([], { event: "create" }, "label");
|
||||||
|
assertEquals(stub.calls.length, 0);
|
||||||
|
} finally {
|
||||||
|
stub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Deno.test(
|
||||||
|
"dispatchAll sends Authorization Bearer only when token is present",
|
||||||
|
async () => {
|
||||||
|
const stub = installFetchStub(() => new Response(null, { status: 204 }));
|
||||||
|
try {
|
||||||
|
await dispatchAll(
|
||||||
|
[
|
||||||
|
{ method: "POST", url: "https://a.example/hook" },
|
||||||
|
{
|
||||||
|
method: "POST",
|
||||||
|
url: "https://b.example/hook",
|
||||||
|
token: "shh",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
{ event: "create" },
|
||||||
|
"label",
|
||||||
|
);
|
||||||
|
assertEquals(stub.calls.length, 2);
|
||||||
|
const [first, second] = stub.calls;
|
||||||
|
assertEquals(first.headers.get("Authorization"), null);
|
||||||
|
assertEquals(second.headers.get("Authorization"), "Bearer shh");
|
||||||
|
assertEquals(first.headers.get("Content-Type"), "application/json");
|
||||||
|
} finally {
|
||||||
|
stub.restore();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
Deno.test(
|
||||||
|
"dispatchAll omits body and Content-Type for GET and HEAD",
|
||||||
|
async () => {
|
||||||
|
const stub = installFetchStub(() => new Response(null, { status: 204 }));
|
||||||
|
try {
|
||||||
|
await dispatchAll(
|
||||||
|
[
|
||||||
|
{ method: "GET", url: "https://a.example/ping" },
|
||||||
|
{ method: "HEAD", url: "https://b.example/ping" },
|
||||||
|
],
|
||||||
|
{ event: "create", data: "ignored" },
|
||||||
|
"label",
|
||||||
|
);
|
||||||
|
assertEquals(stub.calls.length, 2);
|
||||||
|
for (const call of stub.calls) {
|
||||||
|
assertEquals(call.body, "");
|
||||||
|
assertEquals(call.headers.get("Content-Type"), null);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
stub.restore();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
Deno.test(
|
||||||
|
"dispatchAll uses Promise.allSettled — one rejection does not abort others",
|
||||||
|
async () => {
|
||||||
|
const stub = installFetchStub((req) => {
|
||||||
|
if (req.url === "https://reject.example/hook") {
|
||||||
|
return Promise.reject(new Error("connection refused"));
|
||||||
|
}
|
||||||
|
return Promise.resolve(new Response(null, { status: 204 }));
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
await dispatchAll(
|
||||||
|
[
|
||||||
|
{ method: "POST", url: "https://reject.example/hook" },
|
||||||
|
{ method: "POST", url: "https://ok.example/hook" },
|
||||||
|
],
|
||||||
|
{ event: "create" },
|
||||||
|
"label",
|
||||||
|
);
|
||||||
|
assertEquals(stub.calls.length, 2);
|
||||||
|
const urls = stub.calls.map((c) => c.url);
|
||||||
|
assertEquals(urls.includes("https://ok.example/hook"), true);
|
||||||
|
} finally {
|
||||||
|
stub.restore();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user