Просмотр исходного кода

added some unit tests for graph panel controller

Torkel Ödegaard 11 лет назад
Родитель
Сommit
abc8077a96

+ 1 - 1
src/app/panels/graph/module.html

@@ -1,4 +1,4 @@
-<div  ng-controller='graph'
+<div  ng-controller='GraphCtrl'
       style="min-height:{{panel.height || row.height}}"
       ng-class="{'panel-fullscreen': fullscreen}">
 

+ 7 - 4
src/app/panels/graph/module.js

@@ -19,6 +19,7 @@ define([
   'kbn',
   'moment',
   './timeSeries',
+  'services/panelSrv',
   'services/annotationsSrv',
   'services/datasourceSrv',
   'jquery.flot',
@@ -35,7 +36,7 @@ function (angular, app, $, _, kbn, moment, timeSeries) {
   var module = angular.module('grafana.panels.graph', []);
   app.useModule(module);
 
-  module.controller('graph', function($scope, $rootScope, $timeout, panelSrv, annotationsSrv) {
+  module.controller('GraphCtrl', function($scope, $rootScope, $timeout, panelSrv, annotationsSrv) {
 
     $scope.panelMeta = {
       modals : [],
@@ -190,12 +191,14 @@ function (angular, app, $, _, kbn, moment, timeSeries) {
     $scope.init = function() {
       panelSrv.init($scope);
       $scope.hiddenSeries = {};
-      $scope.get_data();
+      if (!$scope.skipDataOnInit) {
+        $scope.get_data();
+      }
     };
 
     $scope.updateTimeRange = function () {
-      $scope.range = this.filter.timeRange();
-      $scope.rangeUnparsed = this.filter.timeRange(false);
+      $scope.range = $scope.filter.timeRange();
+      $scope.rangeUnparsed = $scope.filter.timeRange(false);
       $scope.resolution = Math.ceil($(window).width() * ($scope.panel.span / 12));
       $scope.interval = '10m';
 

+ 44 - 0
src/test/specs/graph-ctrl-specs.js

@@ -0,0 +1,44 @@
+define([
+  './helpers',
+  'panels/graph/module'
+], function(helpers) {
+  'use strict';
+
+  describe('GraphCtrl', function() {
+    var ctx = new helpers.ControllerTestContext();
+
+    beforeEach(module('grafana.services'));
+    beforeEach(module('grafana.panels.graph'));
+
+    beforeEach(ctx.providePhase());
+    beforeEach(ctx.createControllerPhase('GraphCtrl'));
+
+    describe('get_data with 2 series', function() {
+      beforeEach(function() {
+        ctx.annotationsSrv.getAnnotations = sinon.stub().returns(ctx.$q.when([]));
+        ctx.datasource.query = sinon.stub().returns(ctx.$q.when({
+          data: [
+            { target: 'test.cpu1', datapoints: [[1, 10]]},
+            { target: 'test.cpu2', datapoints: [[1, 10]]}
+          ]
+        }));
+        ctx.scope.render = sinon.spy();
+        ctx.scope.get_data();
+        ctx.scope.$digest();
+      });
+
+      it('should build legend model', function() {
+        expect(ctx.scope.legend[0].alias).to.be('test.cpu1');
+        expect(ctx.scope.legend[1].alias).to.be('test.cpu2');
+      });
+
+      it('should send time series to render', function() {
+        var data = ctx.scope.render.getCall(0).args[0];
+        expect(data.length).to.be(2);
+      });
+
+    });
+  });
+
+});
+

+ 0 - 31
src/test/specs/graph-panel-controller-specs.js

@@ -1,31 +0,0 @@
-/*define([
-  'panels/graphite/module'
-], function() {
-  'use strict';
-
-  describe('Graph panel controller', function() {
-    var _graphPanelCtrl;
-
-    beforeEach(module('grafana.panels.graphite'));
-    beforeEach(module(function($provide){
-      $provide.value('filterSrv',{});
-    }));
-
-    beforeEach(inject(function($controller, $rootScope) {
-      _graphPanelCtrl = $controller('graphite', {
-        $scope: $rootScope.$new()
-      });
-    }));
-
-    describe('init', function() {
-      beforeEach(function() {
-      });
-
-      it('asd', function() {
-
-      });
-    });
-  });
-
-});
-*/

+ 17 - 2
src/test/specs/helpers.js

@@ -1,11 +1,14 @@
 define([
-], function() {
+    'kbn'
+], function(kbn) {
   'use strict';
 
   function ControllerTestContext() {
     var self = this;
 
+    this.timeRange = { from:'now-1h', to: 'now'};
     this.datasource = {};
+    this.annotationsSrv = {};
     this.datasourceSrv = {
       getMetricSources: function() {},
       get: function() { return self.datasource; }
@@ -14,6 +17,7 @@ define([
     this.providePhase = function() {
       return module(function($provide) {
         $provide.value('datasourceSrv', self.datasourceSrv);
+        $provide.value('annotationsSrv', self.annotationsSrv);
       });
     };
 
@@ -22,9 +26,20 @@ define([
         self.scope = $rootScope.$new();
         self.scope.panel = {};
         self.scope.filter = {
-          timeRange: function() {}
+          timeRange: function(parse) {
+            if (!parse) {
+              return self.timeRange;
+            }
+            return {
+              from : kbn.parseDate(self.timeRange.from),
+              to : kbn.parseDate(self.timeRange.to)
+            };
+          }
         };
 
+        self.scope.colors = [];
+        for (var i = 0; i < 50; i++) { self.scope.colors.push('#' + i); }
+
         self.$q = $q;
         self.scope.skipDataOnInit = true;
         self.controller = $controller(controllerName, {

+ 1 - 0
src/test/test-main.js

@@ -118,6 +118,7 @@ require([
     'specs/parser-specs',
     'specs/gfunc-specs',
     'specs/graphiteTargetCtrl-specs',
+    'specs/graph-ctrl-specs',
     'specs/filterSrv-specs',
     'specs/kbn-format-specs',
     'specs/dashboardModel-specs',