/* eslint-disable check-file/filename-naming-convention */
import * as React from 'react';
import { fixtures } from '@strapi/admin-test-utils';
import { DesignSystemProvider } from '@strapi/design-system';
import {
renderHook as renderHookRTL,
render as renderRTL,
waitFor,
RenderOptions as RTLRenderOptions,
RenderResult,
act,
screen,
} from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { MemoryRouter, MemoryRouterProps } from 'react-router-dom';
import { Permission, RBACContext, RBACContextValue } from '../src/features/RBAC';
import { server } from './server';
interface ProvidersProps {
children: React.ReactNode;
initialEntries?: MemoryRouterProps['initialEntries'];
}
const Providers = ({ children, initialEntries }: ProvidersProps) => {
const rbacContextValue: RBACContextValue = React.useMemo(
() => ({
allPermissions: fixtures.permissions.allPermissions as unknown as Permission[],
refetchPermissions: jest.fn(),
}),
[]
);
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: false,
// no more errors on the console for tests
// eslint-disable-next-line @typescript-eslint/no-empty-function
onError() {},
},
},
});
return (
// en is the default locale of the admin app.
{children}
);
};
// eslint-disable-next-line react/jsx-no-useless-fragment
const fallbackWrapper = ({ children }: { children: React.ReactNode }) => <>{children}>;
export interface RenderOptions {
renderOptions?: RTLRenderOptions;
userEventOptions?: Parameters[0];
initialEntries?: MemoryRouterProps['initialEntries'];
}
const render = (
ui: React.ReactElement,
{ renderOptions, userEventOptions, initialEntries }: RenderOptions = {}
): RenderResult & { user: ReturnType } => {
const { wrapper: Wrapper = fallbackWrapper, ...restOptions } = renderOptions ?? {};
return {
...renderRTL(ui, {
wrapper: ({ children }) => (
{children}
),
...restOptions,
}),
user: userEvent.setup(userEventOptions),
};
};
const renderHook: typeof renderHookRTL = (hook, options) => {
const { wrapper: Wrapper = fallbackWrapper, ...restOptions } = options ?? {};
return renderHookRTL(hook, {
wrapper: ({ children }) => (
{children}
),
...restOptions,
});
};
export { render, renderHook, waitFor, server, act, screen };