test-utils.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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 { QueryClient, QueryClientProvider } from "@tanstack/react-query";
  8. import { AppStore, RootState, rootReducer } from "./src/store";
  9. import { AuthProvider } from "#/context/auth-context";
  10. import { UserPrefsProvider } from "#/context/user-prefs-context";
  11. const setupStore = (preloadedState?: Partial<RootState>): AppStore =>
  12. configureStore({
  13. reducer: rootReducer,
  14. preloadedState,
  15. });
  16. // This type interface extends the default options for render from RTL, as well
  17. // as allows the user to specify other things such as initialState, store.
  18. interface ExtendedRenderOptions extends Omit<RenderOptions, "queries"> {
  19. preloadedState?: Partial<RootState>;
  20. store?: AppStore;
  21. }
  22. // Export our own customized renderWithProviders function that creates a new Redux store and renders a <Provider>
  23. // Note that this creates a separate Redux store instance for every test, rather than reusing the same store instance and resetting its state
  24. export function renderWithProviders(
  25. ui: React.ReactElement,
  26. {
  27. preloadedState = {},
  28. // Automatically create a store instance if no store was passed in
  29. store = setupStore(preloadedState),
  30. ...renderOptions
  31. }: ExtendedRenderOptions = {},
  32. ) {
  33. function Wrapper({ children }: PropsWithChildren<object>): JSX.Element {
  34. return (
  35. <Provider store={store}>
  36. <UserPrefsProvider>
  37. <AuthProvider>
  38. <QueryClientProvider client={new QueryClient()}>
  39. {children}
  40. </QueryClientProvider>
  41. </AuthProvider>
  42. </UserPrefsProvider>
  43. </Provider>
  44. );
  45. }
  46. return { store, ...render(ui, { wrapper: Wrapper, ...renderOptions }) };
  47. }