reactTestingLibrary.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import {Component, Fragment} from 'react';
  2. import {cache} from '@emotion/css';
  3. import {CacheProvider, ThemeProvider} from '@emotion/react';
  4. import {
  5. fireEvent as reactRtlFireEvent,
  6. render,
  7. RenderOptions,
  8. } from '@testing-library/react';
  9. import userEvent from '@testing-library/user-event';
  10. import GlobalModal from 'sentry/components/globalModal';
  11. import {Organization} from 'sentry/types';
  12. import {lightTheme} from 'sentry/utils/theme';
  13. import {OrganizationContext} from 'sentry/views/organizationContext';
  14. type ProviderOptions = {
  15. context?: Record<string, any>;
  16. organization?: Organization;
  17. };
  18. function createProvider(contextDefs: Record<string, any>) {
  19. return class ContextProvider extends Component {
  20. static childContextTypes = contextDefs.childContextTypes;
  21. getChildContext() {
  22. return contextDefs.context;
  23. }
  24. render() {
  25. return this.props.children;
  26. }
  27. };
  28. }
  29. function makeAllTheProviders({context, organization}: ProviderOptions) {
  30. return function ({children}: {children?: React.ReactNode}) {
  31. const ContextProvider = context ? createProvider(context) : Fragment;
  32. return (
  33. <ContextProvider>
  34. <CacheProvider value={cache}>
  35. <ThemeProvider theme={lightTheme}>
  36. {organization ? (
  37. <OrganizationContext.Provider value={organization}>
  38. {children}
  39. </OrganizationContext.Provider>
  40. ) : (
  41. children
  42. )}
  43. </ThemeProvider>
  44. </CacheProvider>
  45. </ContextProvider>
  46. );
  47. };
  48. }
  49. /**
  50. * Migrating from enzyme? Pass context via the options object
  51. * Before
  52. * mountWithTheme(<Something />, routerContext);
  53. * After
  54. * mountWithTheme(<Something />, {context: routerContext});
  55. */
  56. const mountWithTheme = (
  57. ui: React.ReactElement,
  58. options?: ProviderOptions & RenderOptions
  59. ) => {
  60. const {context, organization, ...otherOptions} = options ?? {};
  61. const AllTheProviders = makeAllTheProviders({context, organization});
  62. return render(ui, {wrapper: AllTheProviders, ...otherOptions});
  63. };
  64. export * from '@testing-library/react';
  65. /**
  66. * @deprecated
  67. * Use userEvent over fireEvent where possible.
  68. * More details: https://kentcdodds.com/blog/common-mistakes-with-react-testing-library#not-using-testing-libraryuser-event
  69. */
  70. const fireEvent = reactRtlFireEvent;
  71. export function mountGlobalModal(context) {
  72. return mountWithTheme(<GlobalModal />, {context});
  73. }
  74. export {mountWithTheme, userEvent, fireEvent};