core-resource-app-test
Version:
App that contains assets and scripts for the core apps
178 lines (144 loc) • 4.97 kB
text/coffeescript
should = chai.should()
describe 'Infinite Scroll', ->
[$rootScope, $compile, docWindow, $document, $timeout, fakeWindow, origJq] = [undefined]
beforeEach ->
module('infinite-scroll')
beforeEach ->
inject (_$rootScope_, _$compile_, _$window_, _$document_, _$timeout_) ->
$rootScope = _$rootScope_
$compile = _$compile_
$window = _$window_
$document = _$document_
$timeout = _$timeout_
fakeWindow = angular.element($window)
origJq = angular.element
angular.element = (first, args...) ->
if first == $window
fakeWindow
else
origJq(first, args...)
afterEach ->
angular.element = origJq
it 'triggers on scrolling', ->
scroller = """
<div infinite-scroll='scroll()' style='height: 1000px'
infinite-scroll-immediate-check='false'></div>
"""
el = angular.element(scroller)
$document.append(el)
sinon.stub(fakeWindow, 'height').returns(1000)
scope = $rootScope.$new(true)
scope.scroll = sinon.spy()
$compile(el)(scope)
$timeout.flush() # 'immediate' call is with $timeout ..., 0
fakeWindow.scroll()
scope.scroll.should.have.been.calledOnce
el.remove()
scope.$destroy()
it 'triggers immediately by default', ->
scroller = """
<div infinite-scroll='scroll()' style='height: 1000px'></div>
"""
el = angular.element(scroller)
$document.append(el)
sinon.stub(fakeWindow, 'height').returns(1000)
scope = $rootScope.$new(true)
scope.scroll = sinon.spy()
$compile(el)(scope)
$timeout.flush() # 'immediate' call is with $timeout ..., 0
scope.scroll.should.have.been.calledOnce
el.remove()
scope.$destroy()
it 'does not trigger immediately when infinite-scroll-immediate-check is false', ->
scroller = """
<div infinite-scroll='scroll()' infinite-scroll-distance='1'
infinite-scroll-immediate-check='false' style='height: 500px;'></div>
"""
el = angular.element(scroller)
$document.append(el)
sinon.stub(fakeWindow, 'height').returns(1000)
scope = $rootScope.$new(true)
scope.scroll = sinon.spy()
$compile(el)(scope)
$timeout.flush() # 'immediate' call is with $timeout ..., 0
scope.scroll.should.not.have.been.called
fakeWindow.scroll()
scope.scroll.should.have.been.calledOnce
el.remove()
scope.$destroy()
it 'does not trigger when disabled', ->
scroller = """
<div infinite-scroll='scroll()' infinite-scroll-distance='1'
infinite-scroll-disabled='busy' style='height: 500px;'></div>
"""
el = angular.element(scroller)
$document.append(el)
sinon.stub(fakeWindow, 'height').returns(1000)
scope = $rootScope.$new(true)
scope.scroll = sinon.spy()
scope.busy = true
$compile(el)(scope)
scope.$digest()
fakeWindow.scroll()
scope.scroll.should.not.have.been.called
el.remove()
scope.$destroy()
it 're-triggers after being re-enabled', ->
scroller = """
<div infinite-scroll='scroll()' infinite-scroll-distance='1'
infinite-scroll-disabled='busy' style='height: 500px;'></div>
"""
el = angular.element(scroller)
$document.append(el)
sinon.stub(fakeWindow, 'height').returns(1000)
scope = $rootScope.$new(true)
scope.scroll = sinon.spy()
scope.busy = true
$compile(el)(scope)
scope.$digest()
fakeWindow.scroll()
scope.scroll.should.not.have.been.called
scope.busy = false
scope.$digest()
scope.scroll.should.have.been.calledOnce
el.remove()
scope.$destroy()
it 'only triggers when the page has been sufficiently scrolled down', ->
scroller = """
<div infinite-scroll='scroll()'
infinite-scroll-distance='1' style='height: 10000px'></div>
"""
el = angular.element(scroller)
$document.append(el)
sinon.stub(fakeWindow, 'height').returns(1000)
sinon.stub(fakeWindow, 'scrollTop').returns(7999)
scope = $rootScope.$new(true)
scope.scroll = sinon.spy()
$compile(el)(scope)
scope.$digest()
fakeWindow.scroll()
scope.scroll.should.not.have.been.called
fakeWindow.scrollTop.returns(8000)
fakeWindow.scroll()
scope.scroll.should.have.been.calledOnce
el.remove()
scope.$destroy()
it 'respects the infinite-scroll-distance attribute', ->
scroller = """
<div infinite-scroll='scroll()' infinite-scroll-distance='5' style='height: 10000px;'></div>
"""
el = angular.element(scroller)
$document.append(el)
sinon.stub(fakeWindow, 'height').returns(1000)
sinon.stub(fakeWindow, 'scrollTop').returns(3999)
scope = $rootScope.$new(true)
scope.scroll = sinon.spy()
$compile(el)(scope)
scope.$digest()
fakeWindow.scroll()
scope.scroll.should.not.have.been.called
fakeWindow.scrollTop.returns(4000)
fakeWindow.scroll()
scope.scroll.should.have.been.calledOnce
el.remove()
scope.$destroy()