UNPKG

redux-batched-updates

Version:

Batch React updates that occur as a result of Redux dispatches.

98 lines (73 loc) 3.27 kB
'use strict'; 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)); }); });