mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
136 lines
3.7 KiB
TypeScript
136 lines
3.7 KiB
TypeScript
import { PanelModel } from '@grafana/data';
|
|
import { FieldColorModeId, ThresholdsMode } from '@grafana/schema/src';
|
|
|
|
import { DashboardModel } from '../state/DashboardModel';
|
|
import { createDashboardModelFixture, createPanelJSONFixture } from '../state/__fixtures__/dashboardFixtures';
|
|
|
|
describe('Merge dashboard panels', () => {
|
|
describe('simple changes', () => {
|
|
let dashboard: DashboardModel;
|
|
let rawPanels: PanelModel[];
|
|
|
|
beforeEach(() => {
|
|
dashboard = createDashboardModelFixture({
|
|
title: 'simple title',
|
|
panels: [
|
|
createPanelJSONFixture({
|
|
id: 1,
|
|
type: 'timeseries',
|
|
}),
|
|
createPanelJSONFixture({
|
|
id: 2,
|
|
type: 'timeseries',
|
|
}),
|
|
createPanelJSONFixture({
|
|
id: 3,
|
|
type: 'table',
|
|
fieldConfig: {
|
|
defaults: {
|
|
thresholds: {
|
|
mode: ThresholdsMode.Absolute,
|
|
steps: [
|
|
{ color: 'green', value: -Infinity }, // save model has this as null
|
|
{ color: 'red', value: 80 },
|
|
],
|
|
},
|
|
mappings: [],
|
|
color: { mode: FieldColorModeId.Thresholds },
|
|
},
|
|
overrides: [],
|
|
},
|
|
}),
|
|
],
|
|
});
|
|
rawPanels = dashboard.getSaveModelClone().panels;
|
|
});
|
|
|
|
it('should load and support noop', () => {
|
|
expect(dashboard.title).toBe('simple title');
|
|
expect(dashboard.panels.length).toEqual(rawPanels.length);
|
|
|
|
const info = dashboard.updatePanels(rawPanels);
|
|
expect(info.changed).toBeFalsy();
|
|
expect(info.actions).toMatchInlineSnapshot(`
|
|
{
|
|
"add": [],
|
|
"noop": [
|
|
1,
|
|
2,
|
|
3,
|
|
],
|
|
"remove": [],
|
|
"replace": [],
|
|
"update": [],
|
|
}
|
|
`);
|
|
});
|
|
|
|
it('should identify an add', () => {
|
|
rawPanels.push({
|
|
id: 7,
|
|
type: 'canvas',
|
|
} as PanelModel);
|
|
|
|
const info = dashboard.updatePanels(rawPanels);
|
|
expect(info.changed).toBeTruthy();
|
|
expect(info.actions['add']).toEqual([7]);
|
|
});
|
|
|
|
it('should identify a remove', () => {
|
|
rawPanels.shift();
|
|
|
|
const info = dashboard.updatePanels(rawPanels);
|
|
expect(info.changed).toBeTruthy();
|
|
expect(info.actions['remove']).toEqual([1]);
|
|
});
|
|
|
|
it('should allow change in key order for nested elements', () => {
|
|
rawPanels[2].fieldConfig = {
|
|
defaults: {
|
|
color: { mode: 'thresholds' },
|
|
mappings: [],
|
|
thresholds: {
|
|
steps: [
|
|
{ color: 'green', value: -Infinity },
|
|
{ color: 'red', value: 80 },
|
|
],
|
|
mode: ThresholdsMode.Absolute,
|
|
},
|
|
},
|
|
overrides: [],
|
|
};
|
|
|
|
// Same config, different order
|
|
const js0 = JSON.stringify(dashboard.panels[2].fieldConfig);
|
|
const js1 = JSON.stringify(rawPanels[2].fieldConfig);
|
|
expect(js1).not.toEqual(js0);
|
|
expect(js1.length).toEqual(js0.length);
|
|
|
|
// no real changes here
|
|
const info = dashboard.updatePanels(rawPanels);
|
|
expect(info.changed).toBeFalsy();
|
|
});
|
|
|
|
it('should replace a type change', () => {
|
|
rawPanels[1].type = 'canvas';
|
|
|
|
const info = dashboard.updatePanels(rawPanels);
|
|
expect(info.changed).toBeTruthy();
|
|
expect(info.actions).toMatchInlineSnapshot(`
|
|
{
|
|
"add": [],
|
|
"noop": [
|
|
1,
|
|
3,
|
|
],
|
|
"remove": [],
|
|
"replace": [
|
|
2,
|
|
],
|
|
"update": [],
|
|
}
|
|
`);
|
|
});
|
|
});
|
|
});
|