twreporter-react
Version:
React-Redux site for The Reporter Foundation in Taiwan
336 lines (259 loc) • 10.4 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 }; }
var _ = require('../');
var _constants = require('../constants');
var _redux = require('redux');
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactRouter = require('react-router');
var _historyLibCreateMemoryHistory = require('history/lib/createMemoryHistory');
var _historyLibCreateMemoryHistory2 = _interopRequireDefault(_historyLibCreateMemoryHistory);
var _historyLibUseBasename = require('history/lib/useBasename');
var _historyLibUseBasename2 = _interopRequireDefault(_historyLibUseBasename);
var _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
var routes = _react2['default'].createElement(
_reactRouter.Route,
{ path: '/' },
_react2['default'].createElement(
_reactRouter.Route,
{ path: 'parent' },
_react2['default'].createElement(_reactRouter.Route, { path: 'child/:id' })
)
);
describe('reduxRouter()', function () {
it('adds router state to Redux store', function () {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var history = _historyLibCreateMemoryHistory2['default']();
var store = _.reduxReactRouter({
history: history,
routes: routes
})(_redux.createStore)(reducer);
var historySpy = _sinon2['default'].spy();
history.listen(function () {
return historySpy();
});
expect(historySpy.callCount).to.equal(1);
history.pushState(null, '/parent');
expect(store.getState().router.location.pathname).to.equal('/parent');
expect(historySpy.callCount).to.equal(2);
history.pushState(null, '/parent/child/123?key=value');
expect(historySpy.callCount).to.equal(3);
expect(store.getState().router.location.pathname).to.equal('/parent/child/123');
expect(store.getState().router.location.query).to.eql({ key: 'value' });
expect(store.getState().router.params).to.eql({ id: '123' });
});
it('detects external router state changes', function () {
var baseReducer = _redux.combineReducers({
router: _.routerStateReducer
});
var EXTERNAL_STATE_CHANGE = 'EXTERNAL_STATE_CHANGE';
var externalState = {
location: {
pathname: '/parent/child/123',
query: { key: 'value' },
key: 'lolkey'
}
};
var reducerSpy = _sinon2['default'].spy();
function reducer(state, action) {
reducerSpy();
if (action.type === EXTERNAL_STATE_CHANGE) {
return _extends({}, state, { router: action.payload });
}
return baseReducer(state, action);
}
var history = _historyLibCreateMemoryHistory2['default']();
var historySpy = _sinon2['default'].spy();
var historyState = undefined;
history.listen(function (s) {
historySpy();
historyState = s;
});
var store = _.reduxReactRouter({
history: history,
routes: routes
})(_redux.createStore)(reducer);
expect(reducerSpy.callCount).to.equal(2);
expect(historySpy.callCount).to.equal(1);
store.dispatch({
type: EXTERNAL_STATE_CHANGE,
payload: externalState
});
expect(reducerSpy.callCount).to.equal(4);
expect(historySpy.callCount).to.equal(2);
expect(historyState.pathname).to.equal('/parent/child/123');
expect(historyState.search).to.equal('?key=value');
});
it('works with navigation action creators', function () {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var store = _.reduxReactRouter({
createHistory: _historyLibCreateMemoryHistory2['default'],
routes: routes
})(_redux.createStore)(reducer);
store.dispatch(_.pushState(null, '/parent/child/123', { key: 'value' }));
expect(store.getState().router.location.pathname).to.equal('/parent/child/123');
expect(store.getState().router.location.query).to.eql({ key: 'value' });
expect(store.getState().router.params).to.eql({ id: '123' });
store.dispatch(_.replaceState(null, '/parent/child/321', { key: 'value2' }));
expect(store.getState().router.location.pathname).to.equal('/parent/child/321');
expect(store.getState().router.location.query).to.eql({ key: 'value2' });
expect(store.getState().router.params).to.eql({ id: '321' });
});
it('doesn\'t interfere with other actions', function () {
var APPEND_STRING = 'APPEND_STRING';
function stringBuilderReducer(state, action) {
if (state === undefined) state = '';
if (action.type === APPEND_STRING) {
return state + action.string;
}
return state;
}
var reducer = _redux.combineReducers({
router: _.routerStateReducer,
string: stringBuilderReducer
});
var history = _historyLibCreateMemoryHistory2['default']();
var store = _.reduxReactRouter({
history: history,
routes: routes
})(_redux.createStore)(reducer);
store.dispatch({ type: APPEND_STRING, string: 'Uni' });
store.dispatch({ type: APPEND_STRING, string: 'directional' });
expect(store.getState().string).to.equal('Unidirectional');
});
it('stores the latest state in routerState', function () {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var history = _historyLibCreateMemoryHistory2['default']();
var store = _.reduxReactRouter({
history: history,
routes: routes
})(_redux.createStore)(reducer);
var historyState = undefined;
history.listen(function (s) {
historyState = s;
});
history.pushState(null, '/parent');
store.dispatch({
type: _constants.REPLACE_ROUTES
});
historyState = null;
store.dispatch({ type: 'RANDOM_ACTION' });
expect(historyState).to.equal(null);
});
it('handles async middleware', function (done) {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var history = _historyLibCreateMemoryHistory2['default']();
var historySpy = _sinon2['default'].spy();
history.listen(function () {
return historySpy();
});
expect(historySpy.callCount).to.equal(1);
_redux.compose(_.reduxReactRouter({
history: history,
routes: routes
}), _redux.applyMiddleware(function () {
return function (next) {
return function (action) {
return setTimeout(function () {
return next(action);
}, 0);
};
};
}))(_redux.createStore)(reducer);
history.pushState(null, '/parent');
expect(historySpy.callCount).to.equal(2);
setTimeout(function () {
expect(historySpy.callCount).to.equal(2);
done();
}, 0);
});
it('accepts history object when using basename', function () {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var history = _historyLibUseBasename2['default'](_historyLibCreateMemoryHistory2['default'])({
basename: '/grandparent'
});
var store = _.reduxReactRouter({
history: history,
routes: routes
})(_redux.createStore)(reducer);
history.pushState(null, '/parent');
expect(store.getState().router.location.pathname).to.eql('/parent');
history.pushState(null, '/parent/child/123?key=value');
expect(store.getState().router.location.pathname).to.eql('/parent/child/123');
expect(store.getState().router.location.basename).to.eql('/grandparent');
expect(store.getState().router.location.query).to.eql({ key: 'value' });
expect(store.getState().router.params).to.eql({ id: '123' });
});
describe('getRoutes()', function () {
it('is passed dispatch and getState', function () {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var store = undefined;
var history = _historyLibCreateMemoryHistory2['default']();
_.reduxReactRouter({
history: history,
getRoutes: function getRoutes(s) {
store = s;
return routes;
}
})(_redux.createStore)(reducer);
store.dispatch(_.pushState(null, '/parent/child/123', { key: 'value' }));
expect(store.getState().router.location.pathname).to.equal('/parent/child/123');
});
});
describe('onEnter hook', function () {
it('can perform redirects', function () {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var history = _historyLibCreateMemoryHistory2['default']();
var requireAuth = function requireAuth(nextState, _replaceState) {
_replaceState(null, '/login');
};
var store = _.reduxReactRouter({
history: history,
routes: _react2['default'].createElement(
_reactRouter.Route,
{ path: '/' },
_react2['default'].createElement(
_reactRouter.Route,
{ path: 'parent' },
_react2['default'].createElement(_reactRouter.Route, { path: 'child/:id', onEnter: requireAuth })
),
_react2['default'].createElement(_reactRouter.Route, { path: 'login' })
)
})(_redux.createStore)(reducer);
store.dispatch(_.pushState(null, '/parent/child/123', { key: 'value' }));
expect(store.getState().router.location.pathname).to.equal('/login');
});
describe('isActive', function () {
it('creates a selector for whether a pathname/query pair is active', function () {
var reducer = _redux.combineReducers({
router: _.routerStateReducer
});
var history = _historyLibCreateMemoryHistory2['default']();
var store = _.reduxReactRouter({
history: history,
routes: routes
})(_redux.createStore)(reducer);
var activeSelector = _.isActive('/parent', { key: 'value' });
expect(activeSelector(store.getState().router)).to.be['false'];
history.pushState(null, '/parent?key=value');
expect(activeSelector(store.getState().router)).to.be['true'];
});
});
});
});