@data-client/test
Version:
Testing utilities for Data Client
105 lines (104 loc) • 15.6 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
const _excluded = ["initialFixtures", "resolverFixtures", "getInitialInterceptorData"],
_excluded2 = ["children"];
import { SubscriptionManager, NetworkManager, PollingSubscription, Controller } from '@data-client/react';
import React, { memo, Suspense } from 'react';
import { renderHook, act } from './renderHook.cjs';
import { MockController } from '../MockController.js';
import mockInitialState from '../mockState.js';
import { jsx as _jsx } from "react/jsx-runtime";
/** @see https://dataclient.io/docs/api/makeRenderDataHook */
export default function makeRenderDataHook(Provider) {
const renderDataClient = (callback, _ref = {}) => {
let {
initialFixtures,
resolverFixtures,
getInitialInterceptorData = () => ({})
} = _ref,
options = _objectWithoutPropertiesLoose(_ref, _excluded);
/** Wraps dispatches that are typically called declaratively in act() */
class ActController extends MockController(Controller, resolverFixtures ? {
fixtures: resolverFixtures,
getInitialInterceptorData
} : {}) {
constructor(options) {
super(options);
const {
setResponse,
resolve
} = this;
this.setResponse = (...args) => {
let promise;
act(() => {
promise = setResponse.call(this, ...args);
});
return promise;
};
this.resolve = (...args) => {
let promise;
act(() => {
promise = resolve.call(this, ...args);
});
return promise;
};
}
}
// we want fresh manager state in each instance
const nm = new NetworkManager();
const sm = new SubscriptionManager(PollingSubscription);
const managers = [nm, sm];
// this pattern is dangerous if renderDataClient is shared between tests
// TODO: move to return value
renderDataClient.cleanup = () => {
nm.cleanupDate = Infinity;
Object.values(nm['rejectors']).forEach(rej => {
rej();
});
nm['clearAll']();
managers.forEach(manager => manager.cleanup());
};
renderDataClient.allSettled = () => {
return nm.allSettled();
};
const initialState = mockInitialState(initialFixtures);
const ProviderWithResolver = /*#__PURE__*/memo(function ProviderWithResolver({
children
}) {
return /*#__PURE__*/_jsx(Provider, {
initialState: initialState,
Controller: ActController,
managers: managers,
devButton: null,
children: children
});
});
const Wrapper = options == null ? void 0 : options.wrapper;
const ProviderWithWrapper = Wrapper ? function ProviderWrapped(props) {
return /*#__PURE__*/_jsx(ProviderWithResolver, {
children: /*#__PURE__*/_jsx(Wrapper, _extends({}, props))
});
} : ProviderWithResolver;
const wrapper = _ref2 => {
let {
children
} = _ref2,
props = _objectWithoutPropertiesLoose(_ref2, _excluded2);
return /*#__PURE__*/_jsx(ProviderWithWrapper, _extends({}, props, {
children: /*#__PURE__*/_jsx(Suspense, {
fallback: null,
children: children
})
}));
};
const ret = renderHook(callback, _extends({}, options, {
wrapper
}));
ret.controller = nm['controller'];
return ret;
};
renderDataClient.cleanup = () => {};
renderDataClient.allSettled = () => Promise.allSettled([]);
return renderDataClient;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdWJzY3JpcHRpb25NYW5hZ2VyIiwiTmV0d29ya01hbmFnZXIiLCJQb2xsaW5nU3Vic2NyaXB0aW9uIiwiQ29udHJvbGxlciIsIlJlYWN0IiwibWVtbyIsIlN1c3BlbnNlIiwicmVuZGVySG9vayIsImFjdCIsIk1vY2tDb250cm9sbGVyIiwibW9ja0luaXRpYWxTdGF0ZSIsImpzeCIsIl9qc3giLCJtYWtlUmVuZGVyRGF0YUhvb2siLCJQcm92aWRlciIsInJlbmRlckRhdGFDbGllbnQiLCJjYWxsYmFjayIsIl9yZWYiLCJpbml0aWFsRml4dHVyZXMiLCJyZXNvbHZlckZpeHR1cmVzIiwiZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSIsIm9wdGlvbnMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsIl9leGNsdWRlZCIsIkFjdENvbnRyb2xsZXIiLCJmaXh0dXJlcyIsImNvbnN0cnVjdG9yIiwic2V0UmVzcG9uc2UiLCJyZXNvbHZlIiwiYXJncyIsInByb21pc2UiLCJjYWxsIiwibm0iLCJzbSIsIm1hbmFnZXJzIiwiY2xlYW51cCIsImNsZWFudXBEYXRlIiwiSW5maW5pdHkiLCJPYmplY3QiLCJ2YWx1ZXMiLCJmb3JFYWNoIiwicmVqIiwibWFuYWdlciIsImFsbFNldHRsZWQiLCJpbml0aWFsU3RhdGUiLCJQcm92aWRlcldpdGhSZXNvbHZlciIsImNoaWxkcmVuIiwiZGV2QnV0dG9uIiwiV3JhcHBlciIsIndyYXBwZXIiLCJQcm92aWRlcldpdGhXcmFwcGVyIiwiUHJvdmlkZXJXcmFwcGVkIiwicHJvcHMiLCJfZXh0ZW5kcyIsIl9yZWYyIiwiX2V4Y2x1ZGVkMiIsImZhbGxiYWNrIiwicmV0IiwiY29udHJvbGxlciIsIlByb21pc2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFrZVJlbmRlckRhdGFDbGllbnQvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFN0YXRlLFxuICBNYW5hZ2VyLFxuICBTdWJzY3JpcHRpb25NYW5hZ2VyLFxuICBOZXR3b3JrTWFuYWdlcixcbiAgUG9sbGluZ1N1YnNjcmlwdGlvbixcbiAgQ29udHJvbGxlcixcbiAgR2VuZXJpY0Rpc3BhdGNoLFxuICBEYXRhQ2xpZW50RGlzcGF0Y2gsXG59IGZyb20gJ0BkYXRhLWNsaWVudC9yZWFjdCc7XG5pbXBvcnQgUmVhY3QsIHsgbWVtbywgU3VzcGVuc2UgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7XG4gIHJlbmRlckhvb2ssXG4gIGFjdCxcbiAgUmVuZGVySG9va1Jlc3VsdCxcbiAgdHlwZSBSZW5kZXJIb29rT3B0aW9ucyxcbn0gZnJvbSAnLi9yZW5kZXJIb29rLmNqcyc7XG5pbXBvcnQgeyBJbnRlcmNlcHRvciwgRml4dHVyZSB9IGZyb20gJy4uL2ZpeHR1cmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBNb2NrQ29udHJvbGxlciB9IGZyb20gJy4uL01vY2tDb250cm9sbGVyLmpzJztcbmltcG9ydCBtb2NrSW5pdGlhbFN0YXRlIGZyb20gJy4uL21vY2tTdGF0ZS5qcyc7XG5pbXBvcnQgeyBNb2NrUHJvcHMgfSBmcm9tICcuLi9tb2NrVHlwZXMuanMnO1xuXG4vKiogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvbWFrZVJlbmRlckRhdGFIb29rICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlUmVuZGVyRGF0YUhvb2soXG4gIFByb3ZpZGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPERhdGFQcm92aWRlclByb3BzPixcbikge1xuICBjb25zdCByZW5kZXJEYXRhQ2xpZW50OiBSZW5kZXJEYXRhSG9vayA9ICg8UCwgUiwgVCA9IGFueT4oXG4gICAgY2FsbGJhY2s6IChwcm9wczogUCkgPT4gUixcbiAgICB7XG4gICAgICBpbml0aWFsRml4dHVyZXMsXG4gICAgICByZXNvbHZlckZpeHR1cmVzLFxuICAgICAgZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSA9ICgpID0+ICh7fSkgYXMgYW55LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IHtcbiAgICAgIGluaXRpYWxQcm9wcz86IFA7XG4gICAgICBpbml0aWFsRml4dHVyZXM/OiBGaXh0dXJlW107XG4gICAgICByZXNvbHZlckZpeHR1cmVzPzogKEZpeHR1cmUgfCBJbnRlcmNlcHRvcjxUPilbXTtcbiAgICAgIGdldEluaXRpYWxJbnRlcmNlcHRvckRhdGE/OiAoKSA9PiBUO1xuICAgICAgd3JhcHBlcj86IFJlYWN0LkNvbXBvbmVudFR5cGU8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4+O1xuICAgIH0gJiBPbWl0PFJlbmRlckhvb2tPcHRpb25zPFA+LCAnaW5pdGlhbFByb3BzJyB8ICd3cmFwcGVyJz4gPSB7fSBhcyBhbnksXG4gICk6IFJlbmRlckhvb2tSZXN1bHQ8UiwgUD4gJiB7IGNvbnRyb2xsZXI6IENvbnRyb2xsZXIgfSA9PiB7XG4gICAgLyoqIFdyYXBzIGRpc3BhdGNoZXMgdGhhdCBhcmUgdHlwaWNhbGx5IGNhbGxlZCBkZWNsYXJhdGl2ZWx5IGluIGFjdCgpICovXG4gICAgY2xhc3MgQWN0Q29udHJvbGxlcjxcbiAgICAgIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4gICAgICBUID0ge30sXG4gICAgPiBleHRlbmRzIE1vY2tDb250cm9sbGVyKFxuICAgICAgQ29udHJvbGxlcixcbiAgICAgIHJlc29sdmVyRml4dHVyZXMgP1xuICAgICAgICB7XG4gICAgICAgICAgZml4dHVyZXM6IHJlc29sdmVyRml4dHVyZXMsXG4gICAgICAgICAgZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSxcbiAgICAgICAgfVxuICAgICAgOiB7fSxcbiAgICApPEQ+IHtcbiAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBvcHRpb25zOiBNb2NrUHJvcHM8VD4gJiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIENvbnRyb2xsZXI8RD4+WzBdLFxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IHNldFJlc3BvbnNlLCByZXNvbHZlIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLnNldFJlc3BvbnNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBsZXQgcHJvbWlzZTogYW55O1xuICAgICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gc2V0UmVzcG9uc2UuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZXNvbHZlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBsZXQgcHJvbWlzZTogYW55O1xuICAgICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gcmVzb2x2ZS5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdlIHdhbnQgZnJlc2ggbWFuYWdlciBzdGF0ZSBpbiBlYWNoIGluc3RhbmNlXG4gICAgY29uc3Qgbm0gPSBuZXcgTmV0d29ya01hbmFnZXIoKTtcbiAgICBjb25zdCBzbSA9IG5ldyBTdWJzY3JpcHRpb25NYW5hZ2VyKFBvbGxpbmdTdWJzY3JpcHRpb24pO1xuICAgIGNvbnN0IG1hbmFnZXJzID0gW25tLCBzbV07XG4gICAgLy8gdGhpcyBwYXR0ZXJuIGlzIGRhbmdlcm91cyBpZiByZW5kZXJEYXRhQ2xpZW50IGlzIHNoYXJlZCBiZXR3ZWVuIHRlc3RzXG4gICAgLy8gVE9ETzogbW92ZSB0byByZXR1cm4gdmFsdWVcbiAgICByZW5kZXJEYXRhQ2xpZW50LmNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBubS5jbGVhbnVwRGF0ZSA9IEluZmluaXR5O1xuICAgICAgT2JqZWN0LnZhbHVlcyhubVsncmVqZWN0b3JzJ10gYXMgUmVjb3JkPHN0cmluZywgYW55PikuZm9yRWFjaChyZWogPT4ge1xuICAgICAgICByZWooKTtcbiAgICAgIH0pO1xuICAgICAgbm1bJ2NsZWFyQWxsJ10oKTtcbiAgICAgIG1hbmFnZXJzLmZvckVhY2gobWFuYWdlciA9PiBtYW5hZ2VyLmNsZWFudXAoKSk7XG4gICAgfTtcbiAgICByZW5kZXJEYXRhQ2xpZW50LmFsbFNldHRsZWQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gbm0uYWxsU2V0dGxlZCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IFN0YXRlPHVua25vd24+ID0gbW9ja0luaXRpYWxTdGF0ZShpbml0aWFsRml4dHVyZXMpO1xuXG4gICAgY29uc3QgUHJvdmlkZXJXaXRoUmVzb2x2ZXI6IFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PiA9IG1lbW8oXG4gICAgICBmdW5jdGlvbiBQcm92aWRlcldpdGhSZXNvbHZlcih7IGNoaWxkcmVuIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFByb3ZpZGVyXG4gICAgICAgICAgICBpbml0aWFsU3RhdGU9e2luaXRpYWxTdGF0ZX1cbiAgICAgICAgICAgIENvbnRyb2xsZXI9e0FjdENvbnRyb2xsZXJ9XG4gICAgICAgICAgICBtYW5hZ2Vycz17bWFuYWdlcnN9XG4gICAgICAgICAgICBkZXZCdXR0b249e251bGx9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgIDwvUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBXcmFwcGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+PiB8IHVuZGVmaW5lZCA9XG4gICAgICBvcHRpb25zPy53cmFwcGVyO1xuICAgIGNvbnN0IFByb3ZpZGVyV2l0aFdyYXBwZXIgPVxuICAgICAgV3JhcHBlciA/XG4gICAgICAgIGZ1bmN0aW9uIFByb3ZpZGVyV3JhcHBlZChwcm9wczogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4pIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFByb3ZpZGVyV2l0aFJlc29sdmVyPlxuICAgICAgICAgICAgICA8V3JhcHBlciB7Li4ucHJvcHN9IC8+XG4gICAgICAgICAgICA8L1Byb3ZpZGVyV2l0aFJlc29sdmVyPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIDogUHJvdmlkZXJXaXRoUmVzb2x2ZXI7XG5cbiAgICBjb25zdCB3cmFwcGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPGFueT4gPSAoe1xuICAgICAgY2hpbGRyZW4sXG4gICAgICAuLi5wcm9wc1xuICAgIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+KSA9PiAoXG4gICAgICA8UHJvdmlkZXJXaXRoV3JhcHBlciB7Li4uKHByb3BzIGFzIGFueSl9PlxuICAgICAgICA8U3VzcGVuc2UgZmFsbGJhY2s9e251bGx9PntjaGlsZHJlbn08L1N1c3BlbnNlPlxuICAgICAgPC9Qcm92aWRlcldpdGhXcmFwcGVyPlxuICAgICk7XG5cbiAgICBjb25zdCByZXQ6IGFueSA9IHJlbmRlckhvb2soY2FsbGJhY2ssIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB3cmFwcGVyLFxuICAgIH0pO1xuICAgIHJldC5jb250cm9sbGVyID0gbm1bJ2NvbnRyb2xsZXInXTtcbiAgICByZXR1cm4gcmV0O1xuICB9KSBhcyBhbnk7XG4gIHJlbmRlckRhdGFDbGllbnQuY2xlYW51cCA9ICgpID0+IHt9O1xuICByZW5kZXJEYXRhQ2xpZW50LmFsbFNldHRsZWQgPSAoKSA9PiBQcm9taXNlLmFsbFNldHRsZWQoW10pO1xuICByZXR1cm4gcmVuZGVyRGF0YUNsaWVudDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBtYW5hZ2VyczogTWFuYWdlcltdO1xuICBpbml0aWFsU3RhdGU6IFN0YXRlPHVua25vd24+O1xuICBDb250cm9sbGVyOiB0eXBlb2YgQ29udHJvbGxlcjxhbnk+O1xuICBkZXZCdXR0b246IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgUmVuZGVyRGF0YUhvb2sgPSAoPFAsIFI+KFxuICBjYWxsYmFjazogKHByb3BzOiBQKSA9PiBSLFxuICBvcHRpb25zPzoge1xuICAgIGluaXRpYWxQcm9wcz86IFA7XG4gICAgaW5pdGlhbEZpeHR1cmVzPzogcmVhZG9ubHkgRml4dHVyZVtdO1xuICAgIHJlYWRvbmx5IHJlc29sdmVyRml4dHVyZXM/OiByZWFkb25seSAoRml4dHVyZSB8IEludGVyY2VwdG9yKVtdO1xuICAgIHdyYXBwZXI/OiBSZWFjdC5Db21wb25lbnRUeXBlPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+PjtcbiAgfSAmIE9taXQ8UmVuZGVySG9va09wdGlvbnM8UD4sICdpbml0aWFsUHJvcHMnIHwgJ3dyYXBwZXInPixcbikgPT4gUmVuZGVySG9va1Jlc3VsdDxSLCBQPiAmIHtcbiAgY29udHJvbGxlcjogQ29udHJvbGxlcjtcbn0pICYge1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICBhbGxTZXR0bGVkOiAoKSA9PiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W10+IHwgdW5kZWZpbmVkO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLFNBR0VBLG1CQUFtQixFQUNuQkMsY0FBYyxFQUNkQyxtQkFBbUIsRUFDbkJDLFVBQVUsUUFHTCxvQkFBb0I7QUFDM0IsT0FBT0MsS0FBSyxJQUFJQyxJQUFJLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBRTdDLFNBQ0VDLFVBQVUsRUFDVkMsR0FBRyxRQUdFLGtCQUFrQjtBQUV6QixTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELE9BQU9DLGdCQUFnQixNQUFNLGlCQUFpQjtBQUFDLFNBQUFDLEdBQUEsSUFBQUMsSUFBQTtBQUcvQztBQUNBLGVBQWUsU0FBU0Msa0JBQWtCQSxDQUN4Q0MsUUFBZ0Qs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