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
93 lines (68 loc) • 4.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
exports['default'] = selectVariation;
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _randomVariation = require('./random-variation');
var _randomVariation2 = _interopRequireDefault(_randomVariation);
var _createCacheStore = require('./create-cache-store');
var _createCacheStore2 = _interopRequireDefault(_createCacheStore);
var _getKey = require('./get-key');
var _getKey2 = _interopRequireDefault(_getKey);
var _logger = require('./logger');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
/**
* Select a variation for the experiment
*/
function selectVariation(props) {
var active = props.active,
experiment = props.experiment,
defaultVariationName = props.defaultVariationName,
cacheStore = props.cacheStore;
var cache = cacheStore === undefined || cacheStore === null ? (0, _createCacheStore2['default'])() : cacheStore;
var experimentKey = (0, _getKey2['default'])(experiment);
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', experimentKey=\'' + experimentKey + '\'');
// Hash of variation.name => VariationType
var variationsMap = experiment.get('variations').reduce(function (hash, variation) {
hash[(0, _getKey2['default'])(variation)] = variation;
return hash;
}, {});
// Match against the redux state
var variationKey = active.get(experimentKey);
if (variationKey && variationsMap[variationKey]) {
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\'');
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationsMap[variationKey]=\'' + (0, _stringify2['default'])(variationsMap[variationKey]) + '\'');
return variationsMap[variationKey];
}
// Match against the instance state.
// This is used as a in-memory cache to prevent multiple instances of the same experiment from getting differient variations.
// It is wiped out with each pass of the RESET/LOAD/PLAY cycle
variationKey = cache.getItem(experimentKey);
if (variationKey && variationsMap[variationKey]) {
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\'');
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationsMap[variationKey]=\'' + (0, _stringify2['default'])(variationsMap[variationKey]) + '\'');
return variationsMap[variationKey];
}
// Match against the defaultVariationName
variationKey = defaultVariationName;
if (variationKey && variationsMap[variationKey]) {
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\'');
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationsMap[variationKey]=\'' + (0, _stringify2['default'])(variationsMap[variationKey]) + '\'');
cache.setItem(experimentKey, variationKey);
return variationsMap[variationKey];
}
// Pick a variation ramdomly
var variation = (0, _randomVariation2['default'])(experiment);
// Record the choice in the tmp cache
variationKey = (0, _getKey2['default'])(variation);
cache.setItem(experimentKey, variationKey);
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\'');
(0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variation.name=\'' + (variation && variation.get('name')) + '\'');
// Return the chosen variation
return variation;
}
module.exports = exports['default'];