mirror of https://github.com/grafana/grafana.git
				
				
				
			variables: fix when datasource returns error
This commit is contained in:
		
							parent
							
								
									eb2d4b20bc
								
							
						
					
					
						commit
						8aa55ee352
					
				| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import coreModule from 'app/core/core_module';
 | 
					import coreModule from 'app/core/core_module';
 | 
				
			||||||
import { variableTypes } from './variable';
 | 
					import { variableTypes } from './variable';
 | 
				
			||||||
 | 
					import appEvents from 'app/core/app_events';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class VariableEditorCtrl {
 | 
					export class VariableEditorCtrl {
 | 
				
			||||||
  /** @ngInject **/
 | 
					  /** @ngInject **/
 | 
				
			||||||
| 
						 | 
					@ -56,16 +57,13 @@ export class VariableEditorCtrl {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!$scope.current.name.match(/^\w+$/)) {
 | 
					      if (!$scope.current.name.match(/^\w+$/)) {
 | 
				
			||||||
        $scope.appEvent('alert-warning', [
 | 
					        appEvents.emit('alert-warning', ['Validation', 'Only word and digit characters are allowed in variable names']);
 | 
				
			||||||
          'Validation',
 | 
					 | 
				
			||||||
          'Only word and digit characters are allowed in variable names',
 | 
					 | 
				
			||||||
        ]);
 | 
					 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var sameName = _.find($scope.variables, { name: $scope.current.name });
 | 
					      var sameName = _.find($scope.variables, { name: $scope.current.name });
 | 
				
			||||||
      if (sameName && sameName !== $scope.current) {
 | 
					      if (sameName && sameName !== $scope.current) {
 | 
				
			||||||
        $scope.appEvent('alert-warning', ['Validation', 'Variable with the same name already exists']);
 | 
					        appEvents.emit('alert-warning', ['Validation', 'Variable with the same name already exists']);
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,7 +71,7 @@ export class VariableEditorCtrl {
 | 
				
			||||||
        $scope.current.type === 'query' &&
 | 
					        $scope.current.type === 'query' &&
 | 
				
			||||||
        $scope.current.query.match(new RegExp('\\$' + $scope.current.name + '(/| |$)'))
 | 
					        $scope.current.query.match(new RegExp('\\$' + $scope.current.name + '(/| |$)'))
 | 
				
			||||||
      ) {
 | 
					      ) {
 | 
				
			||||||
        $scope.appEvent('alert-warning', [
 | 
					        appEvents.emit('alert-warning', [
 | 
				
			||||||
          'Validation',
 | 
					          'Validation',
 | 
				
			||||||
          'Query cannot contain a reference to itself. Variable: $' + $scope.current.name,
 | 
					          'Query cannot contain a reference to itself. Variable: $' + $scope.current.name,
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
| 
						 | 
					@ -96,11 +94,11 @@ export class VariableEditorCtrl {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $scope.runQuery = function() {
 | 
					    $scope.runQuery = function() {
 | 
				
			||||||
      return variableSrv.updateOptions($scope.current).then(null, function(err) {
 | 
					      return variableSrv.updateOptions($scope.current).catch(err => {
 | 
				
			||||||
        if (err.data && err.data.message) {
 | 
					        if (err.data && err.data.message) {
 | 
				
			||||||
          err.message = err.data.message;
 | 
					          err.message = err.data.message;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $scope.appEvent('alert-error', ['Templating', 'Template variables could not be initialized: ' + err.message]);
 | 
					        appEvents.emit('alert-error', ['Templating', 'Template variables could not be initialized: ' + err.message]);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					import { VariableEditorCtrl } from '../editor_ctrl';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let mockEmit;
 | 
				
			||||||
 | 
					jest.mock('app/core/app_events', () => {
 | 
				
			||||||
 | 
					  mockEmit = jest.fn();
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    emit: mockEmit,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('VariableEditorCtrl', () => {
 | 
				
			||||||
 | 
					  let scope = {
 | 
				
			||||||
 | 
					    runQuery: () => {
 | 
				
			||||||
 | 
					      return Promise.resolve({});
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('When running a variable query and the data source returns an error', () => {
 | 
				
			||||||
 | 
					    beforeEach(() => {
 | 
				
			||||||
 | 
					      const variableSrv = {
 | 
				
			||||||
 | 
					        updateOptions: () => {
 | 
				
			||||||
 | 
					          return Promise.reject({
 | 
				
			||||||
 | 
					            data: { message: 'error' },
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const ctrl = new VariableEditorCtrl(scope, {}, variableSrv, {});
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it('should emit an error', () => {
 | 
				
			||||||
 | 
					      return scope.runQuery().then(res => {
 | 
				
			||||||
 | 
					        expect(mockEmit).toBeCalled();
 | 
				
			||||||
 | 
					        expect(mockEmit.mock.calls[0][0]).toBe('alert-error');
 | 
				
			||||||
 | 
					        expect(mockEmit.mock.calls[0][1][0]).toBe('Templating');
 | 
				
			||||||
 | 
					        expect(mockEmit.mock.calls[0][1][1]).toBe('Template variables could not be initialized: error');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
		Loading…
	
		Reference in New Issue