|
|
@@ -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}');
|
|
|
+ });
|
|
|
+});
|