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