UNPKG

2.67 kBJavaScriptView Raw
1import React, { useContext } from 'react';
2import { render, cleanup } from '@testing-library/react';
3import { StaticRouter } from 'react-router';
4import { CookiesProvider } from 'react-cookie';
5import Cookies from 'universal-cookie';
6import ExperimentsProvider, { ExperimentsContext } from './ExperimentsProvider';
7import AnalyticsProvider from '../analytics/AnalyticsProvider';
8import { ConfigProvider } from '../components/ConfigProvider';
9import { ChannelProvider } from '../components/ChannelContext';
10import { ChannelHandler } from '../ChannelHandler/ChannelHandler';
11import { selectedChannel, channels } from '../test-utils/variables';
12import { HelmetProvider } from 'react-helmet-async';
13
14afterEach(cleanup);
15
16const Collector = ({ fn }) => {
17 const value = useContext(ExperimentsContext);
18 fn(value);
19 return null;
20};
21
22const setup = ({ cookies, shopConfig = {} }) => {
23 let data;
24 const channelHandler = new ChannelHandler({
25 selectedChannel,
26 channels
27 });
28
29 render(
30 <StaticRouter>
31 <CookiesProvider cookies={cookies}>
32 <HelmetProvider context={{}}>
33 <ChannelProvider channelHandler={channelHandler}>
34 <ConfigProvider config={shopConfig}>
35 <AnalyticsProvider config={{}}>
36 <ExperimentsProvider>
37 <Collector fn={value => (data = value)} />
38 </ExperimentsProvider>
39 </AnalyticsProvider>
40 </ConfigProvider>
41 </ChannelProvider>
42 </HelmetProvider>
43 </CookiesProvider>
44 </StaticRouter>
45 );
46
47 return {
48 data
49 };
50};
51
52describe('ExperimentsProvider', () => {
53 it('reads the current experiment and value from the optimizeExperiment cookie', () => {
54 const cookies = new Cookies({
55 optimizeExperiment: 'test.0'
56 });
57
58 const { data } = setup({ cookies });
59
60 expect(data.experiment).toBe('test');
61 expect(data.variant).toBe(0);
62 });
63
64 it('defaults the values to null if no cookie was set', () => {
65 const { data } = setup({ cookies: new Cookies({}) });
66 expect(data.experiment).toBe(null);
67 expect(data.variant).toBe(null);
68 });
69
70 it('runs the trackExperiment function when mounting', () => {
71 const trackExperiment = jest.fn();
72
73 const cookies = new Cookies({
74 optimizeExperiment: 'test.0'
75 });
76
77 const shopConfig = {
78 trackers: [
79 {
80 name: 'test',
81 trackExperiment
82 }
83 ]
84 };
85
86 setup({ cookies, shopConfig });
87
88 expect(trackExperiment).toHaveBeenCalledTimes(1);
89 expect(trackExperiment).toHaveBeenCalledWith(
90 {
91 id: 'test',
92 variant: 0
93 },
94 expect.anything()
95 );
96 });
97});