import { set } from "lodash"; import nock from "nock"; import zapier, { Bundle, createAppTester, ZObject } from "zapier-platform-core"; import { ZapierApp } from "./types"; export let App: ZapierApp; export let appTester: ReturnType; export function allowNet() { nock.enableNetConnect(); } export function describe(title: string, cb: () => void) { return (global as any).describe(title, () => { beforeEach(async () => { nock.cleanAll(); nock.disableNetConnect(); }); cb(); }); } export function setApp(appRaw: any) { appTester = zapier.createAppTester(appRaw); App = appRaw; } export function testCreate(key: string, bundle: Partial) { return appTester(App.creates[key].operation.perform, bundle); } export function testTrigger(key: string, bundle: Partial) { return appTester(App.triggers[key].operation.perform, bundle); } export function testSearch(key: string, bundle: Partial) { return appTester(App.searches[key].operation.perform, bundle); } const withEntity = ( entity: "create" | "trigger" | "search", fn: (z: ZObject, bundle: Bundle) => Promise, ) => { const appRaw = {}; set(appRaw, [`${entity}s`, "test", "operation", "perform"], fn); const appTester = zapier.createAppTester(appRaw); return (bundle: Partial) => appTester(fn, bundle); }; export const zMock = { create: (fn: (z: ZObject, bundle: Bundle) => Promise) => withEntity("create", fn), trigger: (fn: (z: ZObject, bundle: Bundle) => Promise) => withEntity("trigger", fn), search: (fn: (z: ZObject, bundle: Bundle) => Promise) => withEntity("search", fn), };