test-utils.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // See https://redux.js.org/usage/writing-tests#setting-up-a-reusable-test-render-function for more information
  2. import React, { PropsWithChildren } from "react";
  3. import { Provider } from "react-redux";
  4. import { configureStore } from "@reduxjs/toolkit";
  5. // eslint-disable-next-line import/no-extraneous-dependencies
  6. import { RenderOptions, render } from "@testing-library/react";
  7. import { AppStore, RootState, rootReducer } from "./src/store";
  8. import { WsClientProvider } from "#/context/ws-client-provider";
  9. const setupStore = (preloadedState?: Partial<RootState>): AppStore =>
  10. configureStore({
  11. reducer: rootReducer,
  12. preloadedState,
  13. });
  14. // This type interface extends the default options for render from RTL, as well
  15. // as allows the user to specify other things such as initialState, store.
  16. interface ExtendedRenderOptions extends Omit<RenderOptions, "queries"> {
  17. preloadedState?: Partial<RootState>;
  18. store?: AppStore;
  19. }
  20. // Export our own customized renderWithProviders function that creates a new Redux store and renders a <Provider>
  21. // Note that this creates a separate Redux store instance for every test, rather than reusing the same store instance and resetting its state
  22. export function renderWithProviders(
  23. ui: React.ReactElement,
  24. {
  25. preloadedState = {},
  26. // Automatically create a store instance if no store was passed in
  27. store = setupStore(preloadedState),
  28. ...renderOptions
  29. }: ExtendedRenderOptions = {},
  30. ) {
  31. function Wrapper({ children }: PropsWithChildren<object>): JSX.Element {
  32. return (
  33. <Provider store={store}>
  34. <WsClientProvider enabled={true} token={null} ghToken={null} settings={null}>{children}</WsClientProvider>
  35. </Provider>
  36. );
  37. }
  38. return { store, ...render(ui, { wrapper: Wrapper, ...renderOptions }) };
  39. }