UNPKG

component-test-setup

Version:

Standardized test setup methods for React components in tests.

42 lines (41 loc) 2.61 kB
import { RenderOptions, RenderResult } from "@testing-library/react"; import { ReactWrapper } from "enzyme"; import { ReactElement } from "react"; interface PureFunctionComponent<P = {}> { (props?: P): ReactElement<any, any> | null; } export declare type SetupComponentType = React.ComponentType<any> | PureFunctionComponent; export declare type FullProps<C extends SetupComponentType> = React.ComponentProps<C>; export declare type RenderEnzyme<Component extends SetupComponentType, Props extends Partial<FullProps<Component>>> = (...testProps: ConditionallyRequiredTestProps<Component, Props>) => RenderEnzymeReturn<Component>; export declare type RenderRtl<Component extends SetupComponentType, Props extends Partial<FullProps<Component>>> = { (...testProps: ConditionallyRequiredTestProps<Component, Props>): RenderRtlReturn<Component>; options: (options: RenderOptions) => RenderRtl<Component, Props>; }; declare type ConditionallyRequiredTestProps<Component extends SetupComponentType, Props extends Partial<FullProps<Component>>> = HasRequiredField<RemainingProps<Component, Props>> extends true ? [ RemainingPropsAndTestOverrides<Component, Props> ] : [RemainingPropsAndTestOverrides<Component, Props>?]; declare type HasRequiredField<T> = RequiredKeys<T> extends never ? false : true; declare type RequiredKeys<T> = { [K in keyof T]-?: Record<string, unknown> extends { [P in K]: T[K]; } ? never : K; }[keyof T]; interface RenderEnzymeReturn<Component extends SetupComponentType> extends BaseRenderReturn<Component> { wrapper: ReactWrapper<FullProps<Component>, React.ComponentState>; } interface RenderRtlReturn<Component extends SetupComponentType> extends BaseRenderReturn<Component> { view: RenderResult; } interface BaseRenderReturn<Component extends SetupComponentType> { props: FullProps<Component>; update: (updatedProps?: Partial<FullProps<Component>>) => void; } /** * Given the type of a React component and the type of 'base' (a.k.a. 'default') props * preset for it, this returns a type containing two things: * * Required: any props not already provided in the base props * * Optional: any overrides for the base props */ export declare type RemainingPropsAndTestOverrides<ComponentType extends SetupComponentType, BaseProps extends Partial<FullProps<ComponentType>>> = RemainingProps<ComponentType, BaseProps> & Partial<FullProps<ComponentType>>; declare type RemainingProps<ComponentType extends SetupComponentType, BaseProps extends Partial<FullProps<ComponentType>>> = Omit<FullProps<ComponentType>, keyof BaseProps>; export {};