1 | import React, { useContext } from 'react';
|
2 | import { render, cleanup } from '@testing-library/react';
|
3 | import { StaticRouter } from 'react-router';
|
4 | import { CookiesProvider } from 'react-cookie';
|
5 | import Cookies from 'universal-cookie';
|
6 | import ExperimentsProvider, { ExperimentsContext } from './ExperimentsProvider';
|
7 | import AnalyticsProvider from '../analytics/AnalyticsProvider';
|
8 | import { ConfigProvider } from '../components/ConfigProvider';
|
9 | import { ChannelProvider } from '../components/ChannelContext';
|
10 | import { ChannelHandler } from '../ChannelHandler/ChannelHandler';
|
11 | import { selectedChannel, channels } from '../test-utils/variables';
|
12 | import { HelmetProvider } from 'react-helmet-async';
|
13 |
|
14 | afterEach(cleanup);
|
15 |
|
16 | const Collector = ({ fn }) => {
|
17 | const value = useContext(ExperimentsContext);
|
18 | fn(value);
|
19 | return null;
|
20 | };
|
21 |
|
22 | const 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 |
|
52 | describe('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 | });
|