/* 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,
} 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 };