UNPKG

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
'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' }); }); }); });