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
456 lines (395 loc) • 32 kB
JavaScript
'use strict';
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _module = require('../module');
var _availableExperiments = require('./available-experiments');
var _availableExperiments2 = _interopRequireDefault(_availableExperiments);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
describe('utils/available-experiments.js', function () {
describe('matchesField', function () {
it('exists', function () {
expect(_availableExperiments.matchesField).not.toBeUndefined;
expect(typeof _availableExperiments.matchesField === 'undefined' ? 'undefined' : (0, _typeof3['default'])(_availableExperiments.matchesField)).toEqual('function');
});
it('has the correct output for ===', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '===', 10)).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '===', 0)).toBeFalsy;
});
it('has the correct output for >=', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '>=', 10)).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '>=', 11)).toBeFalsy;
});
it('has the correct output for >', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '>', 9)).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '>', 10)).toBeFalsy;
});
it('has the correct output for <=', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '<=', 10)).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '<=', 9)).toBeFalsy;
});
it('has the correct output for <', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '<', 11)).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', '<', 10)).toBeFalsy;
});
it('has the correct output for in', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', 'in', [9, 10, 11])).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', 'in', [0])).toBeFalsy;
});
it('has the correct output for not in', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', 'not in', [1])).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', 'not in', [10])).toBeFalsy;
});
it('has the correct output for not intersect', function () {
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: [1, 10, 20] }), 'orders', 'intersect', [10])).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: [10] }), 'orders', 'intersect', 10)).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: 10 }), 'orders', 'intersect', 10)).toBeTruthy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: [0, 15, 20] }), 'orders', 'intersect', [10])).toBeFalsy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: [] }), 'orders', 'intersect', [10])).toBeFalsy;
expect((0, _availableExperiments.matchesField)(_immutable2['default'].fromJS({ orders: [] }), 'orders', 'intersect', 10)).toBeFalsy;
});
});
describe('matchesRoute', function () {
var blankRoute = _module.initialState.get('route');
var homepageRoute = _module.initialState.get('route').merge({ pathName: '/', path: '/' });
var dynamicRoute = _module.initialState.get('route').merge({ pathName: '/posts/2', path: '/posts:id', params: { 'id': '2' } });
var utmsRoute = _module.initialState.get('route').merge({ pathName: '/magic', query: { 'utm_campaign': 'test-campaignName', 'utm_source': 'harry-potter' } });
it('exists', function () {
expect(_availableExperiments.matchesRoute).not.toBeUndefined;
expect(typeof _availableExperiments.matchesRoute === 'undefined' ? 'undefined' : (0, _typeof3['default'])(_availableExperiments.matchesRoute)).toEqual('function');
});
it('undefined matches any route', function () {
expect((0, _availableExperiments.matchesRoute)(blankRoute, undefined)).toBeTruthy;
});
it('null matches any route', function () {
expect((0, _availableExperiments.matchesRoute)(blankRoute, null)).toBeTruthy;
});
it('empty hash matches any route', function () {
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({}))).toBeTruthy;
});
it('exactly matches pathName', function () {
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: '/' }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'in': ['/'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'in': ['/', '/magic'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'in': ['/', '/404'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'not in': ['/404', '/magic'] } }))).toBeTruthy; // eslint-disable-line
});
it('doesnt match pathName', function () {
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: '/404' }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'in': ['/404'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'in': ['/404', '/magic'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'in': ['/404', '/404'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(homepageRoute, _immutable2['default'].fromJS({ pathName: { 'not in': ['/', '/help'] } }))).toBeFalsy; // eslint-disable-line
});
it('exactly matches path', function () {
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id' }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'in': ['/posts:id'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'in': ['/posts:id', '/magic'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'in': ['/posts:id', '/404'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'not in': ['/404', '/help'] } }))).toBeTruthy; // eslint-disable-line
});
it('doesnt match path', function () {
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/404' }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'in': ['/404'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'in': ['/404', '/magic'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'in': ['/404', '/help'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: { 'not in': ['/posts:id', '/help'] } }))).toBeFalsy; // eslint-disable-line
});
it('exactly matches path with params', function () {
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': '2' } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'in': ['2'] } } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'in': ['2', 'slug'] } } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'in': ['2', '3'] } } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'not in': ['404'] } } }))).toBeTruthy; // eslint-disable-line
});
it('doesnt match path with missing params', function () {
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'invalid-param': 'n/a' } }))).toBeFalsy; // eslint-disable-line
});
it('doesnt match path with params', function () {
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': '3' } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'in': ['3'] } } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'in': ['3', 'slug'] } } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'in': ['3', '15'] } } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(dynamicRoute, _immutable2['default'].fromJS({ path: '/posts:id', params: { 'id': { 'not in': ['2'] } } }))).toBeFalsy; // eslint-disable-line
});
it('exactly matches pathName with query', function () {
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'utm_campaign': 'test-campaignName' } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'utm_campaign': { 'in': ['test-campaignName'] } } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'utm_campaign': { 'in': ['test-campaignName', 'slug'] } } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'utm_campaign': { 'in': ['test-campaignName', '3'] } } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'utm_campaign': { 'not in': ['404'] } } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'id': { 'not in': ['2'] } } }))).toBeTruthy; // eslint-disable-line
});
it('doesnt match pathName with missing query', function () {
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'invalid-param': 'n/a' } }))).toBeFalsy; // eslint-disable-line
});
it('doesnt match pathName with query', function () {
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'id': '3' } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'id': { 'in': ['3'] } } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'id': { 'in': ['3', 'slug'] } } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'id': { 'in': ['3', '15'] } } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesRoute)(utmsRoute, _immutable2['default'].fromJS({ pathName: '/magic', query: { 'utm_campaign': { 'not in': ['test-campaignName'] } } }))).toBeFalsy; // eslint-disable-line
});
});
describe('matchesAudience', function () {
var blankAudience = _immutable2['default'].fromJS({});
var vipAudience = _immutable2['default'].fromJS({ type: 'vip' });
var stateAudience = _immutable2['default'].fromJS({ type: 'vip', state: 'NY' });
var ordersAudience = _immutable2['default'].fromJS({ type: 'vip', orders: 10 });
var specialAudience = _immutable2['default'].fromJS({ type: 'vip', orders: 10, state: 'CA' });
it('exists', function () {
expect(_availableExperiments.matchesAudience).not.toBeUndefined;
expect(typeof _availableExperiments.matchesAudience === 'undefined' ? 'undefined' : (0, _typeof3['default'])(_availableExperiments.matchesAudience)).toEqual('function');
});
it('undefined matches any audience', function () {
expect((0, _availableExperiments.matchesAudience)(blankAudience, undefined)).toBeTruthy;
});
it('null matches any audience', function () {
expect((0, _availableExperiments.matchesAudience)(blankAudience, null)).toBeTruthy;
});
it('empty hash matches any audience', function () {
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({}))).toBeTruthy;
});
it('matches on state', function () {
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ state: 'NY' }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ state: { 'in': ['NY'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ state: { 'in': ['NY', 'N/A'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ state: { 'in': ['NY', 'DC'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ state: { 'not in': ['N/A'] } }))).toBeTruthy; // eslint-disable-line
});
it('doesnt match on state', function () {
expect((0, _availableExperiments.matchesAudience)(blankAudience, _immutable2['default'].fromJS({ type: 'ny' }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ type: 'ny' }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ type: { 'in': ['ny'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ type: { 'in': ['ny'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ type: { 'in': ['ny', 'ca'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(stateAudience, _immutable2['default'].fromJS({ type: { 'in': ['ny', 'ca'] } }))).toBeFalsy; // eslint-disable-line
// expect(matchesAudience(stateAudience, Immutable.fromJS({ type: { 'not in': ['ny', 'NY'] } }) )).toBeFalsy; // eslint-disable-line TODO -> fixme?
});
it('matches on vip', function () {
// Exactly matches on 'vip'
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: 'vip' }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'in': ['vip'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'in': ['vip', '1pct'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'in': ['vip', '1pct'] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'not in': ['loggedout'] } }))).toBeTruthy; // eslint-disable-line
});
it('doesnt match on VIP', function () {
// Is case sensitive: 'vip' !=== 'VIP'
expect((0, _availableExperiments.matchesAudience)(blankAudience, _immutable2['default'].fromJS({ type: 'VIP' }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: 'VIP' }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'in': ['VIP'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'in': ['VIP'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'in': ['VIP', '1PCT'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'in': ['VIP', '1PCT'] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(vipAudience, _immutable2['default'].fromJS({ type: { 'not in': ['vip'] } }))).toBeFalsy; // eslint-disable-line
});
it('matches on orders', function () {
// Exactly matches on 'orders'
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: 10 }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '===': 10 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>=': 10 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>=': 0 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>': 0 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<=': 10 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<=': 11 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { 'in': [10, 11, 9] } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { 'not in': [1, 2, 3] } }))).toBeTruthy; // eslint-disable-line
});
it('matches on a range of orders', function () {
// Inside a range
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>=': 5, '<=': 15 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>': 9, '<': 11 } }))).toBeTruthy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>': 9, '<': 11 } }))).toBeTruthy; // eslint-disable-line
// Outside of a range
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<=': 5, '>=': 15 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<': 9, '>': 11 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<': 9, '>': 11 } }))).toBeFalsy; // eslint-disable-line
});
it('doesnt match on orders', function () {
expect((0, _availableExperiments.matchesAudience)(blankAudience, _immutable2['default'].fromJS({ orders: 1 }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '===': -10 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>=': 11 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '>': 11 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<=': 9 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<=': 0 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<': 0 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { '<': 10 } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { 'in': [1, 2, 3] } }))).toBeFalsy; // eslint-disable-line
expect((0, _availableExperiments.matchesAudience)(ordersAudience, _immutable2['default'].fromJS({ orders: { 'not in': [10, 11, 9] } }))).toBeFalsy; // eslint-disable-line
});
it('exactly matches vip, orders, and state', function () {
expect((0, _availableExperiments.matchesAudience)(specialAudience, _immutable2['default'].fromJS({}))).toBeTruthy;
expect((0, _availableExperiments.matchesAudience)(specialAudience, _immutable2['default'].fromJS({ type: 'vip', orders: { '>=': 5, '<=': 15 }, state: { 'in': ['NY', 'CA', 'FL'] } }))).toBeTruthy;
});
});
describe('availableExperiments', function () {
var experiment_0 = _immutable2['default'].fromJS({
name: 'No Audience',
variations: [{ name: 'Original', weight: 5000 }, { name: 'Variation #A', weight: 5000 }, { name: 'Variation #B', weight: 0 }]
});
var experiment_a = _immutable2['default'].fromJS({
key: 'BlankAudienceComponent',
name: 'Blank Audience 1',
audienceProps: {},
variations: [{ name: 'Original', weight: 5000 }, { name: 'Variation #A', weight: 5000 }, { name: 'Variation #B', weight: 0 }]
});
var experiment_a2 = _immutable2['default'].fromJS({
key: 'BlankAudienceComponent',
name: 'Blank Audience 2',
persistentExperience: true,
audienceProps: {},
variations: [{ name: 'Original', weight: 5000 }, { name: 'Variation #A', weight: 5000 }, { name: 'Variation #B', weight: 0 }]
});
var experiment_b = _immutable2['default'].fromJS({
key: 'SimpleAudienceComponent',
name: 'Simple Audience Type',
audienceProps: {
type: 'vip'
},
routeProps: {
pathName: { 'in': ['/magic', '/'] }
},
variations: [{ name: 'Original', weight: 5000 }, { name: 'Variation #A', weight: 5000 }, { name: 'Variation #B', weight: 0 }]
});
var experiment_c = _immutable2['default'].fromJS({
key: 'ComplexAudienceComponent',
name: 'Complex Audience Type',
audienceProps: {
type: 'vip',
orders: { '>=': 1 },
state: { 'in': ['NY', 'FL', 'CA'] }
},
routeProps: {
pathName: '/magic'
},
variations: [{ name: 'Original', weight: 5000 }, { name: 'Variation #A', weight: 5000 }, { name: 'Variation #B', weight: 0 }]
});
var experiment_d = _immutable2['default'].fromJS({
key: 'ComplexAudienceComponent',
name: 'Single Success Type',
singleSuccess: true,
audienceProps: {
type: 'vip',
orders: { '>=': 1 },
state: { 'in': ['NY', 'FL', 'CA'] }
},
routeProps: {
pathName: '/magic'
},
variations: [{ name: 'Original', weight: 5000 }, { name: 'Variation #A', weight: 5000 }, { name: 'Variation #B', weight: 0 }]
});
it('exists', function () {
expect(_availableExperiments2['default']).not.toBeUndefined;
expect(typeof _availableExperiments2['default'] === 'undefined' ? 'undefined' : (0, _typeof3['default'])(_availableExperiments2['default'])).toEqual('function');
});
it('undefined/blank matches any audience', function () {
var output = (0, _availableExperiments2['default'])({
key_path: ['key'],
active: _immutable2['default'].Map(),
fulfilled: _immutable2['default'].List(),
persistent_path: ['persistentExperience'],
audience: _immutable2['default'].Map(),
audience_path: ['audienceProps'],
experiments: _immutable2['default'].List([experiment_0, experiment_a, experiment_a2, experiment_b, experiment_c]),
route_path: _module.initialState.get('route_path'),
route: _module.initialState.get('route')
});
expect(_immutable2['default'].Map.isMap(output)).toBeTruthy;
expect(output.toJS()).toEqual({
'No Audience': 'No Audience',
'BlankAudienceComponent': 'Blank Audience 1'
});
});
it('undefined/blank gives preference to active w/persistentExperience', function () {
var output = (0, _availableExperiments2['default'])({
key_path: ['key'],
active: _immutable2['default'].Map({
'Blank Audience 2': 'Variation #A'
}),
fulfilled: _immutable2['default'].List(),
persistent_path: ['persistentExperience'],
audience: _immutable2['default'].fromJS({ type: 'new user' }),
audience_path: ['audienceProps'],
experiments: _immutable2['default'].List([experiment_0, experiment_a, experiment_a2, experiment_b, experiment_c]),
route_path: _module.initialState.get('route_path'),
route: _module.initialState.get('route')
});
expect(_immutable2['default'].Map.isMap(output)).toBeTruthy;
expect(output.toJS()).toEqual({
'No Audience': 'No Audience',
'BlankAudienceComponent': 'Blank Audience 2'
});
});
it('matches vip', function () {
var output = (0, _availableExperiments2['default'])({
key_path: ['key'],
active: _immutable2['default'].Map(),
fulfilled: _immutable2['default'].List(),
persistent_path: ['persistentExperience'],
audience: _immutable2['default'].fromJS({ type: 'vip' }),
audience_path: ['audienceProps'],
experiments: _immutable2['default'].List([experiment_0, experiment_a, experiment_a2, experiment_b, experiment_c]),
route_path: _module.initialState.get('route_path'),
route: _module.initialState.get('route').merge({ pathName: '/magic' })
});
expect(_immutable2['default'].Map.isMap(output)).toBeTruthy;
expect(output.toJS()).toEqual({
'No Audience': 'No Audience',
'BlankAudienceComponent': 'Blank Audience 1',
'SimpleAudienceComponent': 'Simple Audience Type'
});
});
it('matches vip and orders', function () {
var output = (0, _availableExperiments2['default'])({
key_path: ['key'],
active: _immutable2['default'].Map(),
fulfilled: _immutable2['default'].List(),
persistent_path: ['persistentExperience'],
audience: _immutable2['default'].fromJS({ type: 'vip', orders: 10, state: 'NY' }),
audience_path: ['audienceProps'],
experiments: _immutable2['default'].List([experiment_0, experiment_a, experiment_a2, experiment_b, experiment_c]),
route_path: _module.initialState.get('route_path'),
route: _module.initialState.get('route').merge({ pathName: '/magic' })
});
expect(_immutable2['default'].Map.isMap(output)).toBeTruthy;
expect(output.toJS()).toEqual({
'No Audience': 'No Audience',
'BlankAudienceComponent': 'Blank Audience 1',
'SimpleAudienceComponent': 'Simple Audience Type',
'ComplexAudienceComponent': 'Complex Audience Type'
});
});
it('experiment_d matches vip and orders', function () {
var args = {
key_path: ['key'],
active: _immutable2['default'].Map(),
fulfilled: _immutable2['default'].List(),
persistent_path: ['persistentExperience'],
audience: _immutable2['default'].fromJS({ type: 'vip', orders: 10, state: 'NY' }),
audience_path: ['audienceProps'],
experiments: _immutable2['default'].List([experiment_d]),
route_path: _module.initialState.get('route_path'),
route: _module.initialState.get('route').merge({ pathName: '/magic' })
};
var output = (0, _availableExperiments2['default'])(args);
expect(_immutable2['default'].Map.isMap(output)).toBeTruthy;
expect(output.toJS()).toEqual({
'ComplexAudienceComponent': 'Single Success Type'
});
// if fulfilled, it is excluded from the output
output = (0, _availableExperiments2['default'])((0, _extends3['default'])({}, args, {
fulfilled: _immutable2['default'].List('Single Success Type')
}));
expect(_immutable2['default'].Map.isMap(output)).toBeTruthy;
expect(output.toJS()).toEqual({
// Remove this if you un-comment the winner and single_success_path params to availableExperiments
// 'Single Success Type': 'Original',
'ComplexAudienceComponent': 'Single Success Type'
});
});
});
});