mirror of https://github.com/grafana/grafana
[v11.0.x] Dashboard scene: Discard panel changes disabled/enabled depending of changes (#87570)
* DashboardScene: Discard panel changes disabled/enabled depending of changes (#87137)
---------
Co-authored-by: Ivan Ortega Alba <ivanortegaalba@gmail.com>
Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
(cherry picked from commit c3936bbae2
)
* Add line number
---------
Co-authored-by: Oscar Kilhed <oscar.kilhed@grafana.com>
pull/87612/head
parent
67aa2aa826
commit
e260d13a65
@ -0,0 +1,423 @@ |
|||||||
|
import { Dashboard, Panel } from '@grafana/schema'; |
||||||
|
|
||||||
|
import { getDashboardChanges, getPanelChanges } from './getDashboardChanges'; |
||||||
|
|
||||||
|
describe('getDashboardChanges', () => { |
||||||
|
const initial: Dashboard = { |
||||||
|
id: 1, |
||||||
|
title: 'Dashboard 1', |
||||||
|
time: { |
||||||
|
from: 'now-7d', |
||||||
|
to: 'now', |
||||||
|
}, |
||||||
|
refresh: '1h', |
||||||
|
version: 1, |
||||||
|
schemaVersion: 1, |
||||||
|
templating: { |
||||||
|
list: [ |
||||||
|
{ |
||||||
|
name: 'var1', |
||||||
|
type: 'query', |
||||||
|
query: 'query1', |
||||||
|
current: { |
||||||
|
value: 'value1', |
||||||
|
text: 'text1', |
||||||
|
}, |
||||||
|
options: [], |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
}; |
||||||
|
it('should return the correct result when no changes', () => { |
||||||
|
const changed = { ...initial }; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...changed, |
||||||
|
}, |
||||||
|
diffs: {}, |
||||||
|
diffCount: 0, |
||||||
|
hasChanges: false, |
||||||
|
hasTimeChanges: false, |
||||||
|
isNew: false, |
||||||
|
hasVariableValueChanges: false, |
||||||
|
hasRefreshChange: false, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(initial, changed, false, false, false); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when is new', () => { |
||||||
|
const newDashInitial = { |
||||||
|
...initial, |
||||||
|
version: 0, |
||||||
|
}; |
||||||
|
const changed = { |
||||||
|
...newDashInitial, |
||||||
|
version: 0, |
||||||
|
}; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
changedSaveModel: { |
||||||
|
...newDashInitial, |
||||||
|
}, |
||||||
|
initialSaveModel: { |
||||||
|
...changed, |
||||||
|
}, |
||||||
|
diffs: {}, |
||||||
|
diffCount: 0, |
||||||
|
hasChanges: false, |
||||||
|
hasTimeChanges: false, |
||||||
|
isNew: true, |
||||||
|
hasVariableValueChanges: false, |
||||||
|
hasRefreshChange: false, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(newDashInitial, changed, false, false, false); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when the time changes but they are not preserved', () => { |
||||||
|
const changed = { |
||||||
|
...initial, |
||||||
|
time: { |
||||||
|
from: 'now-1d', |
||||||
|
to: 'now', |
||||||
|
}, |
||||||
|
}; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
diffs: {}, |
||||||
|
diffCount: 0, |
||||||
|
hasChanges: false, |
||||||
|
hasTimeChanges: true, |
||||||
|
isNew: false, |
||||||
|
hasVariableValueChanges: false, |
||||||
|
hasRefreshChange: false, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(initial, changed, false, false, false); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when the time changes and they are preserved', () => { |
||||||
|
const changed = { |
||||||
|
...initial, |
||||||
|
time: { |
||||||
|
from: 'now-1d', |
||||||
|
to: 'now', |
||||||
|
}, |
||||||
|
}; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...changed, |
||||||
|
}, |
||||||
|
diffs: { |
||||||
|
time: [ |
||||||
|
{ |
||||||
|
endLineNumber: expect.any(Number), |
||||||
|
op: 'replace', |
||||||
|
originalValue: 'now-7d', |
||||||
|
path: ['time', 'from'], |
||||||
|
startLineNumber: expect.any(Number), |
||||||
|
value: 'now-1d', |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
diffCount: 1, |
||||||
|
hasChanges: true, |
||||||
|
hasTimeChanges: true, |
||||||
|
isNew: false, |
||||||
|
hasVariableValueChanges: false, |
||||||
|
hasRefreshChange: false, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(initial, changed, true, false, false); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when the refresh changes but it is not preserved', () => { |
||||||
|
const changed = { |
||||||
|
...initial, |
||||||
|
refresh: '2h', |
||||||
|
}; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
diffs: {}, |
||||||
|
diffCount: 0, |
||||||
|
hasChanges: false, |
||||||
|
hasTimeChanges: false, |
||||||
|
isNew: false, |
||||||
|
hasVariableValueChanges: false, |
||||||
|
hasRefreshChange: true, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(initial, changed, false, false, false); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when the refresh changes and it is preserved', () => { |
||||||
|
const changed = { |
||||||
|
...initial, |
||||||
|
refresh: '2h', |
||||||
|
}; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...changed, |
||||||
|
}, |
||||||
|
diffs: { |
||||||
|
refresh: [ |
||||||
|
{ |
||||||
|
endLineNumber: expect.any(Number), |
||||||
|
op: 'replace', |
||||||
|
originalValue: '1h', |
||||||
|
path: ['refresh'], |
||||||
|
startLineNumber: expect.any(Number), |
||||||
|
value: '2h', |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
diffCount: 1, |
||||||
|
hasChanges: true, |
||||||
|
hasTimeChanges: false, |
||||||
|
isNew: false, |
||||||
|
hasVariableValueChanges: false, |
||||||
|
hasRefreshChange: true, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(initial, changed, false, false, true); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when the variable value changes but it is not preserved', () => { |
||||||
|
const changed = { |
||||||
|
...initial, |
||||||
|
templating: { |
||||||
|
list: [ |
||||||
|
{ |
||||||
|
name: 'var1', |
||||||
|
type: 'query', |
||||||
|
query: 'query1', |
||||||
|
current: { |
||||||
|
value: 'value2', |
||||||
|
text: 'text1', |
||||||
|
}, |
||||||
|
options: [], |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
} as Dashboard; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
diffs: {}, |
||||||
|
diffCount: 0, |
||||||
|
hasChanges: false, |
||||||
|
hasTimeChanges: false, |
||||||
|
isNew: false, |
||||||
|
hasVariableValueChanges: true, |
||||||
|
hasRefreshChange: false, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(initial, changed, false, false, false); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when the variable value changes', () => { |
||||||
|
const changed = { |
||||||
|
...initial, |
||||||
|
templating: { |
||||||
|
list: [ |
||||||
|
{ |
||||||
|
name: 'var1', |
||||||
|
type: 'query', |
||||||
|
query: 'query1', |
||||||
|
current: { |
||||||
|
value: 'value2', |
||||||
|
text: 'text1', |
||||||
|
}, |
||||||
|
options: [], |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
} as Dashboard; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...changed, |
||||||
|
}, |
||||||
|
diffs: { |
||||||
|
templating: [ |
||||||
|
{ |
||||||
|
endLineNumber: 17, |
||||||
|
op: 'replace', |
||||||
|
originalValue: 'value1', |
||||||
|
path: ['templating', 'list', '0', 'current', 'value'], |
||||||
|
startLineNumber: 17, |
||||||
|
value: 'value2', |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
diffCount: 1, |
||||||
|
hasChanges: true, |
||||||
|
hasTimeChanges: false, |
||||||
|
isNew: false, |
||||||
|
hasVariableValueChanges: true, |
||||||
|
hasRefreshChange: false, |
||||||
|
}; |
||||||
|
|
||||||
|
const result = getDashboardChanges(initial, changed, false, true, false); |
||||||
|
|
||||||
|
expect(result).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('getPanelChanges', () => { |
||||||
|
const initial: Panel = { |
||||||
|
id: 1, |
||||||
|
type: 'graph', |
||||||
|
title: 'Panel 1', |
||||||
|
gridPos: { |
||||||
|
x: 0, |
||||||
|
y: 0, |
||||||
|
w: 12, |
||||||
|
h: 8, |
||||||
|
}, |
||||||
|
targets: [ |
||||||
|
{ |
||||||
|
refId: 'A', |
||||||
|
query: 'query1', |
||||||
|
}, |
||||||
|
], |
||||||
|
}; |
||||||
|
|
||||||
|
it('should return the correct result when no changes', () => { |
||||||
|
const changed = { ...initial }; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...changed, |
||||||
|
}, |
||||||
|
diffs: {}, |
||||||
|
diffCount: 0, |
||||||
|
hasChanges: false, |
||||||
|
}; |
||||||
|
|
||||||
|
expect(getPanelChanges(initial, changed)).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return the correct result when there is some changes', () => { |
||||||
|
const changed = { |
||||||
|
...initial, |
||||||
|
title: 'Panel 2', |
||||||
|
type: 'table', |
||||||
|
gridPos: { |
||||||
|
...initial.gridPos, |
||||||
|
x: 1, |
||||||
|
}, |
||||||
|
targets: [ |
||||||
|
{ |
||||||
|
refId: 'A', |
||||||
|
query: 'query2', |
||||||
|
}, |
||||||
|
], |
||||||
|
} as Panel; |
||||||
|
|
||||||
|
const expectedChanges = { |
||||||
|
initialSaveModel: { |
||||||
|
...initial, |
||||||
|
}, |
||||||
|
changedSaveModel: { |
||||||
|
...changed, |
||||||
|
}, |
||||||
|
diffs: { |
||||||
|
title: [ |
||||||
|
{ |
||||||
|
endLineNumber: 3, |
||||||
|
op: 'replace', |
||||||
|
originalValue: 'Panel 1', |
||||||
|
path: ['title'], |
||||||
|
startLineNumber: 3, |
||||||
|
value: 'Panel 2', |
||||||
|
}, |
||||||
|
], |
||||||
|
type: [ |
||||||
|
{ |
||||||
|
endLineNumber: 2, |
||||||
|
op: 'replace', |
||||||
|
originalValue: 'graph', |
||||||
|
path: ['type'], |
||||||
|
startLineNumber: 2, |
||||||
|
value: 'table', |
||||||
|
}, |
||||||
|
], |
||||||
|
gridPos: [ |
||||||
|
{ |
||||||
|
endLineNumber: 5, |
||||||
|
op: 'replace', |
||||||
|
originalValue: 0, |
||||||
|
path: ['gridPos', 'x'], |
||||||
|
startLineNumber: 5, |
||||||
|
value: 1, |
||||||
|
}, |
||||||
|
], |
||||||
|
targets: [ |
||||||
|
{ |
||||||
|
endLineNumber: 13, |
||||||
|
op: 'replace', |
||||||
|
originalValue: 'query1', |
||||||
|
path: ['targets', '0', 'query'], |
||||||
|
startLineNumber: 13, |
||||||
|
value: 'query2', |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
diffCount: 4, |
||||||
|
hasChanges: true, |
||||||
|
}; |
||||||
|
|
||||||
|
expect(getPanelChanges(changed, initial)).toEqual(expectedChanges); |
||||||
|
}); |
||||||
|
}); |
Loading…
Reference in new issue