@snipsonian/observable-state
Version:
Observable-state snippets (redux-like)
86 lines (85 loc) • 3.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveAllPromises = void 0;
const immer_1 = require("immer");
const isArrayWithValues_1 = require("@snipsonian/core/cjs/array/verification/isArrayWithValues");
const cloneObjectDataProps_1 = require("@snipsonian/core/cjs/object/cloneObjectDataProps");
const getRequestWrapper_1 = require("@snipsonian/axios/cjs/request/getRequestWrapper");
const mockRestServer_1 = require("@snipsonian/axios/cjs/testing/mockRestServer");
function getActionableStoreIntegrationTester({ store, defaultRestHandlerMocks = [], initialState, defaultBaseApiUrl, }) {
const initialStateWhenResetting = (0, cloneObjectDataProps_1.default)(initialState);
let restServerMock = null;
const tester = {
given({ restHandlerMocks = [], keepState = false }, callback) {
restServerMock = (0, mockRestServer_1.getRestServerMock)()
|| (0, mockRestServer_1.setupRestServerMock)(defaultRestHandlerMocks, { defaultBaseApiUrl });
if ((0, isArrayWithValues_1.default)(restHandlerMocks)) {
restServerMock.addRuntimeHandlers(...restHandlerMocks);
}
if (!keepState) {
store.setState({
newState: initialStateWhenResetting,
});
}
if (callback) {
callback({
setupActions,
setupState,
getState,
});
}
},
async when(actionOrToBeExecuted) {
try {
let promise = null;
if (typeof actionOrToBeExecuted === 'function') {
promise = actionOrToBeExecuted();
}
else {
store.dispatch(actionOrToBeExecuted);
promise = Promise.resolve(null);
}
await resolveAllPromisesUntilNoMoreRunningApiCalls();
return promise;
}
finally {
restServerMock.removeRuntimeHandlers();
}
},
then(callback) {
if (callback) {
callback({
getState,
});
}
},
};
return tester;
function setupActions(...actionsToSetup) {
actionsToSetup.forEach((actionToSetup) => store.dispatch(actionToSetup));
}
function setupState(stateUpdater) {
store.setState({
newState: (0, immer_1.default)(getState(), stateUpdater),
});
}
function getState() {
return store.getState();
}
}
exports.default = getActionableStoreIntegrationTester;
function resolveAllPromises() {
return new Promise((resolve) => {
setTimeout(resolve, 0);
});
}
exports.resolveAllPromises = resolveAllPromises;
function resolveAllPromisesUntilNoMoreRunningApiCalls() {
return resolveAllPromises()
.then(() => {
if ((0, getRequestWrapper_1.getNrOfRunningApiCalls)() > 0) {
return resolveAllPromisesUntilNoMoreRunningApiCalls();
}
return null;
});
}