-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test(collectionRepeat): finish unit tests
- Loading branch information
Showing
4 changed files
with
204 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,166 @@ | ||
describe('collectionRepeat directive', function() { | ||
|
||
var dataSource, repeatManager; | ||
beforeEach(module('ionic', function($provide) { | ||
$provide.value( | ||
'$collectionDataSource', | ||
jasmine.createSpy('$dataSource').andCallFake(function(opts) { | ||
dataSource = { | ||
options: opts, | ||
setData: jasmine.createSpy('setData') | ||
}; | ||
return dataSource; | ||
}) | ||
); | ||
$provide.value( | ||
'$collectionRepeatManager', | ||
jasmine.createSpy('$repeatManager').andCallFake(function(opts) { | ||
repeatManager = { | ||
options: opts, | ||
resize: jasmine.createSpy('resize') | ||
}; | ||
return repeatManager; | ||
}) | ||
); | ||
})); | ||
|
||
function setup(attrs, scrollViewOpts) { | ||
var el; | ||
inject(function($compile, $rootScope) { | ||
var content = $compile('<ion-content>')($rootScope.$new()); | ||
$rootScope.$apply(); | ||
angular.extend( | ||
content.controller('$ionicScroll').scrollView.options, | ||
scrollViewOpts || {} | ||
); | ||
el = angular.element('<div ' + (attrs||'') + '></div>'); | ||
content.append(el); | ||
$compile(el)(content.scope()); | ||
$rootScope.$apply(); | ||
}); | ||
return el; | ||
} | ||
|
||
describe('errors', function() { | ||
it('should error if scrollView is x and y', function() { | ||
expect(function() { | ||
setup('collection-repeat', {scrollingX:true, scrollingY:true}); | ||
}).toThrow(COLLECTION_REPEAT_SCROLLVIEW_XY_ERROR); | ||
}); | ||
it('should error if scrollView is x and no width', function() { | ||
expect(function() { | ||
setup('collection-repeat collection-item-height', { | ||
scrollingX:true, | ||
scrollingY:false | ||
}); | ||
}).toThrow(COLLECTION_REPEAT_ATTR_WIDTH_ERROR); | ||
}); | ||
it('should error if scrollView is y and no height', function() { | ||
expect(function() { | ||
setup('collection-repeat collection-item-width', { | ||
scrollingX:false, | ||
scrollingY:true | ||
}); | ||
}).toThrow(COLLECTION_REPEAT_ATTR_HEIGHT_ERROR); | ||
}); | ||
it('should error if no repeat expression', function() { | ||
expect(function() { | ||
setup('collection-repeat="bad" collection-item-height="1"'); | ||
}).toThrow(COLLECTION_REPEAT_ATTR_REPEAT_ERROR.replace('%', 'bad')); | ||
}); | ||
}); | ||
|
||
describe('widthGetter & heightGetter', function() { | ||
it('should work with given amounts', function() { | ||
var el = setup('collection-repeat="a in b" collection-item-height="5" collection-item-width="10"'); | ||
expect(dataSource.options.heightGetter()).toBe(5); | ||
expect(dataSource.options.widthGetter()).toBe(10); | ||
}); | ||
it('should default width of y-scroller to 100%', function() { | ||
var el = setup('collection-repeat="a in b" collection-item-height="5"'); | ||
el.controller('$ionicScroll').scrollView.__clientWidth = 200; | ||
expect(dataSource.options.widthGetter()).toBe(200); | ||
}); | ||
it('should default height of x-scroller to 100%', function() { | ||
var el = setup('collection-repeat="a in b" collection-item-width="5"', { | ||
scrollingX: true, | ||
scrollingY: false | ||
}); | ||
el.controller('$ionicScroll').scrollView.__clientHeight = 199; | ||
expect(dataSource.options.heightGetter()).toBe(199); | ||
}); | ||
it('should work with user-inputted percentage height', function() { | ||
var el = setup('collection-repeat="a in b" collection-item-height="\'23%\'"'); | ||
el.controller('$ionicScroll').scrollView.__clientHeight = 300; | ||
expect(dataSource.options.heightGetter()).toEqual(0.23 * 300); | ||
}); | ||
it('should work with user-inputted percentage width', function() { | ||
var el = setup('collection-repeat="a in b" collection-item-width="\'23%\'"', { | ||
scrollingX: true, | ||
scrollingY: false | ||
}); | ||
el.controller('$ionicScroll').scrollView.__clientWidth = 300; | ||
expect(dataSource.options.widthGetter()).toEqual(0.23 * 300); | ||
}); | ||
}); | ||
|
||
it('should error if list is not an array and is truthy', function() { | ||
var el = setup('collection-repeat="item in items" collection-item-height="50"'); | ||
expect(function() { | ||
el.scope().$apply('items = "string"'); | ||
}).toThrow(); | ||
expect(function() { | ||
el.scope().$apply('items = 123'); | ||
}).toThrow(); | ||
expect(function() { | ||
el.scope().$apply('items = {}'); | ||
}).toThrow(); | ||
expect(function() { | ||
el.scope().$apply('items = []'); | ||
}).not.toThrow(); | ||
}); | ||
|
||
it('should rerender on list change', function() { | ||
var el = setup('collection-repeat="item in items" collection-item-height="50"'); | ||
var scrollView = el.controller('$ionicScroll').scrollView; | ||
spyOn(scrollView, 'resize'); | ||
dataSource.setData.reset(); | ||
repeatManager.resize.reset(); | ||
|
||
el.scope().$apply('items = [ 1,2,3 ]'); | ||
expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items); | ||
expect(repeatManager.resize.callCount).toBe(1); | ||
expect(scrollView.resize.callCount).toBe(1); | ||
el.scope().$apply('items = null'); | ||
expect(dataSource.setData).toHaveBeenCalledWith(null); | ||
expect(repeatManager.resize.callCount).toBe(2); | ||
expect(scrollView.resize.callCount).toBe(2); | ||
}); | ||
|
||
it('should rerender on window resize', function() { | ||
var el = setup('collection-repeat="item in items" collection-item-height="50"'); | ||
var scrollView = el.controller('$ionicScroll').scrollView; | ||
spyOn(scrollView, 'resize'); | ||
dataSource.setData.reset(); | ||
repeatManager.resize.reset(); | ||
|
||
el.scope().items = [1,2,3]; | ||
|
||
ionic.trigger('resize', { target: window }); | ||
expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items); | ||
expect(repeatManager.resize.callCount).toBe(1); | ||
expect(scrollView.resize.callCount).toBe(1); | ||
}); | ||
|
||
it('$destroy', function() { | ||
var el = setup('collection-repeat="item in items" collection-item-height="50"'); | ||
dataSource.destroy = jasmine.createSpy('dataSourceDestroy'); | ||
repeatManager.destroy = jasmine.createSpy('repeatManagerDestroy'); | ||
spyOn(ionic, 'off'); | ||
|
||
el.scope().$destroy(); | ||
expect(dataSource.destroy).toHaveBeenCalled(); | ||
expect(repeatManager.destroy).toHaveBeenCalled(); | ||
expect(ionic.off).toHaveBeenCalledWith('resize', jasmine.any(Function), window); | ||
}); | ||
}); |