redux-ab-test
Version:
A/B testing React components with Redux and debug tools. Isomorphic with a simple, universal interface. Well documented and lightweight. Tested in popular browsers and Node.js. Includes helpers for React, Redux, and Segment.io
265 lines (228 loc) • 9.19 kB
JavaScript
'use strict';
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactTestRenderer = require('react-test-renderer');
var _reactTestRenderer2 = _interopRequireDefault(_reactTestRenderer);
var _reactRedux = require('react-redux');
var _redux = require('redux');
var _sinon = require('sinon');
var _experiment = require('./experiment');
var _variation = require('../variation');
var _variation2 = _interopRequireDefault(_variation);
var _module = require('../../module');
var _module2 = _interopRequireDefault(_module);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var reduxAbTestState = _module.initialState.merge({
experiments: [{
name: 'Test-experimentName',
variations: [{ name: 'Original', weight: 10000 }, { name: 'Variation B', weight: 0 }]
}],
'availableExperiments': {
'Test-experimentName': 'Test-experimentName'
},
'active': { 'Test-experimentName': 'Variation B' }
}); // eslint-disable-line no-unused-vars
describe('(Component) src/components/experiment/experiment.js', function () {
var component = void 0;
var tree = void 0;
var props = void 0;
var dispatchActivate = void 0;
var dispatchDeactivate = void 0;
var dispatchPlay = void 0;
var dispatchWin = void 0;
beforeEach(function () {
dispatchActivate = (0, _sinon.spy)();
dispatchDeactivate = (0, _sinon.spy)();
dispatchPlay = (0, _sinon.spy)();
dispatchWin = (0, _sinon.spy)();
props = {
reduxAbTest: reduxAbTestState,
name: 'Test-experimentName',
children: [_react2['default'].createElement(
_variation2['default'],
{ name: 'Original' },
'Test Original'
), _react2['default'].createElement(
_variation2['default'],
{ name: 'Variation B' },
'Test Variation B'
)],
experiment: reduxAbTestState.getIn(['experiments', 0]),
variation: reduxAbTestState.getIn(['experiments', 0, 'variations', 1]),
dispatchActivate: dispatchActivate,
dispatchDeactivate: dispatchDeactivate,
dispatchPlay: dispatchPlay,
dispatchWin: dispatchWin
};
component = _reactTestRenderer2['default'].create(_react2['default'].createElement(
_reactRedux.Provider,
{ store: (0, _redux.createStore)(_module2['default'], { reduxAbTest: reduxAbTestState }) },
_react2['default'].createElement(_experiment.Experiment, props)
));
tree = component.toJSON();
});
it('exists', function () {
expect(component).not.toBeUndefined;
});
it('has 1x rendered Experiment', function () {
expect(tree).toMatchSnapshot();
expect(tree.type).toEqual('span');
expect(tree.children).toEqual(['Test Variation B']);
});
it('has 1x rendered variation', function () {
expect(tree).toMatchSnapshot();
expect(tree.type).toEqual('span');
expect(tree.props['data-experiment-id']).toBeUndefined;
expect(tree.props['data-experiment-name']).toEqual('Test-experimentName');
expect(tree.props['data-variation-id']).toBeUndefined;
expect(tree.props['data-variation-name']).toEqual('Variation B');
expect(tree.children).toEqual(['Test Variation B']);
});
it('wraps the text children in a Variation', function () {
props['children'] = 'Testing a single child';
component = _reactTestRenderer2['default'].create(_react2['default'].createElement(
_reactRedux.Provider,
{ store: (0, _redux.createStore)(_module2['default'], { reduxAbTest: reduxAbTestState }) },
_react2['default'].createElement(_experiment.Experiment, props)
));
tree = component.toJSON();
expect(tree).toMatchSnapshot();
expect(tree.type).toEqual('span');
expect(tree.props['data-experiment-id']).toBeUndefined;
expect(tree.props['data-experiment-name']).toEqual('Test-experimentName');
expect(tree.props['data-variation-id']).toBeUndefined;
expect(tree.props['data-variation-name']).toEqual('Variation B');
expect(tree.children).toEqual(['Testing a single child']);
});
it('wraps the component children in a Variation', function () {
props['children'] = _react2['default'].createElement(
'div',
null,
'Testing a single child'
);
component = _reactTestRenderer2['default'].create(_react2['default'].createElement(
_reactRedux.Provider,
{ store: (0, _redux.createStore)(_module2['default'], { reduxAbTest: reduxAbTestState }) },
_react2['default'].createElement(_experiment.Experiment, props)
));
tree = component.toJSON();
expect(tree).toMatchSnapshot();
expect(component).not.toBeUndefined;
expect(tree.type).toEqual('div');
expect(tree.props['data-experiment-id']).toBeUndefined;
expect(tree.props['data-experiment-name']).toEqual('Test-experimentName');
expect(tree.props['data-variation-id']).toBeUndefined;
expect(tree.props['data-variation-name']).toEqual('Variation B');
expect(tree.children).toEqual(['Testing a single child']);
});
it('renders null on blank children', function () {
props['children'] = [];
component = _reactTestRenderer2['default'].create(_react2['default'].createElement(
_reactRedux.Provider,
{ store: (0, _redux.createStore)(_module2['default'], { reduxAbTest: reduxAbTestState }) },
_react2['default'].createElement(_experiment.Experiment, props)
));
tree = component.toJSON();
expect(tree).toMatchSnapshot();
expect(component).not.toBeUndefined;
expect(tree).toBeNull;
});
it('creates Ad-hoc experiments');
it('should update on componentWillReceiveProps');
describe.skip('find by :id', function () {
var reduxAbTestState = _module.initialState.merge({
experiments: [{
id: 'Test-id',
name: 'Test-experimentName',
variations: [{ name: 'Original', weight: 10000 }, { name: 'Variation B', weight: 0 }]
}],
'availableExperiments': { 'Test-id': 'Test-id' },
'active': { 'Test-id': 'Variation B' }
});
beforeEach(function () {
props = {
reduxAbTest: reduxAbTestState,
id: 'Test-id',
children: [_react2['default'].createElement(
_variation2['default'],
{ name: 'Original' },
'Test Original'
), _react2['default'].createElement(
_variation2['default'],
{ name: 'Variation B' },
'Test Variation B'
)],
dispatchActivate: dispatchActivate,
dispatchDeactivate: dispatchDeactivate,
dispatchPlay: dispatchPlay,
dispatchWin: dispatchWin
};
component = _reactTestRenderer2['default'].create(_react2['default'].createElement(
_reactRedux.Provider,
{ store: (0, _redux.createStore)(_module2['default'], { reduxAbTest: reduxAbTestState }) },
_react2['default'].createElement(_experiment.Experiment, props)
));
tree = component.toJSON();
});
it('exists', function () {
expect(component).not.toBeUndefined;
expect(component.html()).to.be.present;
});
it('has 1x rendered Experiment', function () {
expect(component.find(_experiment.Experiment)).to.have.length(1);
expect(tree.type).toEqual('span');
expect(tree.children).toEqual('Test Variation B');
});
});
describe.skip('find by :selector', function () {
var reduxAbTestState = _module.initialState.merge({
experiments: [{
id: 'Test-id',
name: 'Test-experimentName',
component: {
key: 'Example component key selector'
},
variations: [{ name: 'Original', weight: 10000 }, { name: 'Variation B', weight: 0 }]
}],
availableExperiments: {
'Example component key selector': 'Test-id'
},
active: { 'Test-id': 'Variation B' },
key_path: ['component', 'key']
});
beforeEach(function () {
props = {
reduxAbTest: reduxAbTestState,
selector: 'Example component key selector',
children: [_react2['default'].createElement(
_variation2['default'],
{ name: 'Original' },
'Test Original'
), _react2['default'].createElement(
_variation2['default'],
{ name: 'Variation B' },
'Test Variation B'
)],
dispatchActivate: dispatchActivate,
dispatchDeactivate: dispatchDeactivate,
dispatchPlay: dispatchPlay,
dispatchWin: dispatchWin
};
component = _reactTestRenderer2['default'].create(_react2['default'].createElement(
_reactRedux.Provider,
{ store: (0, _redux.createStore)(_module2['default'], { reduxAbTest: reduxAbTestState }) },
_react2['default'].createElement(_experiment.Experiment, props)
));
tree = component.toJSON();
});
it('exists', function () {
expect(component).not.toBeUndefined;
expect(component.html()).to.be.present;
});
it('has 1x rendered Experiment', function () {
expect(component.find(_experiment.Experiment)).to.have.length(1);
expect(tree.type).toEqual('span');
expect(tree.children).toEqual('Test Variation B');
});
});
});