mirror of https://github.com/grafana/grafana
SoloPanel: Avoid fatal error when panelId correspond to a row (#90271)
parent
612ebf5508
commit
51fab9adf4
@ -0,0 +1,133 @@ |
||||
import { renderHook } from '@testing-library/react'; |
||||
|
||||
import { DataSourceRef } from '@grafana/schema'; |
||||
|
||||
import { transformSaveModelToScene } from '../serialization/transformSaveModelToScene'; |
||||
import { findVizPanelByKey } from '../utils/utils'; |
||||
|
||||
import { useSoloPanel } from './useSoloPanel'; |
||||
|
||||
jest.mock('@grafana/runtime', () => ({ |
||||
...jest.requireActual('@grafana/runtime'), |
||||
getDataSourceSrv: () => ({ |
||||
get: async (ref: DataSourceRef) => { |
||||
// Mocking the build in Grafana data source to avoid annotations data layer errors.
|
||||
return { |
||||
id: 1, |
||||
uid: '-- Grafana --', |
||||
name: 'grafana', |
||||
type: 'grafana', |
||||
meta: { |
||||
id: 'grafana', |
||||
}, |
||||
}; |
||||
}, |
||||
}), |
||||
})); |
||||
|
||||
describe('useSoloPanel', () => { |
||||
it('should return undefined panel and error when panel is not found', () => { |
||||
const { dashboard } = setup(); |
||||
const { result } = renderHook(() => useSoloPanel(dashboard, 'foo-key')); |
||||
|
||||
expect(result.current[0]).toBeUndefined(); |
||||
expect(result.current[1]).toBe('Panel not found'); |
||||
}); |
||||
|
||||
it('should return the panel when panel is found', () => { |
||||
const { dashboard } = setup(); |
||||
|
||||
const { result } = renderHook(() => useSoloPanel(dashboard, 'panel-1')); |
||||
const panel = findVizPanelByKey(dashboard, 'panel-1'); |
||||
|
||||
expect(result.current[0]).toEqual(panel); |
||||
expect(result.current[1]).toBeUndefined(); |
||||
}); |
||||
|
||||
it('should return the cloned panel when panel is found', () => { |
||||
const { dashboard } = setup(); |
||||
const { result } = renderHook(() => useSoloPanel(dashboard, 'panel-1_clone')); |
||||
const panel = findVizPanelByKey(dashboard, 'panel-1'); |
||||
|
||||
expect(result.current[0]).not.toBe(panel); |
||||
expect(result.current[1]).toBeUndefined(); |
||||
}); |
||||
|
||||
it('should return error when panelId correspond to a non VizPanel', () => { |
||||
const { dashboard } = setup(); |
||||
const { result } = renderHook(() => useSoloPanel(dashboard, 'panel-2')); |
||||
|
||||
expect(result.current[0]).toBeUndefined(); |
||||
expect(result.current[1]).toBe('Panel not found'); |
||||
}); |
||||
}); |
||||
|
||||
const setup = () => { |
||||
const dashboard = transformSaveModelToScene({ dashboard: TEST_DASHBOARD, meta: {} }); |
||||
|
||||
return { dashboard }; |
||||
}; |
||||
|
||||
const TEST_DASHBOARD = { |
||||
title: 'Scenes/PanelEdit/Queries: Edit', |
||||
annotations: { |
||||
list: [], |
||||
}, |
||||
editable: true, |
||||
fiscalYearStartMonth: 0, |
||||
graphTooltip: 0, |
||||
id: 2378, |
||||
links: [], |
||||
liveNow: false, |
||||
panels: [ |
||||
{ |
||||
type: 'timeseries', |
||||
datasource: 'prometheus', |
||||
fieldConfig: { |
||||
defaults: { |
||||
custom: {}, |
||||
}, |
||||
overrides: [], |
||||
}, |
||||
gridPos: { |
||||
h: 9, |
||||
w: 24, |
||||
x: 0, |
||||
y: 0, |
||||
}, |
||||
id: 1, |
||||
options: { |
||||
colorMode: 'background', |
||||
graphMode: 'area', |
||||
justifyMode: 'auto', |
||||
orientation: 'auto', |
||||
reduceOptions: { |
||||
calcs: ['lastNotNull', 'last', 'first', 'min', 'max', 'mean', 'sum', 'count'], |
||||
fields: '', |
||||
values: false, |
||||
}, |
||||
text: {}, |
||||
}, |
||||
pluginVersion: '8.0.3', |
||||
}, |
||||
{ |
||||
id: 2, |
||||
type: 'row', |
||||
}, |
||||
], |
||||
refresh: '', |
||||
schemaVersion: 39, |
||||
tags: [], |
||||
templating: { |
||||
list: [], |
||||
}, |
||||
time: { |
||||
from: 'now-6h', |
||||
to: 'now', |
||||
}, |
||||
timepicker: {}, |
||||
timezone: '', |
||||
uid: 'ffbe00e2-803c-4d49-adb7-41aad336234f', |
||||
version: 6, |
||||
weekStart: '', |
||||
}; |
||||
Loading…
Reference in new issue