Spaces:
Build error
Build error
// 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"; | |
import { RenderOptions, render } from "@testing-library/react"; | |
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; | |
import { I18nextProvider, initReactI18next } from "react-i18next"; | |
import i18n from "i18next"; | |
import { vi } from "vitest"; | |
import { AxiosError } from "axios"; | |
import { AppStore, RootState, rootReducer } from "./src/store"; | |
// Mock useParams before importing components | |
vi.mock("react-router", async () => { | |
const actual = | |
await vi.importActual<typeof import("react-router")>("react-router"); | |
return { | |
...actual, | |
useParams: () => ({ conversationId: "test-conversation-id" }), | |
}; | |
}); | |
// Initialize i18n for tests | |
i18n.use(initReactI18next).init({ | |
lng: "en", | |
fallbackLng: "en", | |
ns: ["translation"], | |
defaultNS: "translation", | |
resources: { | |
en: { | |
translation: {}, | |
}, | |
}, | |
interpolation: { | |
escapeValue: false, | |
}, | |
}); | |
export 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) { | |
return ( | |
<Provider store={store}> | |
<QueryClientProvider | |
client={ | |
new QueryClient({ | |
defaultOptions: { queries: { retry: false } }, | |
}) | |
} | |
> | |
<I18nextProvider i18n={i18n}>{children}</I18nextProvider> | |
</QueryClientProvider> | |
</Provider> | |
); | |
} | |
return { store, ...render(ui, { wrapper: Wrapper, ...renderOptions }) }; | |
} | |
export const createAxiosNotFoundErrorObject = () => | |
new AxiosError( | |
"Request failed with status code 404", | |
"ERR_BAD_REQUEST", | |
undefined, | |
undefined, | |
{ | |
status: 404, | |
statusText: "Not Found", | |
data: { message: "Settings not found" }, | |
headers: {}, | |
// @ts-expect-error - we only need the response object for this test | |
config: {}, | |
}, | |
); | |