UNPKG

@data-client/test

Version:
125 lines (121 loc) 17.3 kB
import { actionTypes } from '@data-client/react'; import { collapseFixture } from './collapseFixture.js'; import { createFixtureMap } from './createFixtureMap.js'; export function MockController(Base, { fixtures = [], getInitialInterceptorData = () => ({}) }) { const [fixtureMap, interceptors] = createFixtureMap(fixtures); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore return class MockedController extends Base { constructor(...args) { super(...args); // legacy compatibility // TODO: drop when drop support for destructuring (0.14 and below) // legacy compatibility (re-declaration) // TODO: drop when drop support for destructuring (0.14 and below) this.fixtureMap = fixtureMap; this.interceptors = interceptors; this.interceptorData = getInitialInterceptorData(); if (!this._dispatch) { this._dispatch = args[0].dispatch; } } // legacy compatibility - we need this to work with 0.14 and below as they do not have this setter // TODO: drop when drop support for destructuring (0.14 and below) // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore set dispatch(dispatch) { this._dispatch = dispatch; } get dispatch() { return action => { var _actionTypes$FETCH; // support legacy that has _TYPE suffix if (action.type === ((_actionTypes$FETCH = actionTypes.FETCH) != null ? _actionTypes$FETCH : actionTypes.FETCH_TYPE)) { // eslint-disable-next-line prefer-const let { key, args } = action; let fixture; if (this.fixtureMap.has(key)) { fixture = this.fixtureMap.get(key); if (!args) args = fixture.args; // exact matches take priority; now test ComputedFixture } else { for (const cfix of this.interceptors) { if (cfix.endpoint.testKey(key)) { fixture = cfix; break; } } } // we have a match if (fixture !== undefined) { var _fixture$delay; const replacedAction = { ...action }; const delayMs = typeof fixture.delay === 'function' ? fixture.delay(...args) : (_fixture$delay = fixture.delay) != null ? _fixture$delay : 0; if ('fetchResponse' in fixture) { const { fetchResponse } = fixture; fixture = { endpoint: fixture.endpoint, response(...args) { const endpoint = action.endpoint.extend({ fetchResponse: (input, init) => { const ret = fetchResponse.call(this, input, init); return Promise.resolve(new Response(JSON.stringify(ret), { status: 200, headers: new Headers({ 'Content-Type': 'application/json' }) })); } }); return endpoint(...args); } }; } const fetch = async () => { if (!fixture) { throw new Error('No fixture found'); } // delayCollapse determines when the fixture function is 'collapsed' (aka 'run') // collapsed: https://en.wikipedia.org/wiki/Copenhagen_interpretation if (fixture.delayCollapse) { await new Promise(resolve => setTimeout(resolve, delayMs)); } const result = await collapseFixture(fixture, args, this.interceptorData); if (!fixture.delayCollapse && delayMs) { await new Promise(resolve => setTimeout(resolve, delayMs)); } if (result.error) { throw result.response; } return result.response; }; if (typeof replacedAction.endpoint.extend === 'function') { replacedAction.endpoint = replacedAction.endpoint.extend({ fetch }); } else { // TODO: full testing of this replacedAction.endpoint = fetch; replacedAction.endpoint.__proto__ = action.endpoint; } // TODO: make super.dispatch (once we drop support for destructuring) return this._dispatch(replacedAction); } } // TODO: make super.dispatch (once we drop support for destructuring) return this._dispatch(action); }; } }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3Rpb25UeXBlcyIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiLCJNb2NrQ29udHJvbGxlciIsIkJhc2UiLCJmaXh0dXJlcyIsImdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEiLCJmaXh0dXJlTWFwIiwiaW50ZXJjZXB0b3JzIiwiTW9ja2VkQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYXJncyIsImludGVyY2VwdG9yRGF0YSIsIl9kaXNwYXRjaCIsImRpc3BhdGNoIiwiYWN0aW9uIiwiX2FjdGlvblR5cGVzJEZFVENIIiwidHlwZSIsIkZFVENIIiwiRkVUQ0hfVFlQRSIsImtleSIsImZpeHR1cmUiLCJoYXMiLCJnZXQiLCJjZml4IiwiZW5kcG9pbnQiLCJ0ZXN0S2V5IiwidW5kZWZpbmVkIiwiX2ZpeHR1cmUkZGVsYXkiLCJyZXBsYWNlZEFjdGlvbiIsImRlbGF5TXMiLCJkZWxheSIsImZldGNoUmVzcG9uc2UiLCJyZXNwb25zZSIsImV4dGVuZCIsImlucHV0IiwiaW5pdCIsInJldCIsImNhbGwiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlJlc3BvbnNlIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXR1cyIsImhlYWRlcnMiLCJIZWFkZXJzIiwiZmV0Y2giLCJFcnJvciIsImRlbGF5Q29sbGFwc2UiLCJzZXRUaW1lb3V0IiwicmVzdWx0IiwiZXJyb3IiLCJfX3Byb3RvX18iXSwic291cmNlcyI6WyIuLi9zcmMvTW9ja0NvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYWN0aW9uVHlwZXMsXG4gIENvbnRyb2xsZXIsXG4gIERhdGFDbGllbnREaXNwYXRjaCxcbiAgR2VuZXJpY0Rpc3BhdGNoLFxufSBmcm9tICdAZGF0YS1jbGllbnQvcmVhY3QnO1xuXG5pbXBvcnQgeyBjb2xsYXBzZUZpeHR1cmUgfSBmcm9tICcuL2NvbGxhcHNlRml4dHVyZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVGaXh0dXJlTWFwIH0gZnJvbSAnLi9jcmVhdGVGaXh0dXJlTWFwLmpzJztcbmltcG9ydCB0eXBlIHsgRml4dHVyZSwgSW50ZXJjZXB0b3IgfSBmcm9tICcuL2ZpeHR1cmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBNb2NrUHJvcHMgfSBmcm9tICcuL21vY2tUeXBlcy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2NrQ29udHJvbGxlcjxUQmFzZSBleHRlbmRzIHR5cGVvZiBDb250cm9sbGVyLCBUPihcbiAgQmFzZTogVEJhc2UsXG4gIHtcbiAgICBmaXh0dXJlcyA9IFtdLFxuICAgIGdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEgPSAoKSA9PiAoe30pIGFzIGFueSxcbiAgfTogTW9ja1Byb3BzPFQ+LFxuKTogVEJhc2Uge1xuICBjb25zdCBbZml4dHVyZU1hcCwgaW50ZXJjZXB0b3JzXSA9IGNyZWF0ZUZpeHR1cmVNYXAoZml4dHVyZXMpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gY2xhc3MgTW9ja2VkQ29udHJvbGxlcjxcbiAgICBEIGV4dGVuZHMgR2VuZXJpY0Rpc3BhdGNoID0gRGF0YUNsaWVudERpc3BhdGNoLFxuICA+IGV4dGVuZHMgQmFzZTxEPiB7XG4gICAgLy8gbGVnYWN5IGNvbXBhdGliaWxpdHkgKHJlLWRlY2xhcmF0aW9uKVxuICAgIC8vIFRPRE86IGRyb3Agd2hlbiBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcgKDAuMTQgYW5kIGJlbG93KVxuICAgIGRlY2xhcmUgcHJvdGVjdGVkIF9kaXNwYXRjaDogRDtcblxuICAgIGZpeHR1cmVNYXA6IE1hcDxzdHJpbmcsIEZpeHR1cmU+ID0gZml4dHVyZU1hcDtcbiAgICBpbnRlcmNlcHRvcnM6IEludGVyY2VwdG9yPGFueT5bXSA9IGludGVyY2VwdG9ycztcbiAgICBpbnRlcmNlcHRvckRhdGE6IFQgPSBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhKCk7XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG5cbiAgICAgIC8vIGxlZ2FjeSBjb21wYXRpYmlsaXR5XG4gICAgICAvLyBUT0RPOiBkcm9wIHdoZW4gZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nICgwLjE0IGFuZCBiZWxvdylcbiAgICAgIGlmICghdGhpcy5fZGlzcGF0Y2gpIHtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2ggPSAoYXJnc1swXSBhcyBhbnkpLmRpc3BhdGNoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxlZ2FjeSBjb21wYXRpYmlsaXR5IC0gd2UgbmVlZCB0aGlzIHRvIHdvcmsgd2l0aCAwLjE0IGFuZCBiZWxvdyBhcyB0aGV5IGRvIG5vdCBoYXZlIHRoaXMgc2V0dGVyXG4gICAgLy8gVE9ETzogZHJvcCB3aGVuIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZyAoMC4xNCBhbmQgYmVsb3cpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZXQgZGlzcGF0Y2goZGlzcGF0Y2g6IEQpIHtcbiAgICAgIHRoaXMuX2Rpc3BhdGNoID0gZGlzcGF0Y2g7XG4gICAgfVxuXG4gICAgZ2V0IGRpc3BhdGNoKCk6IEQge1xuICAgICAgcmV0dXJuICgoYWN0aW9uOiBQYXJhbWV0ZXJzPEQ+WzBdKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIC8vIHN1cHBvcnQgbGVnYWN5IHRoYXQgaGFzIF9UWVBFIHN1ZmZpeFxuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IChhY3Rpb25UeXBlcy5GRVRDSCA/PyBhY3Rpb25UeXBlcy5GRVRDSF9UWVBFKSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICBsZXQgeyBrZXksIGFyZ3MgfSA9IGFjdGlvbjtcbiAgICAgICAgICBsZXQgZml4dHVyZTogRml4dHVyZSB8IEludGVyY2VwdG9yIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLmZpeHR1cmVNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGZpeHR1cmUgPSB0aGlzLmZpeHR1cmVNYXAuZ2V0KGtleSkgYXMgRml4dHVyZTtcbiAgICAgICAgICAgIGlmICghYXJncykgYXJncyA9IGZpeHR1cmUuYXJncztcbiAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoZXMgdGFrZSBwcmlvcml0eTsgbm93IHRlc3QgQ29tcHV0ZWRGaXh0dXJlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2ZpeCBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgICAgICAgICBpZiAoY2ZpeC5lbmRwb2ludC50ZXN0S2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBmaXh0dXJlID0gY2ZpeDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSBoYXZlIGEgbWF0Y2hcbiAgICAgICAgICBpZiAoZml4dHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZEFjdGlvbjogdHlwZW9mIGFjdGlvbiA9IHtcbiAgICAgICAgICAgICAgLi4uYWN0aW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5TXMgPVxuICAgICAgICAgICAgICB0eXBlb2YgZml4dHVyZS5kZWxheSA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgICAgICAgICAgZml4dHVyZS5kZWxheSguLi4oYXJncyBhcyBhbnkpKVxuICAgICAgICAgICAgICA6IChmaXh0dXJlLmRlbGF5ID8/IDApO1xuXG4gICAgICAgICAgICBpZiAoJ2ZldGNoUmVzcG9uc2UnIGluIGZpeHR1cmUpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBmZXRjaFJlc3BvbnNlIH0gPSBmaXh0dXJlO1xuICAgICAgICAgICAgICBmaXh0dXJlID0ge1xuICAgICAgICAgICAgICAgIGVuZHBvaW50OiBmaXh0dXJlLmVuZHBvaW50LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHBvaW50ID0gKGFjdGlvbi5lbmRwb2ludCBhcyBhbnkpLmV4dGVuZCh7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoUmVzcG9uc2U6IChpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gZmV0Y2hSZXNwb25zZS5jYWxsKHRoaXMsIGlucHV0LCBpbml0KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KHJldCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoZW5kcG9pbnQgYXMgYW55KSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmV0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghZml4dHVyZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZml4dHVyZSBmb3VuZCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGRlbGF5Q29sbGFwc2UgZGV0ZXJtaW5lcyB3aGVuIHRoZSBmaXh0dXJlIGZ1bmN0aW9uIGlzICdjb2xsYXBzZWQnIChha2EgJ3J1bicpXG4gICAgICAgICAgICAgIC8vIGNvbGxhcHNlZDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29wZW5oYWdlbl9pbnRlcnByZXRhdGlvblxuICAgICAgICAgICAgICBpZiAoZml4dHVyZS5kZWxheUNvbGxhcHNlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2xsYXBzZUZpeHR1cmUoXG4gICAgICAgICAgICAgICAgZml4dHVyZSBhcyBhbnksXG4gICAgICAgICAgICAgICAgYXJncyBhcyBhbnksXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRvckRhdGEsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICghZml4dHVyZS5kZWxheUNvbGxhcHNlICYmIGRlbGF5TXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNcykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQucmVzcG9uc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXBsYWNlZEFjdGlvbi5lbmRwb2ludCBhcyBhbnkpLmV4dGVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXBsYWNlZEFjdGlvbi5lbmRwb2ludCA9IChyZXBsYWNlZEFjdGlvbi5lbmRwb2ludCBhcyBhbnkpLmV4dGVuZChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBmZXRjaCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogZnVsbCB0ZXN0aW5nIG9mIHRoaXNcbiAgICAgICAgICAgICAgcmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgPSBmZXRjaCBhcyBhbnk7XG4gICAgICAgICAgICAgIChyZXBsYWNlZEFjdGlvbi5lbmRwb2ludCBhcyBhbnkpLl9fcHJvdG9fXyA9IGFjdGlvbi5lbmRwb2ludDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVE9ETzogbWFrZSBzdXBlci5kaXNwYXRjaCAob25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2gocmVwbGFjZWRBY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBtYWtlIHN1cGVyLmRpc3BhdGNoIChvbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZylcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoKGFjdGlvbik7XG4gICAgICB9KSBhcyBhbnk7XG4gICAgfVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUNFQSxXQUFXLFFBSU4sb0JBQW9CO0FBRTNCLFNBQVNDLGVBQWUsUUFBUSxzQkFBc0I7QUFDdEQsU0FBU0MsZ0JBQWdCLFFBQVEs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