mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
fix regressions after save modal changes of not storing time and variables per default
Fix problem with adhoc variable filters not handled. Fix problem with saving variables and time per default when saving a dashboard as/first time. Fix updating dashboard model after save with saving time/variables enabled so that next time you save you won't get checkboxes for save time/variables unless any values changed. Tests validating correctness if time/variable values has changed.
This commit is contained in:
@@ -435,8 +435,67 @@ describe('DashboardModel', function() {
|
||||
});
|
||||
});
|
||||
|
||||
describe('save variables and timeline', () => {
|
||||
let model;
|
||||
describe('Given model with time', () => {
|
||||
let model: DashboardModel;
|
||||
|
||||
beforeEach(() => {
|
||||
model = new DashboardModel({
|
||||
time: {
|
||||
from: 'now-6h',
|
||||
to: 'now',
|
||||
},
|
||||
});
|
||||
expect(model.hasTimeChanged()).toBeFalsy();
|
||||
model.time = {
|
||||
from: 'now-3h',
|
||||
to: 'now-1h',
|
||||
};
|
||||
});
|
||||
|
||||
it('hasTimeChanged should be true', () => {
|
||||
expect(model.hasTimeChanged()).toBeTruthy();
|
||||
});
|
||||
|
||||
it('getSaveModelClone should return original time when saveTimerange=false', () => {
|
||||
let options = { saveTimerange: false };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.time.from).toBe('now-6h');
|
||||
expect(saveModel.time.to).toBe('now');
|
||||
});
|
||||
|
||||
it('getSaveModelClone should return updated time when saveTimerange=true', () => {
|
||||
let options = { saveTimerange: true };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.time.from).toBe('now-3h');
|
||||
expect(saveModel.time.to).toBe('now-1h');
|
||||
});
|
||||
|
||||
it('hasTimeChanged should be false when reset original time', () => {
|
||||
model.resetOriginalTime();
|
||||
expect(model.hasTimeChanged()).toBeFalsy();
|
||||
});
|
||||
|
||||
it('getSaveModelClone should return original time when saveTimerange=false', () => {
|
||||
let options = { saveTimerange: false };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.time.from).toBe('now-6h');
|
||||
expect(saveModel.time.to).toBe('now');
|
||||
});
|
||||
|
||||
it('getSaveModelClone should return updated time when saveTimerange=true', () => {
|
||||
let options = { saveTimerange: true };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.time.from).toBe('now-3h');
|
||||
expect(saveModel.time.to).toBe('now-1h');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Given model with template variable of type query', () => {
|
||||
let model: DashboardModel;
|
||||
|
||||
beforeEach(() => {
|
||||
model = new DashboardModel({
|
||||
@@ -444,6 +503,7 @@ describe('DashboardModel', function() {
|
||||
list: [
|
||||
{
|
||||
name: 'Server',
|
||||
type: 'query',
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'server_001',
|
||||
@@ -452,45 +512,127 @@ describe('DashboardModel', function() {
|
||||
},
|
||||
],
|
||||
},
|
||||
time: {
|
||||
from: 'now-6h',
|
||||
to: 'now',
|
||||
},
|
||||
});
|
||||
model.templating.list[0] = {
|
||||
name: 'Server',
|
||||
expect(model.hasVariableValuesChanged()).toBeFalsy();
|
||||
});
|
||||
|
||||
it('hasVariableValuesChanged should be false when adding a template variable', () => {
|
||||
model.templating.list.push({
|
||||
name: 'Server2',
|
||||
type: 'query',
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'server_002',
|
||||
value: 'server_002',
|
||||
},
|
||||
};
|
||||
model.time = {
|
||||
from: 'now-3h',
|
||||
to: 'now',
|
||||
};
|
||||
});
|
||||
expect(model.hasVariableValuesChanged()).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should not save variables and timeline', () => {
|
||||
let options = {
|
||||
saveVariables: false,
|
||||
saveTimerange: false,
|
||||
};
|
||||
it('hasVariableValuesChanged should be false when removing existing template variable', () => {
|
||||
model.templating.list = [];
|
||||
expect(model.hasVariableValuesChanged()).toBeFalsy();
|
||||
});
|
||||
|
||||
it('hasVariableValuesChanged should be true when changing value of template variable', () => {
|
||||
model.templating.list[0].current.text = 'server_002';
|
||||
expect(model.hasVariableValuesChanged()).toBeTruthy();
|
||||
});
|
||||
|
||||
it('getSaveModelClone should return original variable when saveVariables=false', () => {
|
||||
model.templating.list[0].current.text = 'server_002';
|
||||
|
||||
let options = { saveVariables: false };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.templating.list[0].current.text).toBe('server_001');
|
||||
expect(saveModel.time.from).toBe('now-6h');
|
||||
});
|
||||
|
||||
it('should save variables and timeline', () => {
|
||||
let options = {
|
||||
saveVariables: true,
|
||||
saveTimerange: true,
|
||||
};
|
||||
it('getSaveModelClone should return updated variable when saveVariables=true', () => {
|
||||
model.templating.list[0].current.text = 'server_002';
|
||||
|
||||
let options = { saveVariables: true };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.templating.list[0].current.text).toBe('server_002');
|
||||
expect(saveModel.time.from).toBe('now-3h');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Given model with template variable of type adhoc', () => {
|
||||
let model: DashboardModel;
|
||||
|
||||
beforeEach(() => {
|
||||
model = new DashboardModel({
|
||||
templating: {
|
||||
list: [
|
||||
{
|
||||
name: 'Filter',
|
||||
type: 'adhoc',
|
||||
filters: [
|
||||
{
|
||||
key: '@hostname',
|
||||
operator: '=',
|
||||
value: 'server 20',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
expect(model.hasVariableValuesChanged()).toBeFalsy();
|
||||
});
|
||||
|
||||
it('hasVariableValuesChanged should be false when adding a template variable', () => {
|
||||
model.templating.list.push({
|
||||
name: 'Filter',
|
||||
type: 'adhoc',
|
||||
filters: [
|
||||
{
|
||||
key: '@hostname',
|
||||
operator: '=',
|
||||
value: 'server 1',
|
||||
},
|
||||
],
|
||||
});
|
||||
expect(model.hasVariableValuesChanged()).toBeFalsy();
|
||||
});
|
||||
|
||||
it('hasVariableValuesChanged should be false when removing existing template variable', () => {
|
||||
model.templating.list = [];
|
||||
expect(model.hasVariableValuesChanged()).toBeFalsy();
|
||||
});
|
||||
|
||||
it('hasVariableValuesChanged should be true when changing value of filter', () => {
|
||||
model.templating.list[0].filters[0].value = 'server 1';
|
||||
expect(model.hasVariableValuesChanged()).toBeTruthy();
|
||||
});
|
||||
|
||||
it('hasVariableValuesChanged should be true when adding an additional condition', () => {
|
||||
model.templating.list[0].filters[0].condition = 'AND';
|
||||
model.templating.list[0].filters[1] = {
|
||||
key: '@metric',
|
||||
operator: '=',
|
||||
value: 'logins.count',
|
||||
};
|
||||
expect(model.hasVariableValuesChanged()).toBeTruthy();
|
||||
});
|
||||
|
||||
it('getSaveModelClone should return original variable when saveVariables=false', () => {
|
||||
model.templating.list[0].filters[0].value = 'server 1';
|
||||
|
||||
let options = { saveVariables: false };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.templating.list[0].filters[0].value).toBe('server 20');
|
||||
});
|
||||
|
||||
it('getSaveModelClone should return updated variable when saveVariables=true', () => {
|
||||
model.templating.list[0].filters[0].value = 'server 1';
|
||||
|
||||
let options = { saveVariables: true };
|
||||
let saveModel = model.getSaveModelClone(options);
|
||||
|
||||
expect(saveModel.templating.list[0].filters[0].value).toBe('server 1');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,128 +1,57 @@
|
||||
import { SaveDashboardModalCtrl } from '../save_modal';
|
||||
|
||||
jest.mock('app/core/services/context_srv', () => ({}));
|
||||
const setup = (timeChanged, variableValuesChanged, cb) => {
|
||||
const dash = {
|
||||
hasTimeChanged: jest.fn().mockReturnValue(timeChanged),
|
||||
hasVariableValuesChanged: jest.fn().mockReturnValue(variableValuesChanged),
|
||||
resetOriginalTime: jest.fn(),
|
||||
resetOriginalVariables: jest.fn(),
|
||||
getSaveModelClone: jest.fn().mockReturnValue({}),
|
||||
};
|
||||
const dashboardSrvMock = {
|
||||
getCurrent: jest.fn().mockReturnValue(dash),
|
||||
save: jest.fn().mockReturnValue(Promise.resolve()),
|
||||
};
|
||||
const ctrl = new SaveDashboardModalCtrl(dashboardSrvMock);
|
||||
ctrl.saveForm = {
|
||||
$valid: true,
|
||||
};
|
||||
ctrl.dismiss = () => Promise.resolve();
|
||||
cb(dash, ctrl, dashboardSrvMock);
|
||||
};
|
||||
|
||||
describe('SaveDashboardModal', () => {
|
||||
describe('save modal checkboxes', () => {
|
||||
it('should show checkboxes', () => {
|
||||
let fakeDashboardSrv = {
|
||||
dash: {
|
||||
templating: {
|
||||
list: [
|
||||
{
|
||||
current: {
|
||||
selected: true,
|
||||
tags: Array(0),
|
||||
text: 'server_001',
|
||||
value: 'server_001',
|
||||
},
|
||||
name: 'Server',
|
||||
},
|
||||
],
|
||||
},
|
||||
originalTemplating: [
|
||||
{
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'server_002',
|
||||
value: 'server_002',
|
||||
},
|
||||
name: 'Server',
|
||||
},
|
||||
],
|
||||
time: {
|
||||
from: 'now-3h',
|
||||
to: 'now',
|
||||
},
|
||||
originalTime: {
|
||||
from: 'now-6h',
|
||||
to: 'now',
|
||||
},
|
||||
},
|
||||
};
|
||||
let modal = new SaveDashboardModalCtrl(fakeDashboardSrv);
|
||||
|
||||
expect(modal.timeChange).toBe(true);
|
||||
expect(modal.variableValueChange).toBe(true);
|
||||
describe('Given time and template variable values have not changed', () => {
|
||||
setup(false, false, (dash, ctrl: SaveDashboardModalCtrl) => {
|
||||
it('When creating ctrl should set time and template variable values changed', () => {
|
||||
expect(ctrl.timeChange).toBeFalsy();
|
||||
expect(ctrl.variableValueChange).toBeFalsy();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should hide checkboxes', () => {
|
||||
let fakeDashboardSrv = {
|
||||
dash: {
|
||||
templating: {
|
||||
list: [
|
||||
{
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'server_002',
|
||||
value: 'server_002',
|
||||
},
|
||||
name: 'Server',
|
||||
},
|
||||
],
|
||||
},
|
||||
originalTemplating: [
|
||||
{
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'server_002',
|
||||
value: 'server_002',
|
||||
},
|
||||
name: 'Server',
|
||||
},
|
||||
],
|
||||
time: {
|
||||
from: 'now-3h',
|
||||
to: 'now',
|
||||
},
|
||||
originalTime: {
|
||||
from: 'now-3h',
|
||||
to: 'now',
|
||||
},
|
||||
},
|
||||
};
|
||||
let modal = new SaveDashboardModalCtrl(fakeDashboardSrv);
|
||||
expect(modal.timeChange).toBe(false);
|
||||
expect(modal.variableValueChange).toBe(false);
|
||||
});
|
||||
describe('Given time and template variable values have changed', () => {
|
||||
setup(true, true, (dash, ctrl: SaveDashboardModalCtrl) => {
|
||||
it('When creating ctrl should set time and template variable values changed', () => {
|
||||
expect(ctrl.timeChange).toBeTruthy();
|
||||
expect(ctrl.variableValueChange).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should hide variable checkboxes', () => {
|
||||
let fakeDashboardSrv = {
|
||||
dash: {
|
||||
templating: {
|
||||
list: [
|
||||
{
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'server_002',
|
||||
value: 'server_002',
|
||||
},
|
||||
name: 'Server',
|
||||
},
|
||||
{
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'web_002',
|
||||
value: 'web_002',
|
||||
},
|
||||
name: 'Web',
|
||||
},
|
||||
],
|
||||
},
|
||||
originalTemplating: [
|
||||
{
|
||||
current: {
|
||||
selected: true,
|
||||
text: 'server_002',
|
||||
value: 'server_002',
|
||||
},
|
||||
name: 'Server',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
let modal = new SaveDashboardModalCtrl(fakeDashboardSrv);
|
||||
expect(modal.variableValueChange).toBe(false);
|
||||
it('When save time and variable value changes disabled and saving should reset original time and template variable values', async () => {
|
||||
ctrl.saveTimerange = false;
|
||||
ctrl.saveVariables = false;
|
||||
await ctrl.save();
|
||||
expect(dash.resetOriginalTime).toHaveBeenCalledTimes(0);
|
||||
expect(dash.resetOriginalVariables).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it('When save time and variable value changes enabled and saving should reset original time and template variable values', async () => {
|
||||
ctrl.saveTimerange = true;
|
||||
ctrl.saveVariables = true;
|
||||
await ctrl.save();
|
||||
expect(dash.resetOriginalTime).toHaveBeenCalledTimes(1);
|
||||
expect(dash.resetOriginalVariables).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user