redux-batched-updates
Version:
Batch React updates that occur as a result of Redux dispatches.
98 lines (73 loc) • 3.27 kB
JavaScript
;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
var _ = require('../');
var _reduxReact = require('redux/react');
var _redux = require('redux');
var _reactAddons = require('react/addons');
var _reactAddons2 = _interopRequireDefault(_reactAddons);
var _jsdom = require('./jsdom');
var _jsdom2 = _interopRequireDefault(_jsdom);
var _sinon = require('sinon');
var TestUtils = _reactAddons2['default'].addons.TestUtils;
var actionCreators = {
addTodo: function addTodo(text) {
return { type: 'ADD_TODO', payload: text };
}
};
function todoReducer(state, action) {
if (state === undefined) state = { todos: [] };
return action.type === 'ADD_TODO' ? _extends({}, state, { todos: [].concat(state.todos, [action.payload]) }) : state;
}
function testBatchedUpdates(createStore) {
var store = createStore({ todos: todoReducer });
var renderSpy = _sinon.spy();
var tree = TestUtils.renderIntoDocument(_reactAddons2['default'].createElement(
_reduxReact.Provider,
{ redux: store },
function () {
return _reactAddons2['default'].createElement(
_reduxReact.Connector,
{ select: function () {
return { f: function f() {} };
} },
function () {
return _reactAddons2['default'].createElement(
_reduxReact.Connector,
{ select: function (_ref) {
var todos = _ref.todos;
return _extends({}, todos, { f: function f() {} });
} },
function (_ref2) {
var dispatch = _ref2.dispatch;
var props = _objectWithoutProperties(_ref2, ['dispatch']);
renderSpy();
var _bindActionCreators = _redux.bindActionCreators(actionCreators, dispatch);
var addTodo = _bindActionCreators.addTodo;
return _reactAddons2['default'].createElement('div', _extends({}, props, { addTodo: addTodo }));
}
);
}
);
}
));
var div = TestUtils.findRenderedDOMComponentWithTag(tree, 'div');
expect(renderSpy.callCount).to.equal(1);
expect(div.props.todos).to.deep.equal([]);
div.props.addTodo('Use Redux');
expect(renderSpy.callCount).to.equal(2);
expect(div.props.todos).to.deep.equal(['Use Redux']);
div.props.addTodo('Use RxJS');
expect(renderSpy.callCount).to.equal(3);
expect(div.props.todos).to.deep.equal(['Use Redux', 'Use RxJS']);
}
describe('batchedUpdates()', function () {
_jsdom2['default']();
it('prevents extra renders after dispatches', function () {
expect(function () {
return testBatchedUpdates(_redux.createRedux);
}).to['throw']();
testBatchedUpdates(_.batchedUpdates(_redux.createRedux));
});
});