190 lines
5.4 KiB
TypeScript
190 lines
5.4 KiB
TypeScript
![]() |
import { SaleorAsyncWebhook, SaleorSyncWebhook } from "@saleor/app-sdk/handlers/next";
|
||
|
import { describe, it, vitest, expect } from "vitest";
|
||
|
import { AppWebhookMigrator } from "./app-webhook-migrator";
|
||
|
import { AppWebhookRepository } from "./app-webhook-repository";
|
||
|
|
||
|
describe("AppWebhookMigrator", () => {
|
||
|
describe("registerWebhookIfItDoesntExist", () => {
|
||
|
describe("in report mode", () => {
|
||
|
it("does not call create", async () => {
|
||
|
const createMock = vitest.fn();
|
||
|
const appWebhookRepository = {
|
||
|
create: createMock,
|
||
|
getAll: () => [],
|
||
|
} as unknown as AppWebhookRepository;
|
||
|
|
||
|
const appWebhookMigrator = new AppWebhookMigrator(
|
||
|
{
|
||
|
appWebhookRepository,
|
||
|
apiUrl: "apiUrl",
|
||
|
appId: "appId",
|
||
|
},
|
||
|
{ mode: "report" }
|
||
|
);
|
||
|
|
||
|
await appWebhookMigrator.registerWebhookIfItDoesntExist({} as SaleorAsyncWebhook);
|
||
|
|
||
|
expect(createMock).not.toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
describe("in migrate mode", () => {
|
||
|
it("calls create", async () => {
|
||
|
const createMock = vitest.fn();
|
||
|
const appWebhookRepository = {
|
||
|
create: createMock,
|
||
|
getAll: () => [],
|
||
|
} as unknown as AppWebhookRepository;
|
||
|
|
||
|
const appWebhookMigrator = new AppWebhookMigrator(
|
||
|
{
|
||
|
appWebhookRepository,
|
||
|
apiUrl: "apiUrl",
|
||
|
appId: "appId",
|
||
|
},
|
||
|
{ mode: "migrate" }
|
||
|
);
|
||
|
|
||
|
const webhookHandler = {
|
||
|
getWebhookManifest: () => {
|
||
|
return {
|
||
|
name: "OrderCreated",
|
||
|
targetUrl: `targetUrl`,
|
||
|
query: "query",
|
||
|
asyncEvents: ["OrderCreated"],
|
||
|
};
|
||
|
},
|
||
|
} as unknown as SaleorAsyncWebhook;
|
||
|
|
||
|
await appWebhookMigrator.registerWebhookIfItDoesntExist(webhookHandler);
|
||
|
|
||
|
expect(createMock).toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe("rollbackWebhookMigrations", () => {
|
||
|
describe("in report mode", () => {
|
||
|
it("does not call delete", async () => {
|
||
|
const deleteMock = vitest.fn();
|
||
|
const appWebhookRepository = {
|
||
|
delete: deleteMock,
|
||
|
getAll: () => [],
|
||
|
} as unknown as AppWebhookRepository;
|
||
|
|
||
|
const appWebhookMigrator = new AppWebhookMigrator(
|
||
|
{
|
||
|
appWebhookRepository,
|
||
|
apiUrl: "apiUrl",
|
||
|
appId: "appId",
|
||
|
},
|
||
|
{ mode: "report" }
|
||
|
);
|
||
|
|
||
|
await appWebhookMigrator.rollbackWebhookMigrations(
|
||
|
"OrderCreated",
|
||
|
{} as unknown as SaleorSyncWebhook
|
||
|
);
|
||
|
|
||
|
expect(deleteMock).not.toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
describe("in migrate mode", async () => {
|
||
|
const deleteMock = vitest.fn();
|
||
|
const enableMock = vitest.fn();
|
||
|
const appWebhookRepository = {
|
||
|
delete: deleteMock,
|
||
|
enable: enableMock,
|
||
|
getAll: () => [
|
||
|
{
|
||
|
id: "id-1234",
|
||
|
name: "OrderConfirmed",
|
||
|
},
|
||
|
|
||
|
{
|
||
|
id: "id-5678",
|
||
|
name: "OrderCreated",
|
||
|
},
|
||
|
{
|
||
|
id: "id",
|
||
|
name: "OrderUpdated",
|
||
|
},
|
||
|
],
|
||
|
} as unknown as AppWebhookRepository;
|
||
|
|
||
|
const appWebhookMigrator = new AppWebhookMigrator(
|
||
|
{
|
||
|
appWebhookRepository,
|
||
|
apiUrl: "apiUrl",
|
||
|
appId: "appId",
|
||
|
},
|
||
|
{ mode: "migrate" }
|
||
|
);
|
||
|
|
||
|
await appWebhookMigrator.rollbackWebhookMigrations("OrderCreated", {
|
||
|
name: "OrderConfirmed",
|
||
|
targetUrl: `targetUrl`,
|
||
|
query: "query",
|
||
|
events: ["OrderConfirmed"],
|
||
|
} as unknown as SaleorSyncWebhook);
|
||
|
|
||
|
it("calls delete with the id that matches the handler", async () => {
|
||
|
expect(deleteMock).toHaveBeenCalledWith("id-1234");
|
||
|
});
|
||
|
|
||
|
it("calls enable with the id that matches the name of the previous webhook", async () => {
|
||
|
expect(enableMock).toHaveBeenCalledWith("id-5678");
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe("DANGEROUS_DELETE_APP_WEBHOOK_BY_NAME", () => {
|
||
|
describe("in report mode", () => {
|
||
|
it("does not call delete", async () => {
|
||
|
const deleteMock = vitest.fn();
|
||
|
const appWebhookRepository = {
|
||
|
delete: deleteMock,
|
||
|
getAll: () => [],
|
||
|
} as unknown as AppWebhookRepository;
|
||
|
|
||
|
const appWebhookMigrator = new AppWebhookMigrator(
|
||
|
{
|
||
|
appWebhookRepository,
|
||
|
apiUrl: "apiUrl",
|
||
|
appId: "appId",
|
||
|
},
|
||
|
{ mode: "report" }
|
||
|
);
|
||
|
|
||
|
await appWebhookMigrator.DANGEROUS_DELETE_APP_WEBHOOK_BY_NAME("OrderCreated");
|
||
|
|
||
|
expect(deleteMock).not.toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
describe("in migrate mode", () => {
|
||
|
it("calls delete", async () => {
|
||
|
const deleteMock = vitest.fn();
|
||
|
const appWebhookRepository = {
|
||
|
delete: deleteMock,
|
||
|
getAll: () => [
|
||
|
{
|
||
|
name: "OrderCreated",
|
||
|
id: "id-1234",
|
||
|
},
|
||
|
],
|
||
|
} as unknown as AppWebhookRepository;
|
||
|
|
||
|
const appWebhookMigrator = new AppWebhookMigrator(
|
||
|
{
|
||
|
appWebhookRepository,
|
||
|
apiUrl: "apiUrl",
|
||
|
appId: "appId",
|
||
|
},
|
||
|
{ mode: "migrate" }
|
||
|
);
|
||
|
|
||
|
await appWebhookMigrator.DANGEROUS_DELETE_APP_WEBHOOK_BY_NAME("OrderCreated");
|
||
|
|
||
|
expect(deleteMock).toHaveBeenCalledWith("id-1234");
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|