aboutsummaryrefslogtreecommitdiffstats
path: root/tests/utils/index.tsx
blob: 2457285ebea944cd8c9450d48ba392cf15475dd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import {
  render as rtlRender,
  type RenderOptions,
} from '@testing-library/react';
import type { FC, ReactElement, ReactNode } from 'react';
import { IntlProvider } from 'react-intl';
import {
  AckeeProvider,
  MotionProvider,
  ThemeProvider,
} from '../../src/utils/providers';

type ProvidersConfig = {
  children: ReactNode;
  locale?: 'en' | 'fr';
};

type CustomRenderOptions = {
  providers?: ProvidersConfig;
  testingLibrary?: Omit<RenderOptions, 'wrapper'>;
};

/**
 * Return a component wrapped with Intl and Theme Provider.
 *
 * @returns A component wrapped Intl and Theme providers.
 */
const AllTheProviders: FC<ProvidersConfig> = ({ children, locale = 'en' }) => (
  <IntlProvider locale={locale}>
    <ThemeProvider attribute="theme" storageKey="theme">
      <AckeeProvider
        domainId="any-id"
        server="https://example.test"
        storageKey="ackee"
        tracking="full"
      >
        <MotionProvider
          attribute="reduced-motion"
          hasReducedMotion={false}
          storageKey="reduced-motion"
        >
          {children}
        </MotionProvider>
      </AckeeProvider>
    </ThemeProvider>
  </IntlProvider>
);

/**
 * Render a component with all the providers.
 *
 * @param {ReactElement} ui - A React component.
 * @param {CustomRenderOptions} [options] - An object of render options and providers options.
 * @returns A React component wrapped with all the providers.
 */
const render = (ui: ReactElement, options?: CustomRenderOptions) =>
  rtlRender(ui, {
    wrapper: (props) => <AllTheProviders {...props} {...options?.providers} />,
    ...options?.testingLibrary,
  });

/* eslint-disable import/export */
export * from '@testing-library/react';
export { render };