
* refactor: ♻️ extract order-metadata-manager * feat: 🚧 add basic boilerplate * feat: ✨ add readExternalIdFromOrderMetadata * Revert "feat: ✨ add readExternalIdFromOrderMetadata" This reverts commit a78d9d4597672f8605cf998a9f784aebaab27de1. * feat: ✨ add order-cancelled avatax adapter * test: ✅ add tests for AvataxOrderCancelledPayloadTransformer * refactor: avataxId instead of externalId * refactor: ♻️ split up webhook response * build: ⬆️ upgrade avatax * refactor: ♻️ extend logging in webhook response errors * fix: 🐛 split privateMetadata and publicMetadata * fix: 🐛 use "DEFAULT" value of companyCode for commit to work * fix: ⚗️ fix voidTransaction type * refactor: 🚚 order_created -> order_confirmed * fix: 🐛 change voidReason * build: 👷 add changeset * refactor: 🔥 order_fulfilled webhook * feat: Avatax metadata tax calculation date (#843) * feat: ✨ add metadata tax calculation date * build: 👷 add changeset * feat: Avatax metadata document code (#844) * feat: ✨ provide document code through metadata field * build: 👷 add changeset * refactor: ♻️ fallback to default company code for migration * refactor: ♻️ patch order-created files and add deprecation note * Revert "refactor: 🔥 order_fulfilled webhook" This reverts commit fd098642735ae9d62e3a876088226bd0f108afd6. * refactor: ♻️ patch order-fulfilled files and add deprecation note * fix: 🐛 bring back deprecated webhooks to manifest * feat: ⚗️ add AppWebhookMigrator (#850) * refactor: 🚚 order_created -> order_confirmed * refactor: 🔥 order_fulfilled webhook * feat: ⚗️ add AppWebhookMigrator * feat: ✨ add mode to migrator * feat: ✨ add draft of run-report and migrateWebhook method * refactor: ♻️ address feedback * feat: ✨ add tests and new structure * refactor: 🔥 util * feat: ✨ add enable/disable webhook rollback flow * refactor: ♻️ modify the taxes-migration flow * refactor: ♻️ generalize document code & date resolver * chore: 🗃️ add run-migration * chore: 💡 update comments about migration flow * fix: 🐛 slice document code * refactor: ♻️ try/catch at the top level * chore: 💡 add comments * Update shiny-meals-wait.md * Update soft-steaks-know.md * Update soft-steaks-know.md * fix: ✅ fix test * feat: ✨ change createTransaction to createOrAdjustTransaction this feature grants idempotency of the transaction flow * feat: ✨ add number field to OrderConfirmed payload * chore: 💡 add deprecation comment to metadata method * docs: 📝 add todo comment to refactor sumPayloadLines * feat: ✨ add resolveStringOrThrow and use it for email * fix: 🐛 add missing number to mock
189 lines
5.4 KiB
TypeScript
189 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");
|
|
});
|
|
});
|
|
});
|
|
});
|