/**
* Test injectors
*/
import * as React from 'react';
import { put } from 'redux-saga/effects';
import { shallow } from 'enzyme';
import configureStore from '../../configureStore';
import { createMemoryHistory } from 'history';
import { DAEMON } from '../constants';
const memoryHistory = createMemoryHistory();
// Fixtures
const Component = () => null;
function* testSaga() {
yield put({ type: 'TEST', payload: 'yup' });
}
describe('injectSaga decorator', () => {
let store;
let injectors;
let ComponentWithSaga;
let injectSaga;
beforeAll(() => {
jest.mock('../sagaInjectors', () => ({
__esModule: true,
default: jest.fn().mockImplementation(() => injectors),
}));
injectSaga = require('../injectSaga').default;
});
beforeEach(() => {
store = configureStore({}, memoryHistory);
injectors = {
injectSaga: jest.fn(),
ejectSaga: jest.fn(),
};
ComponentWithSaga = injectSaga({
key: 'test',
saga: testSaga,
mode: DAEMON,
})(Component);
jest.unmock('../sagaInjectors');
});
it('should inject given saga, mode, and props', () => {
const props = { test: 'test' };
shallow(, { context: { store: store } });
expect(injectors.injectSaga).toHaveBeenCalledTimes(1);
expect(injectors.injectSaga).toHaveBeenCalledWith(
'test',
{ saga: testSaga, mode: DAEMON },
props,
);
});
it('should eject on unmount with a correct saga key', () => {
const props = { test: 'test' };
const renderedComponent = shallow(, {
context: { store: store },
});
renderedComponent.unmount();
expect(injectors.ejectSaga).toHaveBeenCalledTimes(1);
expect(injectors.ejectSaga).toHaveBeenCalledWith('test');
});
it('should set a correct display name', () => {
expect(ComponentWithSaga.displayName).toBe('withSaga(Component)');
expect(
injectSaga({ key: 'test', saga: testSaga })(() => null).displayName,
).toBe('withSaga(Component)');
});
it('should propagate props', () => {
const props = { testProp: 'test' };
const renderedComponent = shallow(, {
context: { store: store },
});
expect(renderedComponent.prop('testProp')).toBe('test');
});
});