UNPKG

@snipsonian/observable-state

Version:

Observable-state snippets (redux-like)

86 lines (85 loc) 3.18 kB
"use strict"; 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; }); }