import {describe, beforeEach, it, sinon, expect, angularMocks} from 'test/lib/common'; import '../all'; import _ from 'lodash'; import helpers from 'test/specs/helpers'; import {Emitter} from 'app/core/core'; describe('VariableSrv init', function() { var ctx = new helpers.ControllerTestContext(); beforeEach(angularMocks.module('grafana.core')); beforeEach(angularMocks.module('grafana.controllers')); beforeEach(angularMocks.module('grafana.services')); beforeEach(angularMocks.module(function($compileProvider) { $compileProvider.preAssignBindingsEnabled(true); })); beforeEach(ctx.providePhase(['datasourceSrv', 'timeSrv', 'templateSrv', '$location'])); beforeEach(angularMocks.inject(($rootScope, $q, $location, $injector) => { ctx.$q = $q; ctx.$rootScope = $rootScope; ctx.$location = $location; ctx.variableSrv = $injector.get('variableSrv'); ctx.$rootScope.$digest(); })); function describeInitScenario(desc, fn) { describe(desc, function() { var scenario: any = { urlParams: {}, setup: setupFn => { scenario.setupFn = setupFn; } }; beforeEach(function() { scenario.setupFn(); ctx.datasource = {}; ctx.datasource.metricFindQuery = sinon.stub().returns(ctx.$q.when(scenario.queryResult)); ctx.datasourceSrv.get = sinon.stub().returns(ctx.$q.when(ctx.datasource)); ctx.datasourceSrv.getMetricSources = sinon.stub().returns(scenario.metricSources); ctx.$location.search = sinon.stub().returns(scenario.urlParams); ctx.dashboard = {templating: {list: scenario.variables}, events: new Emitter()}; ctx.variableSrv.init(ctx.dashboard); ctx.$rootScope.$digest(); scenario.variables = ctx.variableSrv.variables; }); fn(scenario); }); } ['query', 'interval', 'custom', 'datasource'].forEach(type => { describeInitScenario('when setting ' + type + ' variable via url', scenario => { scenario.setup(() => { scenario.variables = [{ name: 'apps', type: type, current: {text: "test", value: "test"}, options: [{text: "test", value: "test"}] }]; scenario.urlParams["var-apps"] = "new"; scenario.metricSources = []; }); it('should update current value', () => { expect(scenario.variables[0].current.value).to.be("new"); expect(scenario.variables[0].current.text).to.be("new"); }); }); }); describe('given dependent variables', () => { var variableList = [ { name: 'app', type: 'query', query: '', current: {text: "app1", value: "app1"}, options: [{text: "app1", value: "app1"}] }, { name: 'server', type: 'query', refresh: 1, query: '$app.*', current: {text: "server1", value: "server1"}, options: [{text: "server1", value: "server1"}] }, ]; describeInitScenario('when setting parent var from url', scenario => { scenario.setup(() => { scenario.variables = _.cloneDeep(variableList); scenario.urlParams["var-app"] = "google"; scenario.queryResult = [{text: 'google-server1'}, {text: 'google-server2'}]; }); it('should update child variable', () => { expect(scenario.variables[1].options.length).to.be(2); expect(scenario.variables[1].current.text).to.be("google-server1"); }); it('should only update it once', () => { expect(ctx.datasource.metricFindQuery.callCount).to.be(1); }); }); }); describeInitScenario('when datasource variable is initialized', scenario => { scenario.setup(() => { scenario.variables = [{ type: 'datasource', query: 'graphite', name: 'test', current: {value: 'backend4_pee', text: 'backend4_pee'}, regex: '/pee$/' } ]; scenario.metricSources = [ {name: 'backend1', meta: {id: 'influx'}}, {name: 'backend2_pee', meta: {id: 'graphite'}}, {name: 'backend3', meta: {id: 'graphite'}}, {name: 'backend4_pee', meta: {id: 'graphite'}}, ]; }); it('should update current value', function() { var variable = ctx.variableSrv.variables[0]; expect(variable.options.length).to.be(2); }); }); describeInitScenario('when template variable is present in url multiple times', scenario => { scenario.setup(() => { scenario.variables = [{ name: 'apps', type: 'query', multi: true, current: {text: "val1", value: "val1"}, options: [{text: "val1", value: "val1"}, {text: 'val2', value: 'val2'}, {text: 'val3', value: 'val3', selected: true}] }]; scenario.urlParams["var-apps"] = ["val2", "val1"]; }); it('should update current value', function() { var variable = ctx.variableSrv.variables[0]; expect(variable.current.value.length).to.be(2); expect(variable.current.value[0]).to.be("val2"); expect(variable.current.value[1]).to.be("val1"); expect(variable.current.text).to.be("val2 + val1"); expect(variable.options[0].selected).to.be(true); expect(variable.options[1].selected).to.be(true); }); it('should set options that are not in value to selected false', function() { var variable = ctx.variableSrv.variables[0]; expect(variable.options[2].selected).to.be(false); }); }); });