/* * SonarQube * Copyright (C) 2009-2022 SonarSource SA * mailto:info AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import { render, RenderResult } from '@testing-library/react'; import * as React from 'react'; import { HelmetProvider } from 'react-helmet-async'; import { IntlProvider } from 'react-intl'; import { MemoryRouter, Outlet, parsePath, Route, Routes } from 'react-router-dom'; import AdminContext from '../app/components/AdminContext'; import AppStateContextProvider from '../app/components/app-state/AppStateContextProvider'; import CurrentUserContextProvider from '../app/components/current-user/CurrentUserContextProvider'; import GlobalMessagesContainer from '../app/components/GlobalMessagesContainer'; import IndexationContextProvider from '../app/components/indexation/IndexationContextProvider'; import { LanguagesContext } from '../app/components/languages/LanguagesContext'; import { MetricsContext } from '../app/components/metrics/MetricsContext'; import { useLocation } from '../components/hoc/withRouter'; import { AppState } from '../types/appstate'; import { Dict, Extension, Languages, Metric, SysStatus } from '../types/types'; import { CurrentUser } from '../types/users'; import { DEFAULT_METRICS } from './mocks/metrics'; import { mockAppState, mockCurrentUser } from './testMocks'; interface RenderContext { metrics?: Dict; appState?: AppState; languages?: Languages; currentUser?: CurrentUser; navigateTo?: string; } export function renderAdminApp( indexPath: string, routes: () => JSX.Element, context: RenderContext = {}, overrides: { systemStatus?: SysStatus; adminPages?: Extension[] } = {} ): RenderResult { function MockAdminContainer() { return ( { /*noop*/ }, fetchPendingPlugins: () => { /*noop*/ }, pendingPlugins: { installing: [], removing: [], updating: [] }, systemStatus: overrides.systemStatus ?? 'UP' }}> ); } return renderRoutedApp( } path="admin"> {routes()} , indexPath, context ); } export function renderComponent(component: React.ReactElement, pathname = '/') { function Wrapper({ children }: { children: React.ReactElement }) { return ( ); } return render(component, { wrapper: Wrapper }); } export function renderComponentApp( indexPath: string, component: JSX.Element, context: RenderContext = {} ): RenderResult { return renderRoutedApp(, indexPath, context); } export function renderApp( indexPath: string, routes: () => JSX.Element, context?: RenderContext ): RenderResult { return renderRoutedApp(routes(), indexPath, context); } export function CatchAll() { const location = useLocation(); return
{`${location.pathname}${location.search}`}
; } function renderRoutedApp( children: React.ReactElement, indexPath: string, { currentUser = mockCurrentUser(), navigateTo = indexPath, metrics = DEFAULT_METRICS, appState = mockAppState(), languages = {} }: RenderContext = {} ): RenderResult { const path = parsePath(navigateTo); path.pathname = `/${path.pathname}`; return render( {children} } /> ); }