saleor-app-sdk-REDIS_APL/src/handlers/next/saleor-async-webhook.test.ts
Krzysztof Wolski e439438d8f
Add functions to process the Saleor webhooks (#100)
* Add functions to process the saleor webhooks

Co-authored-by: Lukasz Ostrowski <lukasz.ostrowski@saleor.io>
2022-11-03 13:05:28 +01:00

75 lines
2.5 KiB
TypeScript

import { createMocks } from "node-mocks-http";
import { describe, expect, it, vi } from "vitest";
import { APL } from "../../APL";
import { NextWebhookApiHandler, SaleorAsyncWebhook } from "./saleor-async-webhook";
const webhookPath = "api/webhooks/product-updated";
const baseUrl = "http://example.com";
describe("SaleorAsyncWebhook", () => {
const mockAPL: APL = {
get: async (domain: string) =>
domain === "example.com"
? {
domain: "example.com",
token: "mock-token",
}
: undefined,
set: vi.fn(),
delete: vi.fn(),
getAll: vi.fn(),
isReady: vi.fn(),
isConfigured: vi.fn(),
};
const saleorAsyncWebhook = new SaleorAsyncWebhook({
apl: mockAPL,
asyncEvent: "PRODUCT_UPDATED",
webhookPath,
});
it("targetUrl should return full path to the webhook route based on given baseUrl", async () => {
expect(saleorAsyncWebhook.getTargetUrl(baseUrl)).toBe(`${baseUrl}/${webhookPath}`);
});
it("getWebhookManifest should return a valid manifest", async () => {
expect(saleorAsyncWebhook.getWebhookManifest(baseUrl)).toStrictEqual({
asyncEvents: ["PRODUCT_UPDATED"],
isActive: true,
name: "PRODUCT_UPDATED webhook",
targetUrl: "http://example.com/api/webhooks/product-updated",
});
});
it("Test createHandler which return success", async () => {
// prepare mocked context returned by mocked process function
vi.mock("./process-async-saleor-webhook", () => ({
processAsyncSaleorWebhook: vi.fn().mockResolvedValue({
baseUrl: "example.com",
event: "product_updated",
payload: { data: "test_payload" },
authData: { domain: "example.com", token: "token" },
}),
}));
// Test handler - will throw error if mocked context is not passed to it
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const testHandler: NextWebhookApiHandler = vi.fn().mockImplementation((req, res, context) => {
if (context.payload.data === "test_payload") {
res.status(200).end();
return;
}
throw new Error("Test payload has not been passed to handler function");
});
// We are mocking validation method, so empty mock requests will pass
const { req, res } = createMocks();
const wrappedHandler = saleorAsyncWebhook.createHandler(testHandler);
await wrappedHandler(req, res);
expect(res.statusCode).toBe(200);
// Check if test handler was used by the wrapper
expect(testHandler).toBeCalledTimes(1);
});
});