component-test-setup
Version:
Standardized test setup methods for React components in tests.
42 lines (41 loc) • 2.61 kB
TypeScript
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 {};