From 94b8cbdc6a06c5467f81b2f3e5b77b3726ec01b7 Mon Sep 17 00:00:00 2001 From: Tobias Skarhed Date: Wed, 13 Jun 2018 15:15:36 +0200 Subject: [PATCH 1/4] Karma to Jest: exporter --- .../features/dashboard/specs/exporter.jest.ts | 193 ++++++++++++++++++ .../dashboard/specs/exporter_specs.ts | 187 ----------------- 2 files changed, 193 insertions(+), 187 deletions(-) create mode 100644 public/app/features/dashboard/specs/exporter.jest.ts delete mode 100644 public/app/features/dashboard/specs/exporter_specs.ts diff --git a/public/app/features/dashboard/specs/exporter.jest.ts b/public/app/features/dashboard/specs/exporter.jest.ts new file mode 100644 index 00000000000..b00cbdd143e --- /dev/null +++ b/public/app/features/dashboard/specs/exporter.jest.ts @@ -0,0 +1,193 @@ +jest.mock('app/core/store', () => { + return { + getBool: jest.fn(), + }; +}); + +import _ from 'lodash'; +import config from 'app/core/config'; +import { DashboardExporter } from '../export/exporter'; +import { DashboardModel } from '../dashboard_model'; + +describe('given dashboard with repeated panels', () => { + var dash, exported; + + beforeEach(done => { + dash = { + templating: { list: [] }, + annotations: { list: [] }, + }; + + config.buildInfo = { + version: '3.0.2', + }; + + dash.templating.list.push({ + name: 'apps', + type: 'query', + datasource: 'gfdb', + current: { value: 'Asd', text: 'Asd' }, + options: [{ value: 'Asd', text: 'Asd' }], + }); + + dash.templating.list.push({ + name: 'prefix', + type: 'constant', + current: { value: 'collectd', text: 'collectd' }, + options: [], + }); + + dash.templating.list.push({ + name: 'ds', + type: 'datasource', + query: 'testdb', + current: { value: 'prod', text: 'prod' }, + options: [], + }); + + dash.annotations.list.push({ + name: 'logs', + datasource: 'gfdb', + }); + + dash.panels = [ + { id: 6, datasource: 'gfdb', type: 'graph' }, + { id: 7 }, + { + id: 8, + datasource: '-- Mixed --', + targets: [{ datasource: 'other' }], + }, + { id: 9, datasource: '$ds' }, + ]; + + dash.panels.push({ + id: 2, + repeat: 'apps', + datasource: 'gfdb', + type: 'graph', + }); + dash.panels.push({ id: 3, repeat: null, repeatPanelId: 2 }); + + //Mock test function calls + var datasourceSrvStub = { + get: jest.fn(arg => { + if (arg === 'gfdb') { + return Promise.resolve({ + name: 'gfdb', + meta: { id: 'testdb', info: { version: '1.2.1' }, name: 'TestDB' }, + }); + } else if (arg === 'other') { + return Promise.resolve({ + name: 'other', + meta: { id: 'other', info: { version: '1.2.1' }, name: 'OtherDB' }, + }); + } else if (arg === '-- Mixed --') { + return Promise.resolve({ + name: 'mixed', + meta: { + id: 'mixed', + info: { version: '1.2.1' }, + name: 'Mixed', + builtIn: true, + }, + }); + } else if (arg === '-- Grafana --') { + return Promise.resolve({ + name: '-- Grafana --', + meta: { + id: 'grafana', + info: { version: '1.2.1' }, + name: 'grafana', + builtIn: true, + }, + }); + } + return 0; + }), + }; + + config.panels['graph'] = { + id: 'graph', + name: 'Graph', + info: { version: '1.1.0' }, + }; + + dash = new DashboardModel(dash, {}); + var exporter = new DashboardExporter(datasourceSrvStub); + exporter.makeExportable(dash).then(clean => { + exported = clean; + done(); + }); + }); + + it('should replace datasource refs', () => { + var panel = exported.panels[0]; + expect(panel.datasource).toBe('${DS_GFDB}'); + }); + + it('should replace datasource in variable query', () => { + expect(exported.templating.list[0].datasource).toBe('${DS_GFDB}'); + expect(exported.templating.list[0].options.length).toBe(0); + expect(exported.templating.list[0].current.value).toBe(undefined); + expect(exported.templating.list[0].current.text).toBe(undefined); + }); + + it('should replace datasource in annotation query', () => { + expect(exported.annotations.list[1].datasource).toBe('${DS_GFDB}'); + }); + + it('should add datasource as input', () => { + expect(exported.__inputs[0].name).toBe('DS_GFDB'); + expect(exported.__inputs[0].pluginId).toBe('testdb'); + expect(exported.__inputs[0].type).toBe('datasource'); + }); + + it('should add datasource to required', () => { + var require = _.find(exported.__requires, { name: 'TestDB' }); + expect(require.name).toBe('TestDB'); + expect(require.id).toBe('testdb'); + expect(require.type).toBe('datasource'); + expect(require.version).toBe('1.2.1'); + }); + + it('should not add built in datasources to required', () => { + var require = _.find(exported.__requires, { name: 'Mixed' }); + expect(require).toBe(undefined); + }); + + it('should add datasources used in mixed mode', () => { + var require = _.find(exported.__requires, { name: 'OtherDB' }); + expect(require).not.toBe(undefined); + }); + + it('should add panel to required', () => { + var require = _.find(exported.__requires, { name: 'Graph' }); + expect(require.name).toBe('Graph'); + expect(require.id).toBe('graph'); + expect(require.version).toBe('1.1.0'); + }); + + it('should add grafana version', () => { + var require = _.find(exported.__requires, { name: 'Grafana' }); + expect(require.type).toBe('grafana'); + expect(require.id).toBe('grafana'); + expect(require.version).toBe('3.0.2'); + }); + + it('should add constant template variables as inputs', () => { + var input = _.find(exported.__inputs, { name: 'VAR_PREFIX' }); + expect(input.type).toBe('constant'); + expect(input.label).toBe('prefix'); + expect(input.value).toBe('collectd'); + }); + + it('should templatize constant variables', () => { + var variable = _.find(exported.templating.list, { name: 'prefix' }); + expect(variable.query).toBe('${VAR_PREFIX}'); + expect(variable.current.text).toBe('${VAR_PREFIX}'); + expect(variable.current.value).toBe('${VAR_PREFIX}'); + expect(variable.options[0].text).toBe('${VAR_PREFIX}'); + expect(variable.options[0].value).toBe('${VAR_PREFIX}'); + }); +}); diff --git a/public/app/features/dashboard/specs/exporter_specs.ts b/public/app/features/dashboard/specs/exporter_specs.ts deleted file mode 100644 index 38ce1824f68..00000000000 --- a/public/app/features/dashboard/specs/exporter_specs.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { describe, beforeEach, it, sinon, expect } from 'test/lib/common'; - -import _ from 'lodash'; -import config from 'app/core/config'; -import { DashboardExporter } from '../export/exporter'; -import { DashboardModel } from '../dashboard_model'; - -describe('given dashboard with repeated panels', function() { - var dash, exported; - - beforeEach(done => { - dash = { - templating: { list: [] }, - annotations: { list: [] }, - }; - - config.buildInfo = { - version: '3.0.2', - }; - - dash.templating.list.push({ - name: 'apps', - type: 'query', - datasource: 'gfdb', - current: { value: 'Asd', text: 'Asd' }, - options: [{ value: 'Asd', text: 'Asd' }], - }); - - dash.templating.list.push({ - name: 'prefix', - type: 'constant', - current: { value: 'collectd', text: 'collectd' }, - options: [], - }); - - dash.templating.list.push({ - name: 'ds', - type: 'datasource', - query: 'testdb', - current: { value: 'prod', text: 'prod' }, - options: [], - }); - - dash.annotations.list.push({ - name: 'logs', - datasource: 'gfdb', - }); - - dash.panels = [ - { id: 6, datasource: 'gfdb', type: 'graph' }, - { id: 7 }, - { - id: 8, - datasource: '-- Mixed --', - targets: [{ datasource: 'other' }], - }, - { id: 9, datasource: '$ds' }, - ]; - - dash.panels.push({ - id: 2, - repeat: 'apps', - datasource: 'gfdb', - type: 'graph', - }); - dash.panels.push({ id: 3, repeat: null, repeatPanelId: 2 }); - - var datasourceSrvStub = { get: sinon.stub() }; - datasourceSrvStub.get.withArgs('gfdb').returns( - Promise.resolve({ - name: 'gfdb', - meta: { id: 'testdb', info: { version: '1.2.1' }, name: 'TestDB' }, - }) - ); - datasourceSrvStub.get.withArgs('other').returns( - Promise.resolve({ - name: 'other', - meta: { id: 'other', info: { version: '1.2.1' }, name: 'OtherDB' }, - }) - ); - datasourceSrvStub.get.withArgs('-- Mixed --').returns( - Promise.resolve({ - name: 'mixed', - meta: { - id: 'mixed', - info: { version: '1.2.1' }, - name: 'Mixed', - builtIn: true, - }, - }) - ); - datasourceSrvStub.get.withArgs('-- Grafana --').returns( - Promise.resolve({ - name: '-- Grafana --', - meta: { - id: 'grafana', - info: { version: '1.2.1' }, - name: 'grafana', - builtIn: true, - }, - }) - ); - - config.panels['graph'] = { - id: 'graph', - name: 'Graph', - info: { version: '1.1.0' }, - }; - - dash = new DashboardModel(dash, {}); - var exporter = new DashboardExporter(datasourceSrvStub); - exporter.makeExportable(dash).then(clean => { - exported = clean; - done(); - }); - }); - - it('should replace datasource refs', function() { - var panel = exported.panels[0]; - expect(panel.datasource).to.be('${DS_GFDB}'); - }); - - it('should replace datasource in variable query', function() { - expect(exported.templating.list[0].datasource).to.be('${DS_GFDB}'); - expect(exported.templating.list[0].options.length).to.be(0); - expect(exported.templating.list[0].current.value).to.be(undefined); - expect(exported.templating.list[0].current.text).to.be(undefined); - }); - - it('should replace datasource in annotation query', function() { - expect(exported.annotations.list[1].datasource).to.be('${DS_GFDB}'); - }); - - it('should add datasource as input', function() { - expect(exported.__inputs[0].name).to.be('DS_GFDB'); - expect(exported.__inputs[0].pluginId).to.be('testdb'); - expect(exported.__inputs[0].type).to.be('datasource'); - }); - - it('should add datasource to required', function() { - var require = _.find(exported.__requires, { name: 'TestDB' }); - expect(require.name).to.be('TestDB'); - expect(require.id).to.be('testdb'); - expect(require.type).to.be('datasource'); - expect(require.version).to.be('1.2.1'); - }); - - it('should not add built in datasources to required', function() { - var require = _.find(exported.__requires, { name: 'Mixed' }); - expect(require).to.be(undefined); - }); - - it('should add datasources used in mixed mode', function() { - var require = _.find(exported.__requires, { name: 'OtherDB' }); - expect(require).to.not.be(undefined); - }); - - it('should add panel to required', function() { - var require = _.find(exported.__requires, { name: 'Graph' }); - expect(require.name).to.be('Graph'); - expect(require.id).to.be('graph'); - expect(require.version).to.be('1.1.0'); - }); - - it('should add grafana version', function() { - var require = _.find(exported.__requires, { name: 'Grafana' }); - expect(require.type).to.be('grafana'); - expect(require.id).to.be('grafana'); - expect(require.version).to.be('3.0.2'); - }); - - it('should add constant template variables as inputs', function() { - var input = _.find(exported.__inputs, { name: 'VAR_PREFIX' }); - expect(input.type).to.be('constant'); - expect(input.label).to.be('prefix'); - expect(input.value).to.be('collectd'); - }); - - it('should templatize constant variables', function() { - var variable = _.find(exported.templating.list, { name: 'prefix' }); - expect(variable.query).to.be('${VAR_PREFIX}'); - expect(variable.current.text).to.be('${VAR_PREFIX}'); - expect(variable.current.value).to.be('${VAR_PREFIX}'); - expect(variable.options[0].text).to.be('${VAR_PREFIX}'); - expect(variable.options[0].value).to.be('${VAR_PREFIX}'); - }); -}); From 4dd9b8f324c0f20322ddef463acba2d0850f28e1 Mon Sep 17 00:00:00 2001 From: Tobias Skarhed Date: Wed, 13 Jun 2018 16:29:50 +0200 Subject: [PATCH 2/4] Karma to Jest: playlist_edit_ctrl --- ...rl_specs.ts => playlist_edit_ctrl.jest.ts} | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) rename public/app/features/playlist/specs/{playlist_edit_ctrl_specs.ts => playlist_edit_ctrl.jest.ts} (70%) diff --git a/public/app/features/playlist/specs/playlist_edit_ctrl_specs.ts b/public/app/features/playlist/specs/playlist_edit_ctrl.jest.ts similarity index 70% rename from public/app/features/playlist/specs/playlist_edit_ctrl_specs.ts rename to public/app/features/playlist/specs/playlist_edit_ctrl.jest.ts index 7884dd090e5..f313c6e8e6a 100644 --- a/public/app/features/playlist/specs/playlist_edit_ctrl_specs.ts +++ b/public/app/features/playlist/specs/playlist_edit_ctrl.jest.ts @@ -1,5 +1,4 @@ import '../playlist_edit_ctrl'; -import { describe, beforeEach, it, expect } from 'test/lib/common'; import { PlaylistEditCtrl } from '../playlist_edit_ctrl'; describe('PlaylistEditCtrl', () => { @@ -20,13 +19,13 @@ describe('PlaylistEditCtrl', () => { describe('searchresult returns 2 dashboards, ', () => { it('found dashboard should be 2', () => { - expect(ctx.dashboardresult.length).to.be(2); + expect(ctx.dashboardresult.length).toBe(2); }); it('filtred result should be 2', () => { ctx.filterFoundPlaylistItems(); - expect(ctx.filteredDashboards.length).to.be(2); - expect(ctx.filteredTags.length).to.be(2); + expect(ctx.filteredDashboards.length).toBe(2); + expect(ctx.filteredTags.length).toBe(2); }); describe('adds one dashboard to playlist, ', () => { @@ -37,16 +36,16 @@ describe('PlaylistEditCtrl', () => { }); it('playlistitems should be increased by one', () => { - expect(ctx.playlistItems.length).to.be(2); + expect(ctx.playlistItems.length).toBe(2); }); it('filtred playlistitems should be reduced by one', () => { - expect(ctx.filteredDashboards.length).to.be(1); - expect(ctx.filteredTags.length).to.be(1); + expect(ctx.filteredDashboards.length).toBe(1); + expect(ctx.filteredTags.length).toBe(1); }); it('found dashboard should be 2', () => { - expect(ctx.dashboardresult.length).to.be(2); + expect(ctx.dashboardresult.length).toBe(2); }); describe('removes one dashboard from playlist, ', () => { @@ -57,14 +56,14 @@ describe('PlaylistEditCtrl', () => { }); it('playlistitems should be increased by one', () => { - expect(ctx.playlistItems.length).to.be(0); + expect(ctx.playlistItems.length).toBe(0); }); it('found dashboard should be 2', () => { - expect(ctx.dashboardresult.length).to.be(2); - expect(ctx.filteredDashboards.length).to.be(2); - expect(ctx.filteredTags.length).to.be(2); - expect(ctx.tagresult.length).to.be(2); + expect(ctx.dashboardresult.length).toBe(2); + expect(ctx.filteredDashboards.length).toBe(2); + expect(ctx.filteredTags.length).toBe(2); + expect(ctx.tagresult.length).toBe(2); }); }); }); From a3552a60e10dfd334c869ed3cc1fc71cdf5645b8 Mon Sep 17 00:00:00 2001 From: Tobias Skarhed Date: Thu, 14 Jun 2018 09:46:36 +0200 Subject: [PATCH 3/4] Improve test readability --- .../features/dashboard/specs/exporter.jest.ts | 75 ++++++++++--------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/public/app/features/dashboard/specs/exporter.jest.ts b/public/app/features/dashboard/specs/exporter.jest.ts index b00cbdd143e..5ad89887898 100644 --- a/public/app/features/dashboard/specs/exporter.jest.ts +++ b/public/app/features/dashboard/specs/exporter.jest.ts @@ -69,43 +69,8 @@ describe('given dashboard with repeated panels', () => { }); dash.panels.push({ id: 3, repeat: null, repeatPanelId: 2 }); - //Mock test function calls - var datasourceSrvStub = { - get: jest.fn(arg => { - if (arg === 'gfdb') { - return Promise.resolve({ - name: 'gfdb', - meta: { id: 'testdb', info: { version: '1.2.1' }, name: 'TestDB' }, - }); - } else if (arg === 'other') { - return Promise.resolve({ - name: 'other', - meta: { id: 'other', info: { version: '1.2.1' }, name: 'OtherDB' }, - }); - } else if (arg === '-- Mixed --') { - return Promise.resolve({ - name: 'mixed', - meta: { - id: 'mixed', - info: { version: '1.2.1' }, - name: 'Mixed', - builtIn: true, - }, - }); - } else if (arg === '-- Grafana --') { - return Promise.resolve({ - name: '-- Grafana --', - meta: { - id: 'grafana', - info: { version: '1.2.1' }, - name: 'grafana', - builtIn: true, - }, - }); - } - return 0; - }), - }; + //Stubs test function calls + var datasourceSrvStub = { get: jest.fn(arg => getStub(arg)) }; config.panels['graph'] = { id: 'graph', @@ -191,3 +156,39 @@ describe('given dashboard with repeated panels', () => { expect(variable.options[0].value).toBe('${VAR_PREFIX}'); }); }); + +function getStub(arg) { + // Stub responses + var stubs = []; + stubs['gfdb'] = { + name: 'gfdb', + meta: { id: 'testdb', info: { version: '1.2.1' }, name: 'TestDB' }, + }; + + stubs['other'] = { + name: 'other', + meta: { id: 'other', info: { version: '1.2.1' }, name: 'OtherDB' }, + }; + + stubs['-- Mixed --'] = { + name: 'mixed', + meta: { + id: 'mixed', + info: { version: '1.2.1' }, + name: 'Mixed', + builtIn: true, + }, + }; + + stubs['-- Grafana --'] = { + name: '-- Grafana --', + meta: { + id: 'grafana', + info: { version: '1.2.1' }, + name: 'grafana', + builtIn: true, + }, + }; + + return Promise.resolve(stubs[arg]); +} From 23abf044ffa719d93cec0b7e1dfd9ee9e4f7451d Mon Sep 17 00:00:00 2001 From: Tobias Skarhed Date: Thu, 14 Jun 2018 14:37:48 +0200 Subject: [PATCH 4/4] Fix PR feedback --- .../features/dashboard/specs/exporter.jest.ts | 162 +++++++++--------- 1 file changed, 81 insertions(+), 81 deletions(-) diff --git a/public/app/features/dashboard/specs/exporter.jest.ts b/public/app/features/dashboard/specs/exporter.jest.ts index 5ad89887898..f94d1368aa5 100644 --- a/public/app/features/dashboard/specs/exporter.jest.ts +++ b/public/app/features/dashboard/specs/exporter.jest.ts @@ -14,61 +14,61 @@ describe('given dashboard with repeated panels', () => { beforeEach(done => { dash = { - templating: { list: [] }, - annotations: { list: [] }, + templating: { + list: [ + { + name: 'apps', + type: 'query', + datasource: 'gfdb', + current: { value: 'Asd', text: 'Asd' }, + options: [{ value: 'Asd', text: 'Asd' }], + }, + { + name: 'prefix', + type: 'constant', + current: { value: 'collectd', text: 'collectd' }, + options: [], + }, + { + name: 'ds', + type: 'datasource', + query: 'testdb', + current: { value: 'prod', text: 'prod' }, + options: [], + }, + ], + }, + annotations: { + list: [ + { + name: 'logs', + datasource: 'gfdb', + }, + ], + }, + panels: [ + { id: 6, datasource: 'gfdb', type: 'graph' }, + { id: 7 }, + { + id: 8, + datasource: '-- Mixed --', + targets: [{ datasource: 'other' }], + }, + { id: 9, datasource: '$ds' }, + { + id: 2, + repeat: 'apps', + datasource: 'gfdb', + type: 'graph', + }, + { id: 3, repeat: null, repeatPanelId: 2 }, + ], }; config.buildInfo = { version: '3.0.2', }; - dash.templating.list.push({ - name: 'apps', - type: 'query', - datasource: 'gfdb', - current: { value: 'Asd', text: 'Asd' }, - options: [{ value: 'Asd', text: 'Asd' }], - }); - - dash.templating.list.push({ - name: 'prefix', - type: 'constant', - current: { value: 'collectd', text: 'collectd' }, - options: [], - }); - - dash.templating.list.push({ - name: 'ds', - type: 'datasource', - query: 'testdb', - current: { value: 'prod', text: 'prod' }, - options: [], - }); - - dash.annotations.list.push({ - name: 'logs', - datasource: 'gfdb', - }); - - dash.panels = [ - { id: 6, datasource: 'gfdb', type: 'graph' }, - { id: 7 }, - { - id: 8, - datasource: '-- Mixed --', - targets: [{ datasource: 'other' }], - }, - { id: 9, datasource: '$ds' }, - ]; - - dash.panels.push({ - id: 2, - repeat: 'apps', - datasource: 'gfdb', - type: 'graph', - }); - dash.panels.push({ id: 3, repeat: null, repeatPanelId: 2 }); - //Stubs test function calls var datasourceSrvStub = { get: jest.fn(arg => getStub(arg)) }; @@ -157,38 +157,38 @@ describe('given dashboard with repeated panels', () => { }); }); +// Stub responses +var stubs = []; +stubs['gfdb'] = { + name: 'gfdb', + meta: { id: 'testdb', info: { version: '1.2.1' }, name: 'TestDB' }, +}; + +stubs['other'] = { + name: 'other', + meta: { id: 'other', info: { version: '1.2.1' }, name: 'OtherDB' }, +}; + +stubs['-- Mixed --'] = { + name: 'mixed', + meta: { + id: 'mixed', + info: { version: '1.2.1' }, + name: 'Mixed', + builtIn: true, + }, +}; + +stubs['-- Grafana --'] = { + name: '-- Grafana --', + meta: { + id: 'grafana', + info: { version: '1.2.1' }, + name: 'grafana', + builtIn: true, + }, +}; + function getStub(arg) { - // Stub responses - var stubs = []; - stubs['gfdb'] = { - name: 'gfdb', - meta: { id: 'testdb', info: { version: '1.2.1' }, name: 'TestDB' }, - }; - - stubs['other'] = { - name: 'other', - meta: { id: 'other', info: { version: '1.2.1' }, name: 'OtherDB' }, - }; - - stubs['-- Mixed --'] = { - name: 'mixed', - meta: { - id: 'mixed', - info: { version: '1.2.1' }, - name: 'Mixed', - builtIn: true, - }, - }; - - stubs['-- Grafana --'] = { - name: '-- Grafana --', - meta: { - id: 'grafana', - info: { version: '1.2.1' }, - name: 'grafana', - builtIn: true, - }, - }; - return Promise.resolve(stubs[arg]); }