import React, { Component } from 'react';
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import { reducer as formReducer } from 'redux-form';
import TranslationProvider from '../i18n/TranslationProvider';
import merge from 'lodash/merge';
import { createMemoryHistory } from 'history';
import createAdminStore from '../createAdminStore';
export const defaultStore = {
admin: {
resources: {},
references: { possibleValues: {} },
ui: { viewVersion: 1 },
},
form: formReducer({}, { type: '@@FOO' }), // Call the reducer with an unknown type to initialize it
i18n: { locale: 'en', messages: {} },
};
interface Props {
store?: object;
enableReducers?: boolean;
}
/**
* Simulate a react-admin context in unit tests
*
* Pass custom store values as store prop
*
* @example
* // in an enzyme test
* const wrapper = render(
*
*
*
* );
*
* @example
* // in an enzyme test, using jest.
* const wrapper = render(
*
* {({ store }) => {
* dispatchSpy = jest.spyOn(store, 'dispatch');
* return
* }}
*
* );
*/
class TestContext extends Component {
storeWithDefault = null;
constructor(props) {
super(props);
const { store = {}, enableReducers = false } = props;
this.storeWithDefault = enableReducers
? createAdminStore({
initialState: merge(defaultStore, store),
dataProvider: () => Promise.resolve({}),
history: createMemoryHistory(),
})
: createStore(() => merge(defaultStore, store));
}
renderChildren = () => {
const { children } = this.props;
return typeof children === 'function'
? children({ store: this.storeWithDefault })
: children;
};
render() {
return (
{this.renderChildren()}
);
}
}
export default TestContext;