UNPKG

@snipsonian/observable-state

Version:

Observable-state snippets (redux-like)

81 lines (80 loc) 2.87 kB
import produce from 'immer'; import isArrayWithValues from '@snipsonian/core/es/array/verification/isArrayWithValues'; import cloneObjectDataProps from '@snipsonian/core/es/object/cloneObjectDataProps'; import { getNrOfRunningApiCalls } from '@snipsonian/axios/es/request/getRequestWrapper'; import { getRestServerMock, setupRestServerMock, } from '@snipsonian/axios/es/testing/mockRestServer'; export default function getActionableStoreIntegrationTester({ store, defaultRestHandlerMocks = [], initialState, defaultBaseApiUrl, }) { const initialStateWhenResetting = cloneObjectDataProps(initialState); let restServerMock = null; const tester = { given({ restHandlerMocks = [], keepState = false }, callback) { restServerMock = getRestServerMock() || setupRestServerMock(defaultRestHandlerMocks, { defaultBaseApiUrl }); if (isArrayWithValues(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: produce(getState(), stateUpdater), }); } function getState() { return store.getState(); } } export function resolveAllPromises() { return new Promise((resolve) => { setTimeout(resolve, 0); }); } function resolveAllPromisesUntilNoMoreRunningApiCalls() { return resolveAllPromises() .then(() => { if (getNrOfRunningApiCalls() > 0) { return resolveAllPromisesUntilNoMoreRunningApiCalls(); } return null; }); }