Lumi/scripts/verify-webhooks.js
2026-06-10 18:57:38 +02:00

94 lines
2.8 KiB
JavaScript

const assert = require("assert");
const http = require("http");
const express = require("express");
const {
createWebhookService,
generateSlug,
sanitizeIdentifier,
isTimestampWithinWindow
} = require("../src/services/webhooks");
async function main() {
assert.strictEqual(sanitizeIdentifier(" Cozy Alerts! "), "cozy-alerts");
assert.strictEqual(
generateSlug({
identifier: "Cozy Alerts",
uuid: "123e4567-e89b-42d3-a456-426614174000"
}),
"cozy-alerts-123e4567-e89b-42d3-a456-426614174000"
);
assert.throws(() => sanitizeIdentifier("../"));
assert.strictEqual(
isTimestampWithinWindow(String(Math.floor(Date.now() / 1000))),
true
);
const service = createWebhookService();
const app = express();
app.use("/webhooks", service.router);
let observed = null;
service.registerInbound({
pluginId: "verification",
endpointId: "raw-body",
namespace: "test",
slug: "raw-body",
handler: async (context) => {
observed = context;
return { status: 202, body: { accepted: true } };
}
});
const server = http.createServer(app);
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const raw = '{"z":1, "a":2}';
const response = await fetch(
`http://127.0.0.1:${server.address().port}/webhooks/test/raw-body`,
{
method: "POST",
headers: { "Content-Type": "application/json; charset=utf-8" },
body: raw
}
);
assert.strictEqual(response.status, 202);
assert.strictEqual(observed.rawBodyText, raw);
assert.deepStrictEqual(observed.parsedJson, { z: 1, a: 2 });
const methodResponse = await fetch(
`http://127.0.0.1:${server.address().port}/webhooks/test/raw-body`
);
assert.strictEqual(methodResponse.status, 405);
const unknownResponse = await fetch(
`http://127.0.0.1:${server.address().port}/webhooks/test/unknown`,
{ method: "POST", body: "{}" }
);
assert.strictEqual(unknownResponse.status, 404);
const receiver = http.createServer((req, res) => {
let body = "";
req.setEncoding("utf8");
req.on("data", (chunk) => {
body += chunk;
});
req.on("end", () => {
res.writeHead(201, { "Content-Type": "text/plain" });
res.end(body);
});
});
await new Promise((resolve) => receiver.listen(0, "127.0.0.1", resolve));
const outbound = await service.sendJson({
pluginId: "verification",
url: `http://127.0.0.1:${receiver.address().port}/receive`,
payload: { hello: "world" }
});
assert.strictEqual(outbound.status, 201);
assert.strictEqual(outbound.success, true);
assert.strictEqual(outbound.body, '{"hello":"world"}');
await new Promise((resolve) => server.close(resolve));
await new Promise((resolve) => receiver.close(resolve));
console.log("Webhook framework verification passed.");
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});