UNPKG

@kontent-ai/webhook-helper

Version:

This utility helps with webhook notifications from Kontent.ai

119 lines (101 loc) 3.62 kB
import { describe, expect, it } from "@jest/globals"; import { IWebhookDeliveryResponse, signatureHelper, WebhookResponse } from "../.."; describe("# Signatures", () => { const secret = "BHPyfqwSy1iJjcscOB+GSkDf9THrBlfcKkwtADJdbP4="; const signature = "CF9/hYLw2CDcVp2wW39OFUglh++fGdHFeOhiWxM3jZg="; const payload = { notifications: [ { data: { system: { id: "aa7f127f-1920-4454-a89a-0609aba8ea6f", name: "This changes everything!", codename: "this_changes_everything_", collection: "marketing", workflow: "default", workflow_step: "published", language: "default", type: "product_update", last_modified: "2024-03-25T07:55:57.0563735Z", }, }, message: { environment_id: "0f5b6cb2-ea82-014e-ac74-f71e7e8b6aee", object_type: "content_item", action: "published", delivery_slot: "published", }, }, ], } as const satisfies WebhookResponse; it("Generated hash should match signature", () => { const payloadString = JSON.stringify(payload, null, 2); const generatedHash = signatureHelper.getHashFromString(signatureHelper.replaceLinebreaks(payloadString), secret); expect(generatedHash).toEqual(signature); }); it("Signature should be valid", () => { const payloadString = JSON.stringify(payload, null, 2); const isValid = signatureHelper.isValidSignatureFromString( signatureHelper.replaceLinebreaks(payloadString), secret, signature, ); expect(isValid).toEqual(true); }); it("Signature is invalid due to wrong body", () => { const wrongInput = { notifications: { ...payload.notifications[0], data: { system: { ...payload.notifications[0].data.system, name: "wrong_name" } }, }, }; const payloadString = JSON.stringify(wrongInput, null, 2); const isValid = signatureHelper.isValidSignatureFromString( signatureHelper.replaceLinebreaks(payloadString), secret, signature, ); expect(isValid).toEqual(false); }); }); describe("legacy webhooks", () => { const secret = "4INSnqn9ZA9pOWHpRySS+rsEqL6qHF3CIAftipJeuDc="; const signature = "5+vhM4vWobuiwGyLSGqOL7KwXnaQXISzuKUxhI4xL3o="; const legacyPayload: IWebhookDeliveryResponse = { data: { items: [ { id: "f0e9e9fa-91e8-40d5-9527-b7e0ae51fc54", codename: "christian_bale", collection: "default", language: "en", type: "actor", }, ], taxonomies: [], }, message: { id: "790b5fea-febe-4421-b8e7-d333afc60136", project_id: "b259760f-81c5-013a-05e7-69efb4b954e5", type: "content_item_variant", operation: "publish", api_name: "delivery_production", created_timestamp: "2020-03-13T08:05:07.4044893Z", webhook_url: "https://enxkdw8lvglue.x.pipedream.net/", }, }; it("Generated hash should match signature", () => { const payloadString = JSON.stringify(legacyPayload, null, 2); const generatedHash = signatureHelper.getHashFromString(signatureHelper.replaceLinebreaks(payloadString), secret); expect(generatedHash).toEqual(signature); }); it("Signature should be valid", () => { const payloadString = JSON.stringify(legacyPayload, null, 2); const isValid = signatureHelper.isValidSignatureFromString( signatureHelper.replaceLinebreaks(payloadString), secret, signature, ); expect(isValid).toEqual(true); }); });