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('')($rootScope.$new()); $rootScope.$apply(); angular.extend( content.controller('$ionicScroll').scrollView.options, scrollViewOpts || {} ); el = angular.element('
'); 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); }); });