grafana_bak/public/app/features/dashboard-scene/utils/dashboardSceneGraph.test.ts
2025-04-01 10:38:02 +09:00

146 lines
4.6 KiB
TypeScript

import { SceneGridLayout, SceneQueryRunner, SceneTimeRange, VizPanel, behaviors } from '@grafana/scenes';
import { DashboardCursorSync } from '@grafana/schema';
import { DashboardAnnotationsDataLayer } from '../scene/DashboardAnnotationsDataLayer';
import { DashboardControls } from '../scene/DashboardControls';
import { DashboardDataLayerSet } from '../scene/DashboardDataLayerSet';
import { DashboardScene, DashboardSceneState } from '../scene/DashboardScene';
import { VizPanelLinks, VizPanelLinksMenu } from '../scene/PanelLinks';
import { DashboardGridItem } from '../scene/layout-default/DashboardGridItem';
import { DefaultGridLayoutManager } from '../scene/layout-default/DefaultGridLayoutManager';
import { dashboardSceneGraph, getNextPanelId } from './dashboardSceneGraph';
import { findVizPanelByKey } from './utils';
describe('dashboardSceneGraph', () => {
describe('getPanelLinks', () => {
it('should return null if no links object defined', () => {
const scene = buildTestScene();
const panelWithNoLinks = findVizPanelByKey(scene, 'panel-1')!;
expect(dashboardSceneGraph.getPanelLinks(panelWithNoLinks)).toBeNull();
});
it('should resolve VizPanelLinks object', () => {
const scene = buildTestScene();
const panelWithNoLinks = findVizPanelByKey(scene, 'panel-2')!;
expect(dashboardSceneGraph.getPanelLinks(panelWithNoLinks)).toBeInstanceOf(VizPanelLinks);
});
});
describe('getDataLayers', () => {
let scene: DashboardScene;
beforeEach(async () => {
scene = buildTestScene();
});
it('should return the scene data layers', () => {
const dataLayers = dashboardSceneGraph.getDataLayers(scene);
expect(dataLayers).toBeInstanceOf(DashboardDataLayerSet);
expect(dataLayers?.state.annotationLayers.length).toBe(1);
});
it('should throw if there are no scene data layers', () => {
scene.setState({
$data: undefined,
});
expect(() => dashboardSceneGraph.getDataLayers(scene)).toThrow('DashboardDataLayerSet not found');
});
});
describe('getCursorSync', () => {
it('should return cursor sync behavior', () => {
const scene = buildTestScene();
const cursorSync = dashboardSceneGraph.getCursorSync(scene);
expect(cursorSync).toBeInstanceOf(behaviors.CursorSync);
});
it('should return undefined if no cursor sync behavior', () => {
const scene = buildTestScene();
scene.setState({ $behaviors: [] });
const cursorSync = dashboardSceneGraph.getCursorSync(scene);
expect(cursorSync).toBeUndefined();
});
});
describe('getNextPanelId', () => {
it('should get next panel id in a simple 3 panel layout', () => {
const scene = buildTestScene();
const id = getNextPanelId(scene);
expect(id).toBe(3);
});
it('should return 1 if no panels are found', () => {
const scene = buildTestScene();
const grid = scene.state.body as DefaultGridLayoutManager;
grid.state.grid.setState({ children: [] });
const id = getNextPanelId(scene);
expect(id).toBe(1);
});
});
});
function buildTestScene(overrides?: Partial<DashboardSceneState>) {
const scene = new DashboardScene({
title: 'hello',
uid: 'dash-1',
$timeRange: new SceneTimeRange({}),
controls: new DashboardControls({}),
$behaviors: [
new behaviors.CursorSync({
sync: DashboardCursorSync.Crosshair,
}),
],
$data: new DashboardDataLayerSet({
annotationLayers: [
new DashboardAnnotationsDataLayer({
key: `annotation`,
query: {
enable: true,
hide: false,
iconColor: 'red',
name: 'a',
},
name: 'a',
isEnabled: true,
isHidden: false,
}),
],
}),
body: new DefaultGridLayoutManager({
grid: new SceneGridLayout({
children: [
new DashboardGridItem({
key: 'griditem-1',
x: 0,
body: new VizPanel({
title: 'Panel A',
key: 'panel-1',
pluginId: 'table',
$data: new SceneQueryRunner({ key: 'data-query-runner', queries: [{ refId: 'A' }] }),
}),
}),
new DashboardGridItem({
body: new VizPanel({
title: 'Panel D',
key: 'panel-2',
pluginId: 'table',
$data: new SceneQueryRunner({ key: 'data-query-runner3', queries: [{ refId: 'A' }] }),
titleItems: [new VizPanelLinks({ menu: new VizPanelLinksMenu({}) })],
}),
}),
],
}),
}),
...overrides,
});
return scene;
}