diff --git a/www/waterfall_view/src/module/data/data.service.spec.coffee b/www/waterfall_view/src/module/data/data.service.spec.coffee
index a76c344247e..55108714488 100644
--- a/www/waterfall_view/src/module/data/data.service.spec.coffee
+++ b/www/waterfall_view/src/module/data/data.service.spec.coffee
@@ -1,62 +1,21 @@
beforeEach ->
module 'waterfall_view'
-describe 'Scale service', ->
+describe 'Data service', ->
- ###
- # Test data
- ###
- builders = [
- builderid: 1
- name: 'builder1'
- ,
- builderid: 2
- name: 'builder2'
- ,
- builderid: 3
- name: 'builder3'
- ,
- builderid: 4
- name: 'builder4'
- ]
-
- builds = [
- buildid: 1
- builderid: 1
- started_at: 1403059709
- complete_at: 1403059772
- complete: true
- results: 'success'
- ,
- buildid: 2
- builderid: 2
- buildrequestid: 1
- started_at: 1403059802
- complete_at: 1403060287
- complete: true
- results: 'success'
- ,
- buildid: 3
- builderid: 4
- buildrequestid: 2
- started_at: 1403059710
- complete_at: 1403060278
- complete: true
- results: 'failure'
- ,
- buildid: 4
- builderid: 3
- buildrequestid: 2
- started_at: 1403060250
- complete_at: 0
- complete: false
- ]
-
- dataService = null
+ dataService = builds = builders = null
injected = ($injector) ->
$rootScope = $injector.get('$rootScope')
dataService = $injector.get('dataService')
+ buildbotServiceMock = $injector.get('buildbotService')
+
+ # Use mocked buildbotService to get the sample data
+ buildbotServiceMock.all('builds').getList().then (b) ->
+ builds = b
+ buildbotServiceMock.all('builders').getList().then (b) ->
+ builders = b
+ $rootScope.$digest()
beforeEach(inject(injected))
@@ -72,12 +31,13 @@ describe 'Scale service', ->
it 'should add builds to builders', ->
# Add builds to builders
dataService.getGroups(builders, builds, 0)
- # Builders builds length should be equal to all builds length
- buildsInBuilders = 0
for build in builds
- buildsInBuilders += builders[build.builderid - 1].builds.length
# A builder should contain its build
expect(builders[build.builderid - 1].builds).toContain(build)
+ # Builders builds length should be equal to all builds length
+ buildsInBuilders = 0
+ for builder in builders
+ buildsInBuilders += builder.builds.length
expect(buildsInBuilders).toEqual(builds.length)
it 'should create groups', ->
diff --git a/www/waterfall_view/src/module/main.module.coffee b/www/waterfall_view/src/module/main.module.coffee
index cc84090878d..19675ad0281 100644
--- a/www/waterfall_view/src/module/main.module.coffee
+++ b/www/waterfall_view/src/module/main.module.coffee
@@ -30,6 +30,8 @@ class Waterfall extends Controller
# Minimum builder column width (px)
minColumnWidth: cfg.minColumnWidth or 40
+ # Maximum builder column width (px)
+ maxColumnWidth: cfg.maxColumnWidth or 80
# Y axis time format (new line: ^)
timeFormat: cfg.timeFormat or '%x^%I:%M'
@@ -133,12 +135,22 @@ class Waterfall extends Controller
# Set the content width
###
setWidth: ->
- if (@$window.innerWidth - @c.margin.right - @c.margin.left) / @builders.length >= @c.minColumnWidth
- width = '100%'
+ if @c.minColumnWidth > 0 and @c.maxColumnWidth > 0 and @c.minColumnWidth <= @c.maxColumnWidth
+ columnWidth = (@$window.innerWidth - @c.margin.right - @c.margin.left) / @builders.length
+
+ narrower = columnWidth <= @c.maxColumnWidth
+ wider = @c.minColumnWidth <= columnWidth
+
+ width =
+ if narrower and wider then '100%'
+ else if narrower
+ "#{@builders.length * @c.minColumnWidth + @c.margin.right + @c.margin.left}px"
+ else
+ "#{@builders.length * @c.maxColumnWidth + @c.margin.right + @c.margin.left}px"
+
else
- width = "#{@builders.length * @c.minColumnWidth + @c.margin.right + @c.margin.left}px"
- @d3.select('.header-content').style('width', width)
- @d3.select('.inner-content').style('width', width)
+ @$log.error "Bad column width configuration\n\t min: #{@c.minColumnWidth}\n\t max: #{@c.maxColumnWidth}"
+ width = 40
###
# Get the container height
diff --git a/www/waterfall_view/src/module/main.module.spec.coffee b/www/waterfall_view/src/module/main.module.spec.coffee
index 02b6ba8e01e..5f59b1663ef 100644
--- a/www/waterfall_view/src/module/main.module.spec.coffee
+++ b/www/waterfall_view/src/module/main.module.spec.coffee
@@ -2,7 +2,7 @@ beforeEach ->
module 'waterfall_view'
describe 'Waterfall view controller', ->
- $rootScope = $state = elem = w = $document = null
+ $rootScope = $state = elem = w = $document = $window = config = null
injected = ($injector) ->
$rootScope = $injector.get('$rootScope')
@@ -11,6 +11,8 @@ describe 'Waterfall view controller', ->
$controller = $injector.get('$controller')
$state = $injector.get('$state')
$document = $injector.get('$document')
+ $window = $injector.get('$window')
+ config = $injector.get('config')
elem = angular.element('
')
$document.find('body').append(elem)
elem.append($compile('')(scope))
@@ -30,11 +32,22 @@ describe 'Waterfall view controller', ->
expect(w).toBeDefined()
it 'should bind the builds and builders to scope', ->
+ limit = config.plugins.waterfall_view.limit
expect(w.builds).toBeDefined()
- expect(w.builds.length).not.toBe(0)
+ expect(w.builds.length).toBe(limit)
expect(w.builders).toBeDefined()
expect(w.builders.length).not.toBe(0)
- it 'should create 2 svg elements and a lot of svg groups', ->
+ it 'should create svg elements', ->
expect(elem.find('svg').length).toBeGreaterThan(1)
- expect(elem.find('g').length).toBeGreaterThan(10)
+ expect(elem.find('.builder').length).toBeGreaterThan(1)
+ expect(elem.find('.build').length).toBeGreaterThan(1)
+
+ it 'should trigger mouse events on builds', ->
+
+
+ it 'should rerender the waterfall on resize', ->
+ spyOn(w, 'render')
+ expect(w.render).not.toHaveBeenCalled()
+ angular.element($window).triggerHandler('resize')
+ 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
new file mode 100644
index 00000000000..5e421bf83e1
--- /dev/null
+++ b/www/waterfall_view/src/module/modal/modal.controller.spec.coffee
@@ -0,0 +1,46 @@
+beforeEach ->
+ module 'waterfall_view'
+ # Mock modalService
+ module ($provide) ->
+ $provide.service '$modal', ->
+ $provide.service '$modalInstance', -> close: ->
+ null
+
+describe 'Waterfall modal controller', ->
+ createController = $rootScope = $modalInstance = scope = null
+
+ injected = ($injector) ->
+ $controller = $injector.get('$controller')
+ $rootScope = $injector.get('$rootScope')
+ $modalInstance = $injector.get('$modalInstance')
+ scope = $rootScope.$new()
+
+ createController = ->
+ $controller 'waterfallModalController as m',
+ $scope: scope
+ selectedBuild: {}
+
+ beforeEach(inject(injected))
+
+ it 'should be defined', ->
+ createController()
+ m = scope.m
+ expect(m).toBeDefined()
+ # close function should be to defined
+ expect(m.close).toBeDefined()
+ expect(typeof m.close).toBe('function')
+
+ it 'should call close() on stateChangeStart event', ->
+ createController()
+ m = scope.m
+ spyOn(m, 'close')
+ $rootScope.$broadcast('$stateChangeStart')
+ expect(m.close).toHaveBeenCalled()
+
+ it 'should call $modalInstance.close on close()', ->
+ createController()
+ m = scope.m
+ spyOn($modalInstance, 'close')
+ expect($modalInstance.close).not.toHaveBeenCalled()
+ m.close()
+ expect($modalInstance.close).toHaveBeenCalled()
diff --git a/www/waterfall_view/src/module/scale/scale.service.coffee b/www/waterfall_view/src/module/scale/scale.service.coffee
index 4862725350b..b2e9f927f50 100644
--- a/www/waterfall_view/src/module/scale/scale.service.coffee
+++ b/www/waterfall_view/src/module/scale/scale.service.coffee
@@ -40,7 +40,7 @@ class ScaleService extends Factory
if group.min <= date <= group.max
return date
periods.push(group.max - group.min)
- return 0
+ return undefined
# Returns an id to name scale
getBuilderName: (builders) ->
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 7fe2c6bea59..01cd66874d1 100644
--- a/www/waterfall_view/src/module/scale/scale.service.spec.coffee
+++ b/www/waterfall_view/src/module/scale/scale.service.spec.coffee
@@ -3,23 +3,6 @@ beforeEach ->
describe 'Scale service', ->
- ###
- # Test data
- ###
- builders = [
- builderid: 1
- name: 'builder1'
- ,
- builderid: 2
- name: 'builder2'
- ,
- builderid: 3
- name: 'builder3'
- ,
- builderid: 4
- name: 'builder4'
- ]
-
groups = [
# Y.M.D - h:m:s
min: 1325376000 # 2012.01.01 - 0:0:0
@@ -29,15 +12,21 @@ describe 'Scale service', ->
max: 1396450952 # 2014.04.02 - 15:2:32
]
- scaleService = scale = null
+ scaleService = scale = builders = null
injected = ($injector) ->
$rootScope = $injector.get('$rootScope')
- #d3Service = $injector.get('d3Service')
scaleService = $injector.get('scaleService')
+ buildbotServiceMock = $injector.get('buildbotService')
scale = new scaleService(window.d3)
+ # Use mocked buildbotService to get the sample data
+ buildbotServiceMock.all('builders').getList().then (b) ->
+ builders = b
+ $rootScope.$digest()
+
+
beforeEach(inject(injected))
it 'should be defined', ->
@@ -82,6 +71,7 @@ describe 'Scale service', ->
expect(idToY(date)).toBeGreaterThan(idToY(date + 10000))
# Out of domain
expect(idToY(1359731102)).toBeUndefined()
+ expect(idToY.invert(120)).toBeUndefined()
it 'should return a builderid to name scale', ->
# Get new scale
diff --git a/www/waterfall_view/src/module/waterfall.route.spec.coffee b/www/waterfall_view/src/module/waterfall.route.spec.coffee
index c03aa41fe58..26603c347eb 100644
--- a/www/waterfall_view/src/module/waterfall.route.spec.coffee
+++ b/www/waterfall_view/src/module/waterfall.route.spec.coffee
@@ -1,10 +1,4 @@
beforeEach ->
- # Mock modalService
- module ($provide) ->
- $provide.service '$modal', ->
- $provide.service '$modalInstance', ->
- null
-
module 'waterfall_view'
describe 'Waterfall view', ->
diff --git a/www/waterfall_view/test/buildbot/buildbot.service.coffee b/www/waterfall_view/test/buildbot/buildbot.service.coffee
index 00616ec4425..7e66a6588e8 100644
--- a/www/waterfall_view/test/buildbot/buildbot.service.coffee
+++ b/www/waterfall_view/test/buildbot/buildbot.service.coffee
@@ -1,14 +1,18 @@
###
- # Test data
- ###
+# Test data
+###
builders = [
builderid: 1
+ name: 'builder1'
,
builderid: 2
+ name: 'builder2'
,
builderid: 3
+ name: 'builder3'
,
builderid: 4
+ name: 'builder4'
]
builds = [
@@ -17,25 +21,28 @@ builds = [
started_at: 1403059709
complete_at: 1403059772
complete: true
+ results: 'success'
,
buildid: 2
builderid: 2
buildrequestid: 1
- started_at: 1403059711
+ started_at: 1403059802
complete_at: 1403060287
complete: true
+ results: 'success'
,
buildid: 3
- builderid: 4
+ builderid: 2
buildrequestid: 2
started_at: 1403059710
complete_at: 1403060278
complete: true
+ results: 'failure'
,
buildid: 4
builderid: 3
buildrequestid: 2
- started_at: 1403059710
+ started_at: 1403060250
complete_at: 0
complete: false
]
@@ -60,13 +67,15 @@ class Buildbot extends Service('common')
@some = (string, options) ->
deferred = $q.defer()
switch string
- when 'builds' then deferred.resolve builds[0..options.limit]
- when 'builders' then deferred.resolve builders[0..options.limit]
- when 'buildrequests' then deferred.resolve buildrequests[0..options.limit]
+ when 'builds' then deferred.resolve builds[0..options.limit-1]
+ when 'builders' then deferred.resolve builders[0..options.limit-1]
+ when 'buildrequests' then deferred.resolve buildrequests[0..options.limit-1]
else
deferred.resolve []
bind: ->
deferred.promise
+ getSome: ->
+ deferred.promise
@all = (string) =>
deferred = $q.defer()
switch string