import { configureMockStore } from '@jedmao/redux-mock-store'; import { render, RenderOptions } from '@testing-library/react'; import { merge, Record as ImmutableRecord } from 'immutable'; import React, { FC, ReactElement } from 'react'; import { IntlProvider } from 'react-intl'; import { Provider } from 'react-redux'; import { MemoryRouter } from 'react-router-dom'; import { Action, applyMiddleware, createStore } from 'redux'; import thunk from 'redux-thunk'; import '@testing-library/jest-dom'; import NotificationsContainer from '../features/ui/containers/notifications_container'; import { default as rootReducer } from '../reducers'; import type { AnyAction } from 'redux'; import type { AppDispatch } from 'soapbox/store'; // Mock Redux // https://redux.js.org/recipes/writing-tests/ const gg = rootReducer(undefined, {} as Action); const rootState = gg as unknown as ImmutableRecord; const mockStore = configureMockStore([thunk]); /** Apply actions to the state, one at a time. */ const applyActions = (state: any, actions: any, reducer: any) => { return actions.reduce((state: any, action: any) => reducer(state, action), state); }; const createTestStore = (initialState: any) => createStore(rootReducer, initialState, applyMiddleware(thunk)); const TestApp: FC = ({ children, storeProps, routerProps = {} }) => { let store: any; let appState = rootState; if (storeProps) { appState = merge(rootState, storeProps); store = createTestStore(appState); } else { store = createTestStore(appState); } const props = { locale: 'en', store, }; return ( {children} ); }; const customRender = ( ui: ReactElement, options?: Omit, store?: any, routerProps?: any, ) => render(ui, { wrapper: () => , ...options, }); const mockWindowProperty = (property: any, value: any) => { const { [property]: originalProperty } = window; delete window[property]; beforeAll(() => { Object.defineProperty(window, property, { configurable: true, writable: true, value, }); }); afterAll(() => { window[property] = originalProperty; }); }; export * from '@testing-library/react'; export { customRender as render, mockStore, applyActions, rootState, rootReducer, mockWindowProperty, createTestStore, };