-
Notifications
You must be signed in to change notification settings - Fork 419
Expand file tree
/
Copy pathrendering.tsx
More file actions
139 lines (125 loc) · 4.61 KB
/
Copy pathrendering.tsx
File metadata and controls
139 lines (125 loc) · 4.61 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import { Queries, queries } from '@testing-library/dom';
import { RenderOptions, RenderResult, render, renderHook } from '@testing-library/react';
import { ComponentClass, ComponentType, FC, PropsWithChildren, ReactElement } from 'react';
import { HelmetProvider } from 'react-helmet-async';
import { IntlProvider } from 'react-intl';
import { MemoryRouter, MemoryRouterProps } from 'react-router';
import { TooltipProvider } from '../../components/ui/tooltip';
import { DEFAULT_LOCALE, Locale, TranslationMessages, translationMessages } from '../../config/i18n';
import { LocalesProvider, ResponsiveThemeProvider } from '../../providers';
import { ToastProvider, Toaster } from '../../toast';
/**
* A set of properties that are passed to [`CoreTestProviders`](#coretestproviders) component to override the initial
* state of providers
*/
export type CoreTestProvidersProps = PropsWithChildren<{
routerProps: MemoryRouterProps;
intlLocale: Locale;
intlMessages: TranslationMessages;
}>;
/**
* Component that renders a set of providers used in tests globally like: `MemoryRouter`, `LocalesProvider`,
* `ToastProvider`, `IntlProvider`, etc...
*
* It is used in [`render`](#render) and [`renderHook`](#renderhook) methods.
* @param children
* @param routerProps
* @param intlMessages
* @param intlLocale
* @constructor
*/
export function CoreTestProviders({ children, routerProps, intlMessages, intlLocale }: CoreTestProvidersProps) {
return (
<MemoryRouter future={{ v7_relativeSplatPath: true, v7_startTransition: true }} {...routerProps}>
<HelmetProvider>
<ResponsiveThemeProvider>
<LocalesProvider>
<ToastProvider>
<TooltipProvider>
<IntlProvider locale={intlLocale} messages={intlMessages}>
<>
{children}
<Toaster />
</>
</IntlProvider>
</TooltipProvider>
</ToastProvider>
</LocalesProvider>
</ResponsiveThemeProvider>
</HelmetProvider>
</MemoryRouter>
);
}
export type WrapperProps = Partial<CoreTestProvidersProps>;
/** @ignore */
export function getWrapper(
WrapperComponent: ComponentClass<CoreTestProvidersProps> | FC<CoreTestProvidersProps>,
wrapperProps: WrapperProps
): {
wrapper: ComponentType<WrapperProps>;
} {
const defaultRouterProps: MemoryRouterProps = { initialEntries: ['/'] };
const wrapper = (props: PropsWithChildren<WrapperProps>) => {
return (
<WrapperComponent
{...props}
routerProps={defaultRouterProps}
intlLocale={DEFAULT_LOCALE}
intlMessages={translationMessages[DEFAULT_LOCALE]}
{...(wrapperProps ?? {})}
/>
);
};
return {
wrapper,
};
}
export type CustomRenderOptions<
Q extends Queries = typeof queries,
Container extends Element | DocumentFragment = HTMLElement,
BaseElement extends Element | DocumentFragment = Container,
> = RenderOptions<Q, Container, BaseElement> & WrapperProps;
/**
* Method that extends [`render`](https://testing-library.com/docs/react-testing-library/api#render) method from
* `@testing-library/react` package. It composes a wrapper using [`CoreTestProviders`](#coretestproviders) component and
* `options` property that is passed down to parent `render` method.
* @param ui
* @param options
*/
function customRender<
Q extends Queries = typeof queries,
Container extends Element | DocumentFragment = HTMLElement,
BaseElement extends Element | DocumentFragment = Container,
>(
ui: ReactElement,
options: CustomRenderOptions<Q, Container, BaseElement> = {}
): RenderResult<Q, Container, BaseElement> {
const { wrapper } = getWrapper(CoreTestProviders, options);
return {
...render<Q, Container, BaseElement>(ui, {
...options,
wrapper,
}),
};
}
/**
* Method that extends [`renderHook`](https://testing-library.com/docs/react-testing-library/api#renderhook) method from
* `@testing-library/react` package. It composes a wrapper using [`CoreTestProviders`](#coretestproviders) component and
* `options` property that is passed down to parent `renderHook` method.
* @param hook
* @param options
*/
function customRenderHook<Result, Props>(hook: (initialProps: Props) => Result, options: CustomRenderOptions = {}) {
const { wrapper } = getWrapper(CoreTestProviders, options);
return {
...renderHook(hook, {
...options,
wrapper,
}),
};
}
export { customRender as render, customRenderHook as renderHook };
/** @ignore */
export const PLACEHOLDER_TEST_ID = 'content';
/** @ignore */
export const PLACEHOLDER_CONTENT = <span data-testid="content">content</span>;