UNPKG

9.08 kBTypeScriptView Raw
1// TypeScript Version: 3.8
2import * as ReactDOMClient from 'react-dom/client'
3import {
4 queries,
5 Queries,
6 BoundFunction,
7 prettyFormat,
8 Config as ConfigDTL,
9} from '@testing-library/dom'
10import {act as reactDeprecatedAct} from 'react-dom/test-utils'
11//@ts-ignore
12import {act as reactAct} from 'react'
13
14export * from '@testing-library/dom'
15
16export interface Config extends ConfigDTL {
17 reactStrictMode: boolean
18}
19
20export interface ConfigFn {
21 (existingConfig: Config): Partial<Config>
22}
23
24export function configure(configDelta: ConfigFn | Partial<Config>): void
25
26export function getConfig(): Config
27
28export type RenderResult<
29 Q extends Queries = typeof queries,
30 Container extends RendererableContainer | HydrateableContainer = HTMLElement,
31 BaseElement extends RendererableContainer | HydrateableContainer = Container,
32> = {
33 container: Container
34 baseElement: BaseElement
35 debug: (
36 baseElement?:
37 | RendererableContainer
38 | HydrateableContainer
39 | Array<RendererableContainer | HydrateableContainer>,
40 maxLength?: number,
41 options?: prettyFormat.OptionsReceived,
42 ) => void
43 rerender: (ui: React.ReactNode) => void
44 unmount: () => void
45 asFragment: () => DocumentFragment
46} & {[P in keyof Q]: BoundFunction<Q[P]>}
47
48/** @deprecated */
49export type BaseRenderOptions<
50 Q extends Queries,
51 Container extends RendererableContainer | HydrateableContainer,
52 BaseElement extends RendererableContainer | HydrateableContainer,
53> = RenderOptions<Q, Container, BaseElement>
54
55type RendererableContainer = ReactDOMClient.Container
56type HydrateableContainer = Parameters<typeof ReactDOMClient['hydrateRoot']>[0]
57/** @deprecated */
58export interface ClientRenderOptions<
59 Q extends Queries,
60 Container extends RendererableContainer,
61 BaseElement extends RendererableContainer = Container,
62> extends BaseRenderOptions<Q, Container, BaseElement> {
63 /**
64 * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side
65 * rendering and use ReactDOM.hydrate to mount your components.
66 *
67 * @see https://testing-library.com/docs/react-testing-library/api/#hydrate)
68 */
69 hydrate?: false | undefined
70}
71/** @deprecated */
72export interface HydrateOptions<
73 Q extends Queries,
74 Container extends HydrateableContainer,
75 BaseElement extends HydrateableContainer = Container,
76> extends BaseRenderOptions<Q, Container, BaseElement> {
77 /**
78 * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side
79 * rendering and use ReactDOM.hydrate to mount your components.
80 *
81 * @see https://testing-library.com/docs/react-testing-library/api/#hydrate)
82 */
83 hydrate: true
84}
85
86export interface RenderOptions<
87 Q extends Queries = typeof queries,
88 Container extends RendererableContainer | HydrateableContainer = HTMLElement,
89 BaseElement extends RendererableContainer | HydrateableContainer = Container,
90> {
91 /**
92 * By default, React Testing Library will create a div and append that div to the document.body. Your React component will be rendered in the created div. If you provide your own HTMLElement container via this option,
93 * it will not be appended to the document.body automatically.
94 *
95 * For example: If you are unit testing a `<tbody>` element, it cannot be a child of a div. In this case, you can
96 * specify a table as the render container.
97 *
98 * @see https://testing-library.com/docs/react-testing-library/api/#container
99 */
100 container?: Container
101 /**
102 * Defaults to the container if the container is specified. Otherwise `document.body` is used for the default. This is used as
103 * the base element for the queries as well as what is printed when you use `debug()`.
104 *
105 * @see https://testing-library.com/docs/react-testing-library/api/#baseelement
106 */
107 baseElement?: BaseElement
108 /**
109 * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side
110 * rendering and use ReactDOM.hydrate to mount your components.
111 *
112 * @see https://testing-library.com/docs/react-testing-library/api/#hydrate)
113 */
114 hydrate?: boolean
115 /**
116 * Only works if used with React 18.
117 * Set to `true` if you want to force synchronous `ReactDOM.render`.
118 * Otherwise `render` will default to concurrent React if available.
119 */
120 legacyRoot?: boolean
121 /**
122 * Queries to bind. Overrides the default set from DOM Testing Library unless merged.
123 *
124 * @see https://testing-library.com/docs/react-testing-library/api/#queries
125 */
126 queries?: Q
127 /**
128 * Pass a React Component as the wrapper option to have it rendered around the inner element. This is most useful for creating
129 * reusable custom render functions for common data providers. See setup for examples.
130 *
131 * @see https://testing-library.com/docs/react-testing-library/api/#wrapper
132 */
133 wrapper?: React.JSXElementConstructor<{children: React.ReactNode}>
134}
135
136type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
137
138/**
139 * Render into a container which is appended to document.body. It should be used with cleanup.
140 */
141export function render<
142 Q extends Queries = typeof queries,
143 Container extends RendererableContainer | HydrateableContainer = HTMLElement,
144 BaseElement extends RendererableContainer | HydrateableContainer = Container,
145>(
146 ui: React.ReactNode,
147 options: RenderOptions<Q, Container, BaseElement>,
148): RenderResult<Q, Container, BaseElement>
149export function render(
150 ui: React.ReactNode,
151 options?: Omit<RenderOptions, 'queries'>,
152): RenderResult
153
154export interface RenderHookResult<Result, Props> {
155 /**
156 * Triggers a re-render. The props will be passed to your renderHook callback.
157 */
158 rerender: (props?: Props) => void
159 /**
160 * This is a stable reference to the latest value returned by your renderHook
161 * callback
162 */
163 result: {
164 /**
165 * The value returned by your renderHook callback
166 */
167 current: Result
168 }
169 /**
170 * Unmounts the test component. This is useful for when you need to test
171 * any cleanup your useEffects have.
172 */
173 unmount: () => void
174}
175
176/** @deprecated */
177export type BaseRenderHookOptions<
178 Props,
179 Q extends Queries,
180 Container extends RendererableContainer | HydrateableContainer,
181 BaseElement extends Element | DocumentFragment,
182> = RenderHookOptions<Props, Q, Container, BaseElement>
183
184/** @deprecated */
185export interface ClientRenderHookOptions<
186 Props,
187 Q extends Queries,
188 Container extends Element | DocumentFragment,
189 BaseElement extends Element | DocumentFragment = Container,
190> extends BaseRenderHookOptions<Props, Q, Container, BaseElement> {
191 /**
192 * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side
193 * rendering and use ReactDOM.hydrate to mount your components.
194 *
195 * @see https://testing-library.com/docs/react-testing-library/api/#hydrate)
196 */
197 hydrate?: false | undefined
198}
199
200/** @deprecated */
201export interface HydrateHookOptions<
202 Props,
203 Q extends Queries,
204 Container extends Element | DocumentFragment,
205 BaseElement extends Element | DocumentFragment = Container,
206> extends BaseRenderHookOptions<Props, Q, Container, BaseElement> {
207 /**
208 * If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side
209 * rendering and use ReactDOM.hydrate to mount your components.
210 *
211 * @see https://testing-library.com/docs/react-testing-library/api/#hydrate)
212 */
213 hydrate: true
214}
215
216export interface RenderHookOptions<
217 Props,
218 Q extends Queries = typeof queries,
219 Container extends RendererableContainer | HydrateableContainer = HTMLElement,
220 BaseElement extends RendererableContainer | HydrateableContainer = Container,
221> extends BaseRenderOptions<Q, Container, BaseElement> {
222 /**
223 * The argument passed to the renderHook callback. Can be useful if you plan
224 * to use the rerender utility to change the values passed to your hook.
225 */
226 initialProps?: Props
227}
228
229/**
230 * Allows you to render a hook within a test React component without having to
231 * create that component yourself.
232 */
233export function renderHook<
234 Result,
235 Props,
236 Q extends Queries = typeof queries,
237 Container extends RendererableContainer | HydrateableContainer = HTMLElement,
238 BaseElement extends RendererableContainer | HydrateableContainer = Container,
239>(
240 render: (initialProps: Props) => Result,
241 options?: RenderHookOptions<Props, Q, Container, BaseElement>,
242): RenderHookResult<Result, Props>
243
244/**
245 * Unmounts React trees that were mounted with render.
246 */
247export function cleanup(): void
248
249/**
250 * Simply calls React.act(cb)
251 * If that's not available (older version of react) then it
252 * simply calls the deprecated version which is ReactTestUtils.act(cb)
253 */
254// IfAny<typeof reactAct, reactDeprecatedAct, reactAct> from https://stackoverflow.com/a/61626123/3406963
255export const act: 0 extends 1 & typeof reactAct
256 ? typeof reactDeprecatedAct
257 : typeof reactAct
258
\No newline at end of file