grafana/public/app/features/dashboard/containers/SoloPanelPage.test.tsx
Torkel Ödegaard b8e72d6173
TopNav: KioskMode rewrite move to AppChrome responsibility and make it a global feature (#55149)
* Initial progress

* Moving keybindingSrv to context

* Simplfy KioskMode

* Removed unused logic

* Make kiosk=tv behave as before but when topnav is enabled

* Minor fix

* Fixing tests

* Fixing bug with notice when entering kiosk mode

* Fixed test
2022-09-15 14:04:58 +02:00

165 lines
5.4 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import React from 'react';
import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock';
import { GrafanaContext } from 'app/core/context/GrafanaContext';
import { DashboardMeta, DashboardRoutes } from 'app/types';
import { getRouteComponentProps } from '../../../core/navigation/__mocks__/routeProps';
import { Props as DashboardPanelProps } from '../dashgrid/DashboardPanel';
import { DashboardModel } from '../state';
import { Props, SoloPanelPage } from './SoloPanelPage';
jest.mock('app/features/dashboard/components/DashboardSettings/GeneralSettings', () => ({}));
jest.mock('app/features/dashboard/dashgrid/DashboardPanel', () => {
class DashboardPanel extends React.Component<DashboardPanelProps> {
render() {
// In this test we only check whether a new panel has arrived in the props
return <>{this.props.panel?.title}</>;
}
}
return { DashboardPanel };
});
interface ScenarioContext {
dashboard?: DashboardModel | null;
secondaryDashboard?: DashboardModel | null;
setDashboard: (overrides?: any, metaOverrides?: Partial<DashboardMeta>) => void;
setSecondaryDashboard: (overrides?: any, metaOverrides?: Partial<DashboardMeta>) => void;
mount: (propOverrides?: Partial<Props>) => void;
rerender: (propOverrides?: Partial<Props>) => void;
setup: (fn: () => void) => void;
}
function getTestDashboard(overrides?: any, metaOverrides?: Partial<DashboardMeta>): DashboardModel {
const data = Object.assign(
{
title: 'My dashboard',
panels: [
{
id: 1,
type: 'graph',
title: 'My graph',
gridPos: { x: 0, y: 0, w: 1, h: 1 },
},
],
},
overrides
);
const meta = Object.assign({ canSave: true, canEdit: true }, metaOverrides);
return new DashboardModel(data, meta);
}
function soloPanelPageScenario(description: string, scenarioFn: (ctx: ScenarioContext) => void) {
describe(description, () => {
let setupFn: () => void;
const ctx: ScenarioContext = {
setup: (fn) => {
setupFn = fn;
},
setDashboard: (overrides?: any, metaOverrides?: Partial<DashboardMeta>) => {
ctx.dashboard = getTestDashboard(overrides, metaOverrides);
},
setSecondaryDashboard: (overrides?: any, metaOverrides?: Partial<DashboardMeta>) => {
ctx.secondaryDashboard = getTestDashboard(overrides, metaOverrides);
},
mount: (propOverrides?: Partial<Props>) => {
const props: Props = {
...getRouteComponentProps({
match: {
params: { slug: 'my-dash', uid: '11' },
} as any,
queryParams: {
panelId: '1',
},
route: { routeName: DashboardRoutes.Normal } as any,
}),
initDashboard: jest.fn(),
dashboard: null,
};
Object.assign(props, propOverrides);
ctx.dashboard = props.dashboard;
const context = getGrafanaContextMock();
const renderPage = (props: Props) => (
<GrafanaContext.Provider value={context}>
<SoloPanelPage {...props} />
</GrafanaContext.Provider>
);
let { rerender } = render(renderPage(props));
// prop updates will be submitted by rerendering the same component with different props
ctx.rerender = (newProps?: Partial<Props>) => {
rerender(renderPage(Object.assign(props, newProps)));
};
},
rerender: () => {
// will be replaced while mount() is called
},
};
beforeEach(() => {
setupFn();
});
scenarioFn(ctx);
});
}
describe('SoloPanelPage', () => {
soloPanelPageScenario('Given initial state', (ctx) => {
ctx.setup(() => {
ctx.mount();
});
it('Should render nothing', () => {
expect(screen.queryByText(/Loading/)).not.toBeNull();
});
});
soloPanelPageScenario('Dashboard init completed ', (ctx) => {
ctx.setup(() => {
// Needed for AutoSizer to work in test
Object.defineProperty(HTMLElement.prototype, 'offsetHeight', { configurable: true, value: 500 });
Object.defineProperty(HTMLElement.prototype, 'offsetWidth', { configurable: true, value: 500 });
ctx.mount();
ctx.setDashboard();
expect(ctx.dashboard).not.toBeNull();
// the componentDidMount will change the dashboard prop to the new dashboard
// emulate this by rerendering with new props
ctx.rerender({ dashboard: ctx.dashboard });
});
it('Should render dashboard grid', async () => {
// check if the panel title has arrived in the DashboardPanel mock
expect(screen.queryByText(/My graph/)).not.toBeNull();
});
});
soloPanelPageScenario('When user navigates to other SoloPanelPage', (ctx) => {
ctx.setup(() => {
ctx.mount();
ctx.setDashboard({ uid: 1, panels: [{ id: 1, type: 'graph', title: 'Panel 1' }] });
ctx.setSecondaryDashboard({ uid: 2, panels: [{ id: 1, type: 'graph', title: 'Panel 2' }] });
});
it('Should show other graph', () => {
// check that the title in the DashboardPanel has changed
ctx.rerender({ dashboard: ctx.dashboard });
expect(screen.queryByText(/Panel 1/)).not.toBeNull();
ctx.rerender({ dashboard: ctx.secondaryDashboard });
expect(screen.queryByText(/Panel 1/)).toBeNull();
expect(screen.queryByText(/Panel 2/)).not.toBeNull();
});
});
});