@data-client/test
Version:
Testing utilities for Data Client
124 lines (120 loc) • 17.4 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
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 = _extends({}, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3Rpb25UeXBlcyIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiLCJNb2NrQ29udHJvbGxlciIsIkJhc2UiLCJmaXh0dXJlcyIsImdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEiLCJmaXh0dXJlTWFwIiwiaW50ZXJjZXB0b3JzIiwiTW9ja2VkQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYXJncyIsImludGVyY2VwdG9yRGF0YSIsIl9kaXNwYXRjaCIsImRpc3BhdGNoIiwiYWN0aW9uIiwiX2FjdGlvblR5cGVzJEZFVENIIiwidHlwZSIsIkZFVENIIiwiRkVUQ0hfVFlQRSIsImtleSIsImZpeHR1cmUiLCJoYXMiLCJnZXQiLCJjZml4IiwiZW5kcG9pbnQiLCJ0ZXN0S2V5IiwidW5kZWZpbmVkIiwiX2ZpeHR1cmUkZGVsYXkiLCJyZXBsYWNlZEFjdGlvbiIsIl9leHRlbmRzIiwiZGVsYXlNcyIsImRlbGF5IiwiZmV0Y2hSZXNwb25zZSIsInJlc3BvbnNlIiwiZXh0ZW5kIiwiaW5wdXQiLCJpbml0IiwicmV0IiwiY2FsbCIsIlByb21pc2UiLCJyZXNvbHZlIiwiUmVzcG9uc2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhdHVzIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJmZXRjaCIsIkVycm9yIiwiZGVsYXlDb2xsYXBzZSIsInNldFRpbWVvdXQiLCJyZXN1bHQiLCJlcnJvciIsIl9fcHJvdG9fXyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9Nb2NrQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhY3Rpb25UeXBlcyxcbiAgQ29udHJvbGxlcixcbiAgRGF0YUNsaWVudERpc3BhdGNoLFxuICBHZW5lcmljRGlzcGF0Y2gsXG59IGZyb20gJ0BkYXRhLWNsaWVudC9yZWFjdCc7XG5cbmltcG9ydCB7IGNvbGxhcHNlRml4dHVyZSB9IGZyb20gJy4vY29sbGFwc2VGaXh0dXJlLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZpeHR1cmVNYXAgfSBmcm9tICcuL2NyZWF0ZUZpeHR1cmVNYXAuanMnO1xuaW1wb3J0IHR5cGUgeyBGaXh0dXJlLCBJbnRlcmNlcHRvciB9IGZyb20gJy4vZml4dHVyZVR5cGVzLmpzJztcbmltcG9ydCB7IE1vY2tQcm9wcyB9IGZyb20gJy4vbW9ja1R5cGVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIE1vY2tDb250cm9sbGVyPFRCYXNlIGV4dGVuZHMgdHlwZW9mIENvbnRyb2xsZXIsIFQ+KFxuICBCYXNlOiBUQmFzZSxcbiAge1xuICAgIGZpeHR1cmVzID0gW10sXG4gICAgZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSA9ICgpID0+ICh7fSkgYXMgYW55LFxuICB9OiBNb2NrUHJvcHM8VD4sXG4pOiBUQmFzZSB7XG4gIGNvbnN0IFtmaXh0dXJlTWFwLCBpbnRlcmNlcHRvcnNdID0gY3JlYXRlRml4dHVyZU1hcChmaXh0dXJlcyk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBjbGFzcyBNb2NrZWRDb250cm9sbGVyPFxuICAgIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4gID4gZXh0ZW5kcyBCYXNlPEQ+IHtcbiAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eSAocmUtZGVjbGFyYXRpb24pXG4gICAgLy8gVE9ETzogZHJvcCB3aGVuIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZyAoMC4xNCBhbmQgYmVsb3cpXG4gICAgZGVjbGFyZSBwcm90ZWN0ZWQgX2Rpc3BhdGNoOiBEO1xuXG4gICAgZml4dHVyZU1hcDogTWFwPHN0cmluZywgRml4dHVyZT4gPSBmaXh0dXJlTWFwO1xuICAgIGludGVyY2VwdG9yczogSW50ZXJjZXB0b3I8YW55PltdID0gaW50ZXJjZXB0b3JzO1xuICAgIGludGVyY2VwdG9yRGF0YTogVCA9IGdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEoKTtcblxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcblxuICAgICAgLy8gbGVnYWN5IGNvbXBhdGliaWxpdHlcbiAgICAgIC8vIFRPRE86IGRyb3Agd2hlbiBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcgKDAuMTQgYW5kIGJlbG93KVxuICAgICAgaWYgKCF0aGlzLl9kaXNwYXRjaCkge1xuICAgICAgICB0aGlzLl9kaXNwYXRjaCA9IChhcmdzWzBdIGFzIGFueSkuZGlzcGF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbGVnYWN5IGNvbXBhdGliaWxpdHkgLSB3ZSBuZWVkIHRoaXMgdG8gd29yayB3aXRoIDAuMTQgYW5kIGJlbG93IGFzIHRoZXkgZG8gbm90IGhhdmUgdGhpcyBzZXR0ZXJcbiAgICAvLyBUT0RPOiBkcm9wIHdoZW4gZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nICgwLjE0IGFuZCBiZWxvdylcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNldCBkaXNwYXRjaChkaXNwYXRjaDogRCkge1xuICAgICAgdGhpcy5fZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB9XG5cbiAgICBnZXQgZGlzcGF0Y2goKTogRCB7XG4gICAgICByZXR1cm4gKChhY3Rpb246IFBhcmFtZXRlcnM8RD5bMF0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgLy8gc3VwcG9ydCBsZWdhY3kgdGhhdCBoYXMgX1RZUEUgc3VmZml4XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gKGFjdGlvblR5cGVzLkZFVENIID8/IGFjdGlvblR5cGVzLkZFVENIX1RZUEUpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgICAgIGxldCB7IGtleSwgYXJncyB9ID0gYWN0aW9uO1xuICAgICAgICAgIGxldCBmaXh0dXJlOiBGaXh0dXJlIHwgSW50ZXJjZXB0b3IgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMuZml4dHVyZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgZml4dHVyZSA9IHRoaXMuZml4dHVyZU1hcC5nZXQoa2V5KSBhcyBGaXh0dXJlO1xuICAgICAgICAgICAgaWYgKCFhcmdzKSBhcmdzID0gZml4dHVyZS5hcmdzO1xuICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2hlcyB0YWtlIHByaW9yaXR5OyBub3cgdGVzdCBDb21wdXRlZEZpeHR1cmVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjZml4IG9mIHRoaXMuaW50ZXJjZXB0b3JzKSB7XG4gICAgICAgICAgICAgIGlmIChjZml4LmVuZHBvaW50LnRlc3RLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGZpeHR1cmUgPSBjZml4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICAgIGlmIChmaXh0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VkQWN0aW9uOiB0eXBlb2YgYWN0aW9uID0ge1xuICAgICAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZGVsYXlNcyA9XG4gICAgICAgICAgICAgIHR5cGVvZiBmaXh0dXJlLmRlbGF5ID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgICAgICBmaXh0dXJlLmRlbGF5KC4uLihhcmdzIGFzIGFueSkpXG4gICAgICAgICAgICAgIDogKGZpeHR1cmUuZGVsYXkgPz8gMCk7XG5cbiAgICAgICAgICAgIGlmICgnZmV0Y2hSZXNwb25zZScgaW4gZml4dHVyZSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGZldGNoUmVzcG9uc2UgfSA9IGZpeHR1cmU7XG4gICAgICAgICAgICAgIGZpeHR1cmUgPSB7XG4gICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGZpeHR1cmUuZW5kcG9pbnQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UoLi4uYXJncykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSAoYWN0aW9uLmVuZHBvaW50IGFzIGFueSkuZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hSZXNwb25zZTogKGlucHV0OiBSZXF1ZXN0SW5mbywgaW5pdDogUmVxdWVzdEluaXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBmZXRjaFJlc3BvbnNlLmNhbGwodGhpcywgaW5wdXQsIGluaXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkocmV0KSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbmRwb2ludCBhcyBhbnkpKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmZXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFmaXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBmaXh0dXJlIGZvdW5kJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZGVsYXlDb2xsYXBzZSBkZXRlcm1pbmVzIHdoZW4gdGhlIGZpeHR1cmUgZnVuY3Rpb24gaXMgJ2NvbGxhcHNlZCcgKGFrYSAncnVuJylcbiAgICAgICAgICAgICAgLy8gY29sbGFwc2VkOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db3BlbmhhZ2VuX2ludGVycHJldGF0aW9uXG4gICAgICAgICAgICAgIGlmIChmaXh0dXJlLmRlbGF5Q29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNcykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbGxhcHNlRml4dHVyZShcbiAgICAgICAgICAgICAgICBmaXh0dXJlIGFzIGFueSxcbiAgICAgICAgICAgICAgICBhcmdzIGFzIGFueSxcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyY2VwdG9yRGF0YSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKCFmaXh0dXJlLmRlbGF5Q29sbGFwc2UgJiYgZGVsYXlNcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdC5yZXNwb25zZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50IGFzIGFueSkuZXh0ZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50ID0gKHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50IGFzIGFueSkuZXh0ZW5kKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZldGNoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBmdWxsIHRlc3Rpbmcgb2YgdGhpc1xuICAgICAgICAgICAgICByZXBsYWNlZEFjdGlvbi5lbmRwb2ludCA9IGZldGNoIGFzIGFueTtcbiAgICAgICAgICAgICAgKHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50IGFzIGFueSkuX19wcm90b19fID0gYWN0aW9uLmVuZHBvaW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHN1cGVyLmRpc3BhdGNoIChvbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaChyZXBsYWNlZEFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IG1ha2Ugc3VwZXIuZGlzcGF0Y2ggKG9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nKVxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgIH0pIGFzIGFueTtcbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUNFQSxXQUFXLFFBSU4sb0JBQW9CO0FBRTNCLFNBQVNDLGVBQWUsUUFBUSxzQkFBc0I7QUFDdEQsU0FBU0Ms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