import React from 'react' import ReactDOM from 'react-dom' import T from 'react-dom/test-utils' import {Connector, IStateSelector} from '../redux' import {Provider} from 'react-redux' import {createStore} from '../store' import { Action, AnyAction, DeepPartial, Reducer, ReducersMapObject, combineReducers, } from 'redux' interface IRenderParams { reducers: ReducersMapObject state?: DeepPartial connector: Connector select: IStateSelector } export class TestUtils { /** * Create a redux store */ readonly createStore = createStore render(jsx: JSX.Element) { const component = T.renderIntoDocument(jsx) as React.Component const node = ReactDOM.findDOMNode(component) as Element return {component, node} } combineReducers(reducers: ReducersMapObject): Reducer combineReducers( reducers: ReducersMapObject, ): Reducer { return combineReducers(reducers) } /** * Creates a redux store, connects a component, and provides the `render` * method to render the connected component with a `Provider`. */ withProvider = AnyAction>( params: IRenderParams, ) { const store = this.createStore({ reducers: params.reducers, state: params.state, }) const Component = params.connector.connect(params.select) const render = (additionalProps: {[key: string]: any} = {}) => { return this.render( , ) } return { render, store, Component, } } }