@snipsonian/observable-state
Version:
Observable-state snippets (redux-like)
81 lines (80 loc) • 2.87 kB
JavaScript
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;
});
}