Routing: Import useLocation from compat package (#92071)

* Routing: Import useLocation from compat package

* Add ComparRouter

* Add CompatRouter

* Fix tests

* Add CompatRouter to TestProvider

* Use findBy

* Remove AppChromeService

* Remove historyOptions

* Routing: Fix alerting/test utils issues from react compat router usage (#92127)

* Use render from test-utils

* Use compat router

* Convert more tests

---------

Co-authored-by: Tom Ratcliffe <tom.ratcliffe@grafana.com>
This commit is contained in:
Alex Khomenko 2024-08-23 09:54:13 +03:00 committed by GitHub
parent d24b21d3ef
commit 0af4a20b58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
38 changed files with 94 additions and 158 deletions

View File

@ -1,7 +1,7 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { DOMAttributes } from '@react-types/shared'; import { DOMAttributes } from '@react-types/shared';
import { memo, forwardRef, useCallback } from 'react'; import { memo, forwardRef, useCallback } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2, NavModelItem } from '@grafana/data'; import { GrafanaTheme2, NavModelItem } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors'; import { selectors } from '@grafana/e2e-selectors';

View File

@ -1,7 +1,7 @@
import { css, cx } from '@emotion/css'; import { css, cx } from '@emotion/css';
import { useEffect, useRef } from 'react'; import { useEffect, useRef } from 'react';
import * as React from 'react'; import * as React from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { useLocalStorage } from 'react-use'; import { useLocalStorage } from 'react-use';
import { GrafanaTheme2, NavModelItem, toIconName } from '@grafana/data'; import { GrafanaTheme2, NavModelItem, toIconName } from '@grafana/data';

View File

@ -1,5 +1,5 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2, locationUtil, textUtil } from '@grafana/data'; import { GrafanaTheme2, locationUtil, textUtil } from '@grafana/data';
import { useStyles2 } from '@grafana/ui'; import { useStyles2 } from '@grafana/ui';

View File

@ -1,7 +1,7 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { cloneDeep } from 'lodash'; import { cloneDeep } from 'lodash';
import { memo } from 'react'; import { memo } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2, locationUtil, textUtil } from '@grafana/data'; import { GrafanaTheme2, locationUtil, textUtil } from '@grafana/data';
import { Dropdown, ToolbarButton, useStyles2 } from '@grafana/ui'; import { Dropdown, ToolbarButton, useStyles2 } from '@grafana/ui';

View File

@ -1,5 +1,5 @@
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { UrlQueryMap } from '@grafana/data'; import { UrlQueryMap } from '@grafana/data';
import { locationSearchToObject, locationService } from '@grafana/runtime'; import { locationSearchToObject, locationService } from '@grafana/runtime';

View File

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { ErrorInfo, useEffect } from 'react'; import { ErrorInfo, useEffect } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2, locationUtil, PageLayoutType } from '@grafana/data'; import { GrafanaTheme2, locationUtil, PageLayoutType } from '@grafana/data';
import { Button, ErrorWithStack, useStyles2 } from '@grafana/ui'; import { Button, ErrorWithStack, useStyles2 } from '@grafana/ui';

View File

@ -1,4 +1,4 @@
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { locationService } from '@grafana/runtime'; import { locationService } from '@grafana/runtime';

View File

@ -2,6 +2,7 @@ import { render, renderHook, screen, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { first, noop } from 'lodash'; import { first, noop } from 'lodash';
import { Router } from 'react-router-dom'; import { Router } from 'react-router-dom';
import { CompatRouter } from 'react-router-dom-v5-compat';
import { config, locationService } from '@grafana/runtime'; import { config, locationService } from '@grafana/runtime';
import { contextSrv } from 'app/core/core'; import { contextSrv } from 'app/core/core';
@ -347,7 +348,9 @@ describe('Policy', () => {
const renderPolicy = (element: JSX.Element) => const renderPolicy = (element: JSX.Element) =>
render( render(
<Router history={locationService.getHistory()}> <Router history={locationService.getHistory()}>
<AlertmanagerProvider accessType="notification">{element}</AlertmanagerProvider> <CompatRouter>
<AlertmanagerProvider accessType="notification">{element}</AlertmanagerProvider>
</CompatRouter>
</Router> </Router>
); );

View File

@ -1,5 +1,6 @@
import { render, screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { render } from 'test/test-utils';
import { PanelModel } from 'app/features/dashboard/state'; import { PanelModel } from 'app/features/dashboard/state';
import { createDashboardModelFixture } from 'app/features/dashboard/state/__fixtures__/dashboardFixtures'; import { createDashboardModelFixture } from 'app/features/dashboard/state/__fixtures__/dashboardFixtures';
@ -16,12 +17,6 @@ jest.mock('app/types', () => {
}; };
}); });
jest.mock('react-router-dom', () => ({
useLocation: () => ({
pathname: 'localhost:3000/example/path',
}),
}));
jest.spyOn(analytics, 'logInfo'); jest.spyOn(analytics, 'logInfo');
jest.mock('react-use', () => ({ jest.mock('react-use', () => ({

View File

@ -1,4 +1,4 @@
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { useAsync } from 'react-use'; import { useAsync } from 'react-use';
import { urlUtil } from '@grafana/data'; import { urlUtil } from '@grafana/data';

View File

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { useCallback, useEffect, useMemo, useState } from 'react'; import { useCallback, useEffect, useMemo, useState } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { useAsyncFn, useInterval } from 'react-use'; import { useAsyncFn, useInterval } from 'react-use';
import { GrafanaTheme2, urlUtil } from '@grafana/data'; import { GrafanaTheme2, urlUtil } from '@grafana/data';

View File

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { useCallback, useEffect, useMemo, useState } from 'react'; import { useCallback, useEffect, useMemo, useState } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { useAsyncFn, useInterval, useMeasure } from 'react-use'; import { useAsyncFn, useInterval, useMeasure } from 'react-use';
import { GrafanaTheme2, urlUtil } from '@grafana/data'; import { GrafanaTheme2, urlUtil } from '@grafana/data';

View File

@ -1,7 +1,7 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import pluralize from 'pluralize'; import pluralize from 'pluralize';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2, urlUtil } from '@grafana/data'; import { GrafanaTheme2, urlUtil } from '@grafana/data';
import { LinkButton, LoadingPlaceholder, Pagination, Spinner, Text, useStyles2 } from '@grafana/ui'; import { LinkButton, LoadingPlaceholder, Pagination, Spinner, Text, useStyles2 } from '@grafana/ui';

View File

@ -1,6 +1,6 @@
import { css, cx } from '@emotion/css'; import { css, cx } from '@emotion/css';
import { useState } from 'react'; import { useState } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2 } from '@grafana/data'; import { GrafanaTheme2 } from '@grafana/data';
import { LinkButton, Stack, useStyles2 } from '@grafana/ui'; import { LinkButton, Stack, useStyles2 } from '@grafana/ui';

View File

@ -1,11 +1,9 @@
import { render, waitFor } from '@testing-library/react'; import { waitFor } from '@testing-library/react';
import { Provider } from 'react-redux'; import { render } from 'test/test-utils';
import { Router } from 'react-router-dom';
import { byRole } from 'testing-library-selector'; import { byRole } from 'testing-library-selector';
import { locationService, setPluginExtensionsHook } from '@grafana/runtime'; import { setPluginExtensionsHook } from '@grafana/runtime';
import { contextSrv } from 'app/core/services/context_srv'; import { contextSrv } from 'app/core/services/context_srv';
import { configureStore } from 'app/store/configureStore';
import { AccessControlAction } from 'app/types'; import { AccessControlAction } from 'app/types';
import { CombinedRuleNamespace } from 'app/types/unified-alerting'; import { CombinedRuleNamespace } from 'app/types/unified-alerting';
@ -101,15 +99,7 @@ describe('RuleListGroupView', () => {
}); });
function renderRuleList(namespaces: CombinedRuleNamespace[]) { function renderRuleList(namespaces: CombinedRuleNamespace[]) {
const store = configureStore(); render(<RuleListGroupView namespaces={namespaces} expandAll />);
render(
<Provider store={store}>
<Router history={locationService.getHistory()}>
<RuleListGroupView namespaces={namespaces} expandAll />
</Router>
</Provider>
);
} }
function getGrafanaNamespace(): CombinedRuleNamespace { function getGrafanaNamespace(): CombinedRuleNamespace {

View File

@ -1,5 +1,5 @@
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { locationService } from '@grafana/runtime'; import { locationService } from '@grafana/runtime';

View File

@ -2,6 +2,7 @@ import { renderHook } from '@testing-library/react';
import { createMemoryHistory } from 'history'; import { createMemoryHistory } from 'history';
import * as React from 'react'; import * as React from 'react';
import { MemoryRouter, Router } from 'react-router-dom'; import { MemoryRouter, Router } from 'react-router-dom';
import { CompatRouter } from 'react-router-dom-v5-compat';
import store from 'app/core/store'; import store from 'app/core/store';
import { AlertManagerImplementation } from 'app/plugins/datasource/alertmanager/types'; import { AlertManagerImplementation } from 'app/plugins/datasource/alertmanager/types';
@ -34,7 +35,9 @@ describe('useAlertmanager', () => {
.mockReturnValueOnce({ availableExternalDataSources: [], availableInternalDataSources: [] }); .mockReturnValueOnce({ availableExternalDataSources: [], availableInternalDataSources: [] });
const wrapper = ({ children }: React.PropsWithChildren) => ( const wrapper = ({ children }: React.PropsWithChildren) => (
<MemoryRouter> <MemoryRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider> <CompatRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider>
</CompatRouter>
</MemoryRouter> </MemoryRouter>
); );
@ -50,7 +53,9 @@ describe('useAlertmanager', () => {
const wrapper = ({ children }: React.PropsWithChildren) => ( const wrapper = ({ children }: React.PropsWithChildren) => (
<MemoryRouter> <MemoryRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider> <CompatRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider>
</CompatRouter>
</MemoryRouter> </MemoryRouter>
); );
@ -68,7 +73,9 @@ describe('useAlertmanager', () => {
const wrapper = ({ children }: React.PropsWithChildren) => ( const wrapper = ({ children }: React.PropsWithChildren) => (
<Router history={history}> <Router history={history}>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider> <CompatRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider>
</CompatRouter>
</Router> </Router>
); );
@ -86,7 +93,9 @@ describe('useAlertmanager', () => {
const wrapper = ({ children }: React.PropsWithChildren) => ( const wrapper = ({ children }: React.PropsWithChildren) => (
<Router history={history}> <Router history={history}>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider> <CompatRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider>
</CompatRouter>
</Router> </Router>
); );
@ -101,7 +110,9 @@ describe('useAlertmanager', () => {
const wrapper = ({ children }: React.PropsWithChildren) => ( const wrapper = ({ children }: React.PropsWithChildren) => (
<MemoryRouter> <MemoryRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider> <CompatRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider>
</CompatRouter>
</MemoryRouter> </MemoryRouter>
); );
@ -122,7 +133,9 @@ describe('useAlertmanager', () => {
const wrapper = ({ children }: React.PropsWithChildren) => ( const wrapper = ({ children }: React.PropsWithChildren) => (
<Router history={history}> <Router history={history}>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider> <CompatRouter>
<AlertmanagerProvider accessType="instance">{children}</AlertmanagerProvider>
</CompatRouter>
</Router> </Router>
); );

View File

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { memo, useEffect, useMemo } from 'react'; import { memo, useEffect, useMemo } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import AutoSizer from 'react-virtualized-auto-sizer'; import AutoSizer from 'react-virtualized-auto-sizer';
import { GrafanaTheme2 } from '@grafana/data'; import { GrafanaTheme2 } from '@grafana/data';

View File

@ -1,5 +1,5 @@
import { useState } from 'react'; import { useState } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { config, reportInteraction } from '@grafana/runtime'; import { config, reportInteraction } from '@grafana/runtime';
import { Button, Drawer, Dropdown, Icon, Menu, MenuItem } from '@grafana/ui'; import { Button, Drawer, Dropdown, Icon, Menu, MenuItem } from '@grafana/ui';

View File

@ -1,4 +1,4 @@
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { locationUtil } from '@grafana/data'; import { locationUtil } from '@grafana/data';
import { locationService } from '@grafana/runtime'; import { locationService } from '@grafana/runtime';

View File

@ -1,4 +1,4 @@
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { useAsync } from 'react-use'; import { useAsync } from 'react-use';
import { urlUtil } from '@grafana/data'; import { urlUtil } from '@grafana/data';

View File

@ -1,5 +1,6 @@
import { act, fireEvent, render, screen } from '@testing-library/react'; import { act, fireEvent, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { render } from 'test/test-utils';
import { standardEditorsRegistry, standardFieldConfigEditorRegistry } from '@grafana/data'; import { standardEditorsRegistry, standardFieldConfigEditorRegistry } from '@grafana/data';
import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks';
@ -21,12 +22,6 @@ import { VizPanelManager } from './VizPanelManager';
const OptionsPaneSelector = selectors.components.PanelEditor.OptionsPane; const OptionsPaneSelector = selectors.components.PanelEditor.OptionsPane;
jest.mock('react-router-dom', () => ({
useLocation: () => ({
pathname: '',
}),
}));
standardEditorsRegistry.setInit(getAllOptionEditors); standardEditorsRegistry.setInit(getAllOptionEditors);
standardFieldConfigEditorRegistry.setInit(getAllStandardFieldConfigs); standardFieldConfigEditorRegistry.setInit(getAllStandardFieldConfigs);

View File

@ -1,6 +1,6 @@
import { css, cx } from '@emotion/css'; import { css, cx } from '@emotion/css';
import { useEffect, useMemo } from 'react'; import { useEffect, useMemo } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2, PageLayoutType } from '@grafana/data'; import { GrafanaTheme2, PageLayoutType } from '@grafana/data';
import { useChromeHeaderHeight } from '@grafana/runtime'; import { useChromeHeaderHeight } from '@grafana/runtime';

View File

@ -1,4 +1,4 @@
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { locationUtil, NavModelItem } from '@grafana/data'; import { locationUtil, NavModelItem } from '@grafana/data';
import { SceneObject, SceneObjectState } from '@grafana/scenes'; import { SceneObject, SceneObjectState } from '@grafana/scenes';

View File

@ -1,7 +1,7 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { memo, ReactNode } from 'react'; import { memo, ReactNode } from 'react';
import { connect, ConnectedProps } from 'react-redux'; import { connect, ConnectedProps } from 'react-redux';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { textUtil } from '@grafana/data'; import { textUtil } from '@grafana/data';
import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';

View File

@ -1,6 +1,6 @@
import * as H from 'history'; import * as H from 'history';
import { useEffect, useMemo, useState } from 'react'; import { useEffect, useMemo, useState } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { locationUtil, NavModel, NavModelItem } from '@grafana/data'; import { locationUtil, NavModel, NavModelItem } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors'; import { selectors } from '@grafana/e2e-selectors';

View File

@ -1,20 +1,13 @@
import { render, screen, within } from '@testing-library/react'; import { screen, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { Provider } from 'react-redux'; import { render } from 'test/test-utils';
import { Router } from 'react-router-dom';
import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock';
import { locationService } from '@grafana/runtime';
import { GrafanaContext } from 'app/core/context/GrafanaContext';
import { configureStore } from '../../../../store/configureStore';
import { DashboardModel } from '../../state'; import { DashboardModel } from '../../state';
import { createDashboardModelFixture } from '../../state/__fixtures__/dashboardFixtures'; import { createDashboardModelFixture } from '../../state/__fixtures__/dashboardFixtures';
import { DashboardSettings } from './DashboardSettings'; import { DashboardSettings } from './DashboardSettings';
function setup(dashboard: DashboardModel) { function setup(dashboard: DashboardModel) {
const store = configureStore();
const sectionNav = { const sectionNav = {
main: { text: 'Dashboard' }, main: { text: 'Dashboard' },
node: { node: {
@ -24,13 +17,7 @@ function setup(dashboard: DashboardModel) {
// Need to use DashboardSettings here as it's responsible for fetching the state back from location // Need to use DashboardSettings here as it's responsible for fetching the state back from location
return render( return render(
<GrafanaContext.Provider value={getGrafanaContextMock()}> <DashboardSettings editview="links" dashboard={dashboard} sectionNav={sectionNav} pageNav={sectionNav.node} />
<Provider store={store}>
<Router history={locationService.getHistory()}>
<DashboardSettings editview="links" dashboard={dashboard} sectionNav={sectionNav} pageNav={sectionNav.node} />
</Router>
</Provider>
</GrafanaContext.Provider>
); );
} }

View File

@ -1,6 +1,6 @@
import { useState } from 'react'; import { useState } from 'react';
import { connect, MapStateToProps } from 'react-redux'; import { connect, MapStateToProps } from 'react-redux';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { PanelPlugin } from '@grafana/data'; import { PanelPlugin } from '@grafana/data';
import { locationService } from '@grafana/runtime'; import { locationService } from '@grafana/runtime';

View File

@ -1,6 +1,7 @@
import { fireEvent, render, screen, within } from '@testing-library/react'; import { fireEvent, screen, within } from '@testing-library/react';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import configureMockStore from 'redux-mock-store'; import configureMockStore from 'redux-mock-store';
import { render } from 'test/test-utils';
import { import {
FieldConfigSource, FieldConfigSource,

View File

@ -1,26 +1,22 @@
import { render, screen, waitFor } from '@testing-library/react'; import { screen, waitFor } from '@testing-library/react';
import { KBarProvider } from 'kbar'; import { KBarProvider } from 'kbar';
import { Component } from 'react'; import { Component } from 'react';
import { Provider } from 'react-redux'; import { match } from 'react-router-dom';
import { match, Router } from 'react-router-dom';
import { useEffectOnce } from 'react-use'; import { useEffectOnce } from 'react-use';
import { mockToolkitActionCreator } from 'test/core/redux/mocks'; import { mockToolkitActionCreator } from 'test/core/redux/mocks';
import { TestProvider } from 'test/helpers/TestProvider'; import { render } from 'test/test-utils';
import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock';
import { createTheme } from '@grafana/data'; import { createTheme } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors'; import { selectors } from '@grafana/e2e-selectors';
import { config, locationService, setDataSourceSrv } from '@grafana/runtime'; import { config, setDataSourceSrv } from '@grafana/runtime';
import { Dashboard } from '@grafana/schema'; import { Dashboard } from '@grafana/schema';
import { notifyApp } from 'app/core/actions'; import { notifyApp } from 'app/core/actions';
import { AppChrome } from 'app/core/components/AppChrome/AppChrome'; import { AppChrome } from 'app/core/components/AppChrome/AppChrome';
import { GrafanaContext } from 'app/core/context/GrafanaContext';
import { getRouteComponentProps } from 'app/core/navigation/__mocks__/routeProps'; import { getRouteComponentProps } from 'app/core/navigation/__mocks__/routeProps';
import { RouteDescriptor } from 'app/core/navigation/types'; import { RouteDescriptor } from 'app/core/navigation/types';
import { HOME_NAV_ID } from 'app/core/reducers/navModel'; import { HOME_NAV_ID } from 'app/core/reducers/navModel';
import { DashboardInitPhase, DashboardMeta, DashboardRoutes } from 'app/types'; import { DashboardInitPhase, DashboardMeta, DashboardRoutes } from 'app/types';
import { configureStore } from '../../../store/configureStore';
import { Props as LazyLoaderProps } from '../dashgrid/LazyLoader'; import { Props as LazyLoaderProps } from '../dashgrid/LazyLoader';
import { DashboardSrv, setDashboardSrv } from '../services/DashboardSrv'; import { DashboardSrv, setDashboardSrv } from '../services/DashboardSrv';
import { DashboardModel } from '../state'; import { DashboardModel } from '../state';
@ -103,7 +99,6 @@ function setup(propOverrides?: Partial<Props>) {
}, },
]; ];
const store = configureStore();
const props: Props = { const props: Props = {
...getRouteComponentProps({ ...getRouteComponentProps({
match: { params: { slug: 'my-dash', uid: '11' } } as unknown as match, match: { params: { slug: 'my-dash', uid: '11' } } as unknown as match,
@ -130,29 +125,11 @@ function setup(propOverrides?: Partial<Props>) {
Object.assign(props, propOverrides); Object.assign(props, propOverrides);
const context = getGrafanaContextMock(); const { unmount, rerender } = render(<UnthemedDashboardPage {...props} />);
const { unmount, rerender } = render(
<GrafanaContext.Provider value={context}>
<Provider store={store}>
<Router history={locationService.getHistory()}>
<UnthemedDashboardPage {...props} />
</Router>
</Provider>
</GrafanaContext.Provider>
);
const wrappedRerender = (newProps: Partial<Props>) => { const wrappedRerender = (newProps: Partial<Props>) => {
Object.assign(props, newProps); Object.assign(props, newProps);
return rerender( return rerender(<UnthemedDashboardPage {...props} />);
<GrafanaContext.Provider value={context}>
<Provider store={store}>
<Router history={locationService.getHistory()}>
<UnthemedDashboardPage {...props} />
</Router>
</Provider>
</GrafanaContext.Provider>
);
}; };
return { rerender: wrappedRerender, unmount }; return { rerender: wrappedRerender, unmount };
@ -190,7 +167,7 @@ describe('DashboardPage', () => {
it('only calls initDashboard once when wrapped in AppChrome', async () => { it('only calls initDashboard once when wrapped in AppChrome', async () => {
const props: Props = { const props: Props = {
...getRouteComponentProps({ ...getRouteComponentProps({
match: { params: { slug: 'my-dash', uid: '11' } } as unknown as match, match: { params: { slug: 'my-dash', uid: '11' }, isExact: true, path: '', url: '' },
route: { routeName: DashboardRoutes.Normal } as RouteDescriptor, route: { routeName: DashboardRoutes.Normal } as RouteDescriptor,
}), }),
navIndex: { navIndex: {
@ -214,11 +191,9 @@ describe('DashboardPage', () => {
render( render(
<KBarProvider> <KBarProvider>
<TestProvider> <AppChrome>
<AppChrome> <UnthemedDashboardPage {...props} />
<UnthemedDashboardPage {...props} /> </AppChrome>
</AppChrome>
</TestProvider>
</KBarProvider> </KBarProvider>
); );

View File

@ -1,16 +1,12 @@
import { act, render, screen, waitFor } from '@testing-library/react'; import { act, screen, waitFor } from '@testing-library/react';
import { Provider } from 'react-redux';
import { Router } from 'react-router-dom';
import { Props } from 'react-virtualized-auto-sizer'; import { Props } from 'react-virtualized-auto-sizer';
import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock'; import { render } from 'test/test-utils';
import { config, locationService } from '@grafana/runtime'; import { config, locationService } from '@grafana/runtime';
import { GrafanaContext } from 'app/core/context/GrafanaContext';
import { import {
HOME_DASHBOARD_CACHE_KEY, HOME_DASHBOARD_CACHE_KEY,
getDashboardScenePageStateManager, getDashboardScenePageStateManager,
} from 'app/features/dashboard-scene/pages/DashboardScenePageStateManager'; } from 'app/features/dashboard-scene/pages/DashboardScenePageStateManager';
import { configureStore } from 'app/store/configureStore';
import { DashboardDTO, DashboardRoutes } from 'app/types'; import { DashboardDTO, DashboardRoutes } from 'app/types';
import DashboardPageProxy, { DashboardPageProxyProps } from './DashboardPageProxy'; import DashboardPageProxy, { DashboardPageProxyProps } from './DashboardPageProxy';
@ -84,24 +80,15 @@ jest.mock('app/features/dashboard/api/dashboard_api', () => ({
})); }));
function setup(props: Partial<DashboardPageProxyProps>) { function setup(props: Partial<DashboardPageProxyProps>) {
const context = getGrafanaContextMock();
const store = configureStore({});
return render( return render(
<GrafanaContext.Provider value={context}> <DashboardPageProxy
<Provider store={store}> location={locationService.getLocation()}
<Router history={locationService.getHistory()}> history={locationService.getHistory()}
<DashboardPageProxy queryParams={{}}
location={locationService.getLocation()} route={{ routeName: DashboardRoutes.Home, component: () => null, path: '/' }}
history={locationService.getHistory()} match={{ params: {}, isExact: true, path: '/', url: '/' }}
queryParams={{}} {...props}
route={{ routeName: DashboardRoutes.Home, component: () => null, path: '/' }} />
match={{ params: {}, isExact: true, path: '/', url: '/' }}
{...props}
/>
</Router>
</Provider>
</GrafanaContext.Provider>
); );
} }

View File

@ -1,30 +1,20 @@
import { render, screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import { Provider } from 'react-redux'; import { render } from 'test/test-utils';
import { Router } from 'react-router-dom';
import { locationService } from '@grafana/runtime';
import { configureStore } from 'app/store/configureStore';
import { getMockDataSources } from '../__mocks__'; import { getMockDataSources } from '../__mocks__';
import { DataSourcesListView } from './DataSourcesList'; import { DataSourcesListView } from './DataSourcesList';
const setup = () => { const setup = () => {
const store = configureStore();
return render( return render(
<Provider store={store}> <DataSourcesListView
<Router history={locationService.getHistory()}> dataSources={getMockDataSources(3)}
<DataSourcesListView dataSourcesCount={3}
dataSources={getMockDataSources(3)} isLoading={false}
dataSourcesCount={3} hasCreateRights={true}
isLoading={false} hasWriteRights={true}
hasCreateRights={true} hasExploreRights={true}
hasWriteRights={true} />
hasExploreRights={true}
/>
</Router>
</Provider>
); );
}; };

View File

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { DataSourceSettings, GrafanaTheme2 } from '@grafana/data'; import { DataSourceSettings, GrafanaTheme2 } from '@grafana/data';
import { config } from '@grafana/runtime'; import { config } from '@grafana/runtime';

View File

@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { AppEvents } from '@grafana/data'; import { AppEvents } from '@grafana/data';
import { config, locationService } from '@grafana/runtime'; import { config, locationService } from '@grafana/runtime';

View File

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import * as React from 'react'; import * as React from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaTheme2, NavModelItem } from '@grafana/data'; import { GrafanaTheme2, NavModelItem } from '@grafana/data';
import { config } from '@grafana/runtime'; import { config } from '@grafana/runtime';

View File

@ -1,4 +1,4 @@
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { config } from '@grafana/runtime'; import { config } from '@grafana/runtime';
import { EmptyState, Grid } from '@grafana/ui'; import { EmptyState, Grid } from '@grafana/ui';

View File

@ -1,5 +1,5 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { GrafanaPlugin, NavModelItem, PluginIncludeType, PluginType } from '@grafana/data'; import { GrafanaPlugin, NavModelItem, PluginIncludeType, PluginType } from '@grafana/data';
import { config } from '@grafana/runtime'; import { config } from '@grafana/runtime';

View File

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { ReactElement } from 'react'; import { ReactElement } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom-v5-compat';
import { SelectableValue, GrafanaTheme2, PluginType } from '@grafana/data'; import { SelectableValue, GrafanaTheme2, PluginType } from '@grafana/data';
import { locationSearchToObject } from '@grafana/runtime'; import { locationSearchToObject } from '@grafana/runtime';