diff --git a/www/waterfall_view/package.json b/www/waterfall_view/package.json index aa2b742575b..f1401180f3a 100644 --- a/www/waterfall_view/package.json +++ b/www/waterfall_view/package.json @@ -5,6 +5,6 @@ "npm": ">=1.4.10" }, "devDependencies": { - "guanlecoja": "0.2.9" + "guanlecoja": "0.2.10" } } diff --git a/www/waterfall_view/src/module/main.module.coffee b/www/waterfall_view/src/module/main.module.coffee index d538972881b..5ca4625ca91 100644 --- a/www/waterfall_view/src/module/main.module.coffee +++ b/www/waterfall_view/src/module/main.module.coffee @@ -9,7 +9,7 @@ class WaterfallView extends App class Waterfall extends Controller self = null - constructor: (@$scope, $q, @$window, @$modal, @buildbotService, d3Service, @dataService, scaleService, @$timeout, config) -> + constructor: (@$scope, $q, @$window, @$modal, @buildbotService, d3Service, @dataService, scaleService, config) -> self = @ # Show the loading spinner @@ -374,7 +374,7 @@ class Waterfall extends Controller ### # Event actions ### - mouseOver = (build) -> + @mouseOver = (build) -> e = self.d3.select(@) mouse = self.d3.mouse(@) self.addTicks(build) @@ -430,7 +430,7 @@ class Waterfall extends Controller # Text format .text((step, i) -> "#{i + 1}. #{step.name} #{duration(step)}") - mouseMove = (build) -> + @mouseMove = (build) -> e = self.d3.select(@) # Move the tooltip to the mouse position @@ -438,7 +438,7 @@ class Waterfall extends Controller e.select('.svg-tooltip') .attr('transform', "translate(#{mouse[0]}, #{mouse[1]})") - mouseOut = (build) -> + @mouseOut = (build) -> e = self.d3.select(@) self.removeTicks() self.drawYAxis() @@ -446,7 +446,7 @@ class Waterfall extends Controller # Remove tooltip e.selectAll('.svg-tooltip').remove() - click = (build) -> + @click = (build) -> # Open modal on click modal = self.$modal.open templateUrl: 'waterfall_view/views/modal.html' @@ -457,10 +457,10 @@ class Waterfall extends Controller # Add event listeners builds - .on('mouseover', mouseOver) - .on('mousemove', mouseMove) - .on('mouseout', mouseOut) - .on('click', click) + .on('mouseover', @mouseOver) + .on('mousemove', @mouseMove) + .on('mouseout', @mouseOut) + .on('click', @click) ### # Render the waterfall view diff --git a/www/waterfall_view/src/module/main.module.spec.coffee b/www/waterfall_view/src/module/main.module.spec.coffee index 29affa17f42..43e00e7ab8a 100644 --- a/www/waterfall_view/src/module/main.module.spec.coffee +++ b/www/waterfall_view/src/module/main.module.spec.coffee @@ -1,8 +1,12 @@ beforeEach -> module 'waterfall_view' + # Mock modalService + module ($provide) -> + $provide.service '$modal', -> open: -> + null describe 'Waterfall view controller', -> - $rootScope = $state = elem = w = $document = $window = config = null + $rootScope = $state = elem = w = $document = $window = $modal = config = null injected = ($injector) -> $rootScope = $injector.get('$rootScope') @@ -12,15 +16,18 @@ describe 'Waterfall view controller', -> $state = $injector.get('$state') $document = $injector.get('$document') $window = $injector.get('$window') + $modal = $injector.get('$modal') config = $injector.get('config') elem = angular.element('
') - $document.find('body').append(elem) elem.append($compile('')(scope)) + $document.find('body').append(elem) $state.transitionTo('waterfall') $rootScope.$digest() w = $document.find('.waterfall').scope().w + spyOn(w, 'setHeight').and.callFake -> + beforeEach(inject(injected)) # make sure we remove the element from the dom @@ -41,14 +48,41 @@ describe 'Waterfall view controller', -> it 'should create svg elements', -> expect(elem.find('svg').length).toBeGreaterThan(1) - expect(elem.find('.builder').length).toBeGreaterThan(1) - expect(elem.find('.build').length).toBeGreaterThan(1) + expect(elem.find('g').length).toBeGreaterThan(1) it 'should trigger mouse events on builds', -> - + e = d3.select('.build') + n = e.node() + # Test click event + spyOn($modal, 'open') + expect($modal.open).not.toHaveBeenCalled() + n.__onclick() + expect($modal.open).toHaveBeenCalled() + # Test mouseover + expect(e.select('.svg-tooltip').empty()).toBe(true) + n.__onmouseover({}) + expect(e.select('.svg-tooltip').empty()).toBe(false) + # Test mousemove + event = document.createEvent('MouseEvents') + event.initMouseEvent('mousemove', true, true, window, + 0, 0, 0, 100, 850, false, false, false, false, 0, null) + expect(e.select('.svg-tooltip').attr('transform')).toContain('NaN') + n.__onmousemove(event) + expect(e.select('.svg-tooltip').attr('transform')).not.toContain('NaN') + # Test mouseout + expect(e.select('.svg-tooltip').empty()).toBe(false) + n.__onmouseout({}) + expect(e.select('.svg-tooltip').empty()).toBe(true) it 'should rerender the waterfall on resize', -> spyOn(w, 'render') expect(w.render).not.toHaveBeenCalled() angular.element($window).triggerHandler('resize') expect(w.render).toHaveBeenCalled() + + it 'should rerender the waterfall on data change', -> + spyOn(w, 'render') + expect(w.render).not.toHaveBeenCalled() + #w.loadMore() + $rootScope.$digest() + expect(w.render).toHaveBeenCalled() diff --git a/www/waterfall_view/src/module/modal/modal.controller.spec.coffee b/www/waterfall_view/src/module/modal/modal.controller.spec.coffee index 5e421bf83e1..e109054d5d9 100644 --- a/www/waterfall_view/src/module/modal/modal.controller.spec.coffee +++ b/www/waterfall_view/src/module/modal/modal.controller.spec.coffee @@ -2,7 +2,6 @@ beforeEach -> module 'waterfall_view' # Mock modalService module ($provide) -> - $provide.service '$modal', -> $provide.service '$modalInstance', -> close: -> null diff --git a/www/waterfall_view/src/module/scale/scale.service.spec.coffee b/www/waterfall_view/src/module/scale/scale.service.spec.coffee index 01cd66874d1..1b90c319fba 100644 --- a/www/waterfall_view/src/module/scale/scale.service.spec.coffee +++ b/www/waterfall_view/src/module/scale/scale.service.spec.coffee @@ -70,7 +70,7 @@ describe 'Scale service', -> # Later times have greater Y coordinate expect(idToY(date)).toBeGreaterThan(idToY(date + 10000)) # Out of domain - expect(idToY(1359731102)).toBeUndefined() + expect(idToY(1359731101)).toBeUndefined() expect(idToY.invert(120)).toBeUndefined() it 'should return a builderid to name scale', -> diff --git a/www/waterfall_view/test/buildbot/buildbot.service.coffee b/www/waterfall_view/test/buildbot/buildbot.service.coffee index 7e66a6588e8..2b75120be63 100644 --- a/www/waterfall_view/test/buildbot/buildbot.service.coffee +++ b/www/waterfall_view/test/buildbot/buildbot.service.coffee @@ -46,6 +46,8 @@ builds = [ complete_at: 0 complete: false ] +for build in builds + build.all = -> bind: -> then: -> buildrequests = [ builderid: 1 @@ -72,7 +74,9 @@ class Buildbot extends Service('common') when 'buildrequests' then deferred.resolve buildrequests[0..options.limit-1] else deferred.resolve [] - bind: -> + bind: (scope) -> + deferred.promise.then (b) -> + scope[string] = b deferred.promise getSome: -> deferred.promise @@ -84,7 +88,7 @@ class Buildbot extends Service('common') when 'buildrequests' then deferred.resolve buildrequests else deferred.resolve [] - bind: -> + bind: (scope) -> deferred.promise getList: -> deferred.promise diff --git a/www/waterfall_view/test/d3.service.coffee b/www/waterfall_view/test/d3.service.coffee deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/www/waterfall_view/test/main.coffee b/www/waterfall_view/test/main.coffee index 7e58c1577a0..22e0085c63c 100644 --- a/www/waterfall_view/test/main.coffee +++ b/www/waterfall_view/test/main.coffee @@ -2,9 +2,4 @@ angular.module('common', []).constant 'config', plugins: waterfall_view: { limit: 2 } -angular.module('ngAnimate', []) -# Mock modalService -module ($provide) -> - $provide.service '$modal', -> - $provide.service '$modalInstance', -> - null \ No newline at end of file +angular.module('ngAnimate', []) \ No newline at end of file