1 | import React from 'react';
|
2 | import { render, cleanup } from '@testing-library/react';
|
3 | import useExperiment from './useExperiment';
|
4 | import { StaticRouter } from 'react-router';
|
5 | import { CookiesProvider } from 'react-cookie';
|
6 | import Cookies from 'universal-cookie';
|
7 | import ExperimentsProvider from './ExperimentsProvider';
|
8 | import AnalyticsProvider from '../analytics/AnalyticsProvider';
|
9 | import { ConfigProvider } from '../components/ConfigProvider';
|
10 | import { ChannelProvider } from '../components/ChannelContext';
|
11 | import { ChannelHandler } from '../ChannelHandler/ChannelHandler';
|
12 | import { selectedChannel, channels } from '../test-utils/variables';
|
13 | import { HelmetProvider } from 'react-helmet-async';
|
14 | afterEach(cleanup);
|
15 |
|
16 | const Collector = ({ report, id, variant }) => {
|
17 | const data = useExperiment(id, variant);
|
18 | report(data);
|
19 | return null;
|
20 | };
|
21 |
|
22 | const setup = ({ report, id, variant, cookies }) => {
|
23 | const channelHandler = new ChannelHandler({
|
24 | selectedChannel,
|
25 | channels
|
26 | });
|
27 | return render(
|
28 | <StaticRouter>
|
29 | <CookiesProvider cookies={cookies}>
|
30 | <HelmetProvider context={{}}>
|
31 | <ChannelProvider channelHandler={channelHandler}>
|
32 | <ConfigProvider config={{}}>
|
33 | <AnalyticsProvider config={{}}>
|
34 | <ExperimentsProvider>
|
35 | <Collector report={report} id={id} variant={variant} />
|
36 | </ExperimentsProvider>
|
37 | </AnalyticsProvider>
|
38 | </ConfigProvider>
|
39 | </ChannelProvider>
|
40 | </HelmetProvider>
|
41 | </CookiesProvider>
|
42 | </StaticRouter>
|
43 | );
|
44 | };
|
45 |
|
46 | describe('useExperiment', () => {
|
47 | it('returns false if no cookie is set', () => {
|
48 | const cookies = new Cookies({});
|
49 |
|
50 | const report = jest.fn();
|
51 | setup({
|
52 | cookies,
|
53 | report,
|
54 | id: null,
|
55 | variant: null
|
56 | });
|
57 |
|
58 | expect(report).toHaveBeenCalledTimes(1);
|
59 | expect(report).toHaveBeenCalledWith(false);
|
60 | });
|
61 |
|
62 | it('returns false if cookie does not match provided experiment and variant', () => {
|
63 | const cookies = new Cookies({
|
64 | optimizeExperiment: 'test.0'
|
65 | });
|
66 | const report = jest.fn();
|
67 | setup({
|
68 | cookies,
|
69 | report,
|
70 | id: 'test',
|
71 | variant: 1
|
72 | });
|
73 |
|
74 | expect(report).toHaveBeenCalledTimes(1);
|
75 | expect(report).toHaveBeenCalledWith(false);
|
76 | });
|
77 |
|
78 | it('returns true if cookie matches provided experiment and variant', () => {
|
79 | const cookies = new Cookies({
|
80 | optimizeExperiment: 'test.0'
|
81 | });
|
82 | const report = jest.fn();
|
83 | setup({
|
84 | cookies,
|
85 | report,
|
86 | id: 'test',
|
87 | variant: 0
|
88 | });
|
89 |
|
90 | expect(report).toHaveBeenCalledTimes(1);
|
91 | expect(report).toHaveBeenCalledWith(true);
|
92 | });
|
93 | });
|