import infiniteScroll from './../../vue-infinite-scroll'; import Vue from 'vue'; const scrollToBottom = (targetElement, distance = 0) => { if (targetElement === 'parentNode') { const element = document.querySelector('.app'); element.scrollTop = element.getBoundingClientRect().top + element.getBoundingClientRect().bottom - distance; } else { const element = document.querySelector('.app'); element.scrollTop = element.scrollHeight - element.offsetHeight - distance; } }; const scrollToTop = (targetElement) => { document.querySelector('.app').scrollTop = 0; }; const createVM = (targetElement = 'window', distance = 0, immediate = true) => { let template; switch(targetElement) { case 'window': template = `
`; break; case 'parentNode': template = `
`; break; case 'currentNode': default: template = `
1
`; break; } return new Vue({ el() { const element = document.createElement('div'); document.querySelector('body').appendChild(element); return element; }, data() { return { busy: false }; }, template, methods: { loadMore() { this.busy = true; console.log('loaded!'); } }, events: { ['docheck']() { console.log('tick'); } } }) } describe('init infinite-scroll directive', () => { beforeAll(done => { Vue.use(infiniteScroll); done(); }); it('directive installed', done => { expect(infiniteScroll.installed).toBe(true); done(); }); }); const scrollTargetElements = ['parentNode', 'currentNode']; scrollTargetElements.forEach(targetElement => { describe(`${targetElement} scroll test`, () => { let vm; beforeEach(done =>{ vm = createVM(targetElement); vm.$nextTick(() => { spyOn(vm, 'loadMore'); scrollToBottom(targetElement); scrollToTop(targetElement); scrollToBottom(targetElement); setTimeout(done); }); }); it('the function should be called once', done => { expect(vm.loadMore.calls.count()).toEqual(1); done(); }); it('test "infinite-scroll-listen-for-event"', done => { vm.$emit('docheck'); expect(vm.loadMore.calls.count()).toEqual(2); done(); }); afterEach(done => { vm.$destroy(true); done(); }); }); describe(`${targetElement} scroll distance test`, () => { let vm; beforeEach(done => { vm = createVM(targetElement, 50); vm.$nextTick(() => { spyOn(vm, 'loadMore'); setTimeout(done); }); }); it('the function should be called when scroll to bottom', done => { scrollToBottom(targetElement, 0); setTimeout(() => { expect(vm.loadMore).toHaveBeenCalled(); done(); }); }); it('the function should be called when scroll to the bottom of 50px distance', done => { scrollToBottom(targetElement, 50); setTimeout(() => { expect(vm.loadMore).toHaveBeenCalled(); done(); }); }); it('the function should not be called', done => { scrollToBottom(targetElement, 51); setTimeout(() => { expect(vm.loadMore).not.toHaveBeenCalled(); done(); }); }); afterEach(done => { vm.$destroy(true); done(); }); }); });