From 694a73f2c1cc32da2122c5665a18ecb7654d7cb1 Mon Sep 17 00:00:00 2001 From: Michael Everett Date: Tue, 6 Dec 2016 10:22:59 -0800 Subject: [PATCH 1/3] Added fix to allow template variable queries through /search. --- dist/datasource.js | 3 ++- src/datasource.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dist/datasource.js b/dist/datasource.js index 7084458..43fcc00 100644 --- a/dist/datasource.js +++ b/dist/datasource.js @@ -104,8 +104,9 @@ System.register(['lodash'], function (_export, _context) { }, { key: 'metricFindQuery', value: function metricFindQuery(options) { + var target = typeof (options) == "string" ? options : options.target; var interpolated = { - target: this.templateSrv.replace(options.target, null, 'regex') + target: this.templateSrv.replace(target, null, 'regex') }; return this.backendSrv.datasourceRequest({ diff --git a/src/datasource.js b/src/datasource.js index a24029e..b7ecce4 100644 --- a/src/datasource.js +++ b/src/datasource.js @@ -62,8 +62,9 @@ export class GenericDatasource { } metricFindQuery(options) { + var target = typeof (options) == "string" ? options : options.target; var interpolated = { - target: this.templateSrv.replace(options.target, null, 'regex') + target: this.templateSrv.replace(target, null, 'regex') }; return this.backendSrv.datasourceRequest({ From 49e086cdbf8b7647132079484f4107f673418bc1 Mon Sep 17 00:00:00 2001 From: Michael Everett Date: Tue, 6 Dec 2016 11:39:59 -0800 Subject: [PATCH 2/3] Updated GenericDatasource mapToTextValue() to handle template query variables with support for both single strings (default) or nested text/value objects: { text: "label", value: "rawValue }. --- dist/datasource.js | 1 + src/datasource.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dist/datasource.js b/dist/datasource.js index 43fcc00..351302c 100644 --- a/dist/datasource.js +++ b/dist/datasource.js @@ -120,6 +120,7 @@ System.register(['lodash'], function (_export, _context) { key: 'mapToTextValue', value: function mapToTextValue(result) { return _.map(result.data, function (d, i) { + if (d && d.text && d.value) return { text: d.text, value: d.value } return { text: d, value: i }; }); } diff --git a/src/datasource.js b/src/datasource.js index b7ecce4..cbd40b7 100644 --- a/src/datasource.js +++ b/src/datasource.js @@ -77,7 +77,8 @@ export class GenericDatasource { mapToTextValue(result) { return _.map(result.data, (d, i) => { - return { text: d, value: i}; + if (d && d.text && d.value) return { text: d.text, value: d.value } + return { text: d, value: i }; }); } From 7979ff6ebe50ca7230132c92e61bda2238af55f7 Mon Sep 17 00:00:00 2001 From: Michael Everett Date: Wed, 7 Dec 2016 02:24:44 -0800 Subject: [PATCH 3/3] Added unit tests for enhancements to metricFindQuery and mapToTextValue --- spec/datasource_spec.js | 199 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) diff --git a/spec/datasource_spec.js b/spec/datasource_spec.js index 19c0eb4..f44bcff 100644 --- a/spec/datasource_spec.js +++ b/spec/datasource_spec.js @@ -45,4 +45,203 @@ describe('GenericDatasource', function() { done(); }); }); + + it ('should return the metric results when a target is null', function(done) { + ctx.backendSrv.datasourceRequest = function(request) { + return ctx.$q.when({ + _request: request, + data: [ + "metric_0", + "metric_1", + "metric_2", + ] + }); + }; + + ctx.templateSrv.replace = function(data) { + return data; + } + + ctx.ds.metricFindQuery({target: null}).then(function(result) { + expect(result).to.have.length(3); + expect(result[0].text).to.equal('metric_0'); + expect(result[0].value).to.equal(0); + expect(result[1].text).to.equal('metric_1'); + expect(result[1].value).to.equal(1); + expect(result[2].text).to.equal('metric_2'); + expect(result[2].value).to.equal(2); + done(); + }); + }); + + it ('should return the metric target results when a target is set', function(done) { + ctx.backendSrv.datasourceRequest = function(request) { + var target = request.data.target; + var result = [target + "_0", target + "_1", target + "_2"]; + + return ctx.$q.when({ + _request: request, + data: result + }); + }; + + ctx.templateSrv.replace = function(data) { + return data; + } + + ctx.ds.metricFindQuery({target: 'search'}).then(function(result) { + expect(result).to.have.length(3); + expect(result[0].text).to.equal('search_0'); + expect(result[0].value).to.equal(0); + expect(result[1].text).to.equal('search_1'); + expect(result[1].value).to.equal(1); + expect(result[2].text).to.equal('search_2'); + expect(result[2].value).to.equal(2); + done(); + }); + }); + + it ('should return the metric results when the target is an empty string', function(done) { + ctx.backendSrv.datasourceRequest = function(request) { + return ctx.$q.when({ + _request: request, + data: [ + "metric_0", + "metric_1", + "metric_2", + ] + }); + }; + + ctx.templateSrv.replace = function(data) { + return data; + } + + ctx.ds.metricFindQuery({target: ''}).then(function(result) { + expect(result).to.have.length(3); + expect(result[0].text).to.equal('metric_0'); + expect(result[0].value).to.equal(0); + expect(result[1].text).to.equal('metric_1'); + expect(result[1].value).to.equal(1); + expect(result[2].text).to.equal('metric_2'); + expect(result[2].value).to.equal(2); + done(); + }); + }); + + it ('should return the metric results when the args are an empty object', function(done) { + ctx.backendSrv.datasourceRequest = function(request) { + return ctx.$q.when({ + _request: request, + data: [ + "metric_0", + "metric_1", + "metric_2", + ] + }); + }; + + ctx.templateSrv.replace = function(data) { + return data; + } + + ctx.ds.metricFindQuery({}).then(function(result) { + expect(result).to.have.length(3); + expect(result[0].text).to.equal('metric_0'); + expect(result[0].value).to.equal(0); + expect(result[1].text).to.equal('metric_1'); + expect(result[1].value).to.equal(1); + expect(result[2].text).to.equal('metric_2'); + expect(result[2].value).to.equal(2); + done(); + }); + }); + + it ('should throw error when args are undefined', function(done) { + global.assert.throw(ctx.ds.metricFindQuery, Error, "Cannot read property 'target' of undefined"); + done(); + }); + + it ('should throw error when args are null', function(done) { + global.assert.throw(function() { ctx.ds.metricFindQuery(null); }, Error, "Cannot read property 'target' of null"); + done(); + }); + + it ('should return the metric target results when the args are a string', function(done) { + ctx.backendSrv.datasourceRequest = function(request) { + var target = request.data.target; + var result = [target + "_0", target + "_1", target + "_2"]; + + return ctx.$q.when({ + _request: request, + data: result + }); + }; + + ctx.templateSrv.replace = function(data) { + return data; + } + + ctx.ds.metricFindQuery('search').then(function(result) { + expect(result).to.have.length(3); + expect(result[0].text).to.equal('search_0'); + expect(result[0].value).to.equal(0); + expect(result[1].text).to.equal('search_1'); + expect(result[1].value).to.equal(1); + expect(result[2].text).to.equal('search_2'); + expect(result[2].value).to.equal(2); + done(); + }); + }); + + it ('should return data as text and index as value', function(done) { + var result = ctx.ds.mapToTextValue({data: ["zero", "one", "two"]}); + + expect(result).to.have.length(3); + expect(result[0].text).to.equal('zero'); + expect(result[0].value).to.equal(0); + expect(result[1].text).to.equal('one'); + expect(result[1].value).to.equal(1); + expect(result[2].text).to.equal('two'); + expect(result[2].value).to.equal(2); + done(); + }); + + it ('should return text as text and value as value', function(done) { + var data = [ + {text: "zero", value: "value_0"}, + {text: "one", value: "value_1"}, + {text: "two", value: "value_2"}, + ]; + + var result = ctx.ds.mapToTextValue({data: data}); + + expect(result).to.have.length(3); + expect(result[0].text).to.equal('zero'); + expect(result[0].value).to.equal('value_0'); + expect(result[1].text).to.equal('one'); + expect(result[1].value).to.equal('value_1'); + expect(result[2].text).to.equal('two'); + expect(result[2].value).to.equal('value_2'); + done(); + }); + + it ('should return data as text and index as value', function(done) { + var data = [ + {a: "zero", b: "value_0"}, + {a: "one", b: "value_1"}, + {a: "two", b: "value_2"}, + ]; + + var result = ctx.ds.mapToTextValue({data: data}); + + expect(result).to.have.length(3); + expect(result[0].text).to.equal(data[0]); + expect(result[0].value).to.equal(0); + expect(result[1].text).to.equal(data[1]); + expect(result[1].value).to.equal(1); + expect(result[2].text).to.equal(data[2]); + expect(result[2].value).to.equal(2); + done(); + }); });