vue-infinite-scroll.test.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import infiniteScroll from './../../vue-infinite-scroll';
  2. import Vue from 'vue';
  3. const scrollToBottom = (targetElement, distance = 0) => {
  4. if (targetElement === 'parentNode') {
  5. const element = document.querySelector('.app');
  6. element.scrollTop = element.getBoundingClientRect().top + element.getBoundingClientRect().bottom - distance;
  7. } else {
  8. const element = document.querySelector('.app');
  9. element.scrollTop = element.scrollHeight - element.offsetHeight - distance;
  10. }
  11. };
  12. const scrollToTop = (targetElement) => {
  13. document.querySelector('.app').scrollTop = 0;
  14. };
  15. const createVM = (targetElement = 'window', distance = 0, immediate = true) => {
  16. let template;
  17. switch(targetElement) {
  18. case 'window':
  19. template = `<div class="app"
  20. style="height: 1200px; width: 400px; background-color: #000"
  21. v-infinite-scroll="loadMore()"
  22. infinite-scroll-disabled="busy"
  23. infinite-scroll-distance="${distance}"
  24. infinite-scroll-immediate-check="${immediate}"
  25. infinite-scroll-listen-for-event="docheck">
  26. </div>`;
  27. break;
  28. case 'parentNode':
  29. template = `<div class="app"
  30. style="height: 600px; width: 400px; overflow: auto; background-color: #eee;">
  31. <div style="height: 1200px; width: 400px;"
  32. v-infinite-scroll="loadMore()"
  33. infinite-scroll-disabled="busy"
  34. infinite-scroll-distance="${distance}"
  35. infinite-scroll-immediate-check="${immediate}"
  36. infinite-scroll-listen-for-event="docheck">
  37. </div>
  38. </div>`;
  39. break;
  40. case 'currentNode':
  41. default:
  42. template = `<div class="app"
  43. style="height: 600px; width: 400px; background-color: #ccc; overflow: auto;"
  44. v-infinite-scroll="loadMore()"
  45. infinite-scroll-disabled="busy"
  46. infinite-scroll-distance="${distance}"
  47. infinite-scroll-immediate-check="${immediate}"
  48. infinite-scroll-listen-for-event="docheck">
  49. <div style="height: 1000px">1</div>
  50. </div>`;
  51. break;
  52. }
  53. return new Vue({
  54. el() {
  55. const element = document.createElement('div');
  56. document.querySelector('body').appendChild(element);
  57. return element;
  58. },
  59. data() {
  60. return {
  61. busy: false
  62. };
  63. },
  64. template,
  65. methods: {
  66. loadMore() {
  67. this.busy = true;
  68. console.log('loaded!');
  69. }
  70. },
  71. events: {
  72. ['docheck']() {
  73. console.log('tick');
  74. }
  75. }
  76. })
  77. }
  78. describe('init infinite-scroll directive', () => {
  79. beforeAll(done => {
  80. Vue.use(infiniteScroll);
  81. done();
  82. });
  83. it('directive installed', done => {
  84. expect(infiniteScroll.installed).toBe(true);
  85. done();
  86. });
  87. });
  88. const scrollTargetElements = ['parentNode', 'currentNode'];
  89. scrollTargetElements.forEach(targetElement => {
  90. describe(`${targetElement} scroll test`, () => {
  91. let vm;
  92. beforeEach(done =>{
  93. vm = createVM(targetElement);
  94. vm.$nextTick(() => {
  95. spyOn(vm, 'loadMore');
  96. scrollToBottom(targetElement);
  97. scrollToTop(targetElement);
  98. scrollToBottom(targetElement);
  99. setTimeout(done);
  100. });
  101. });
  102. it('the function should be called once', done => {
  103. expect(vm.loadMore.calls.count()).toEqual(1);
  104. done();
  105. });
  106. it('test "infinite-scroll-listen-for-event"', done => {
  107. vm.$emit('docheck');
  108. expect(vm.loadMore.calls.count()).toEqual(2);
  109. done();
  110. });
  111. afterEach(done => {
  112. vm.$destroy(true);
  113. done();
  114. });
  115. });
  116. describe(`${targetElement} scroll distance test`, () => {
  117. let vm;
  118. beforeEach(done => {
  119. vm = createVM(targetElement, 50);
  120. vm.$nextTick(() => {
  121. spyOn(vm, 'loadMore');
  122. setTimeout(done);
  123. });
  124. });
  125. it('the function should be called when scroll to bottom', done => {
  126. scrollToBottom(targetElement, 0);
  127. setTimeout(() => {
  128. expect(vm.loadMore).toHaveBeenCalled();
  129. done();
  130. });
  131. });
  132. it('the function should be called when scroll to the bottom of 50px distance', done => {
  133. scrollToBottom(targetElement, 50);
  134. setTimeout(() => {
  135. expect(vm.loadMore).toHaveBeenCalled();
  136. done();
  137. });
  138. });
  139. it('the function should not be called', done => {
  140. scrollToBottom(targetElement, 51);
  141. setTimeout(() => {
  142. expect(vm.loadMore).not.toHaveBeenCalled();
  143. done();
  144. });
  145. });
  146. afterEach(done => {
  147. vm.$destroy(true);
  148. done();
  149. });
  150. });
  151. });