| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // See https://redux.js.org/usage/writing-tests#setting-up-a-reusable-test-render-function for more information
- import React, { PropsWithChildren } from "react";
- import { Provider } from "react-redux";
- import { configureStore } from "@reduxjs/toolkit";
- // eslint-disable-next-line import/no-extraneous-dependencies
- import { RenderOptions, render } from "@testing-library/react";
- import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
- import { I18nextProvider } from "react-i18next";
- import i18n from "i18next";
- import { initReactI18next } from "react-i18next";
- import { AppStore, RootState, rootReducer } from "./src/store";
- import { AuthProvider } from "#/context/auth-context";
- import { UserPrefsProvider } from "#/context/user-prefs-context";
- // Initialize i18n for tests
- i18n
- .use(initReactI18next)
- .init({
- lng: "en",
- fallbackLng: "en",
- ns: ["translation"],
- defaultNS: "translation",
- resources: {
- en: {
- translation: {},
- },
- },
- interpolation: {
- escapeValue: false,
- },
- });
- const setupStore = (preloadedState?: Partial<RootState>): AppStore =>
- configureStore({
- reducer: rootReducer,
- preloadedState,
- });
- // This type interface extends the default options for render from RTL, as well
- // as allows the user to specify other things such as initialState, store.
- interface ExtendedRenderOptions extends Omit<RenderOptions, "queries"> {
- preloadedState?: Partial<RootState>;
- store?: AppStore;
- }
- // Export our own customized renderWithProviders function that creates a new Redux store and renders a <Provider>
- // Note that this creates a separate Redux store instance for every test, rather than reusing the same store instance and resetting its state
- export function renderWithProviders(
- ui: React.ReactElement,
- {
- preloadedState = {},
- // Automatically create a store instance if no store was passed in
- store = setupStore(preloadedState),
- ...renderOptions
- }: ExtendedRenderOptions = {},
- ) {
- function Wrapper({ children }: PropsWithChildren<object>): JSX.Element {
- return (
- <Provider store={store}>
- <UserPrefsProvider>
- <AuthProvider>
- <QueryClientProvider client={new QueryClient()}>
- <I18nextProvider i18n={i18n}>
- {children}
- </I18nextProvider>
- </QueryClientProvider>
- </AuthProvider>
- </UserPrefsProvider>
- </Provider>
- );
- }
- return { store, ...render(ui, { wrapper: Wrapper, ...renderOptions }) };
- }
|