index.spec.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import Popup from '..';
  2. import { mount, triggerDrag, transitionStub } from '../../../test/utils';
  3. transitionStub();
  4. let wrapper;
  5. afterEach(() => {
  6. wrapper.destroy();
  7. });
  8. test('lazy render', () => {
  9. wrapper = mount(Popup);
  10. expect(wrapper.vm.$el.tagName).toBeFalsy();
  11. wrapper.vm.value = true;
  12. expect(wrapper.vm.$el.tagName).toBeTruthy();
  13. });
  14. test('reset z-index', () => {
  15. wrapper = mount(Popup, {
  16. propsData: {
  17. value: true,
  18. zIndex: 10,
  19. lockScroll: false
  20. }
  21. });
  22. expect(wrapper).toMatchSnapshot();
  23. });
  24. test('popup lock scroll', () => {
  25. const wrapper1 = mount(Popup, {
  26. propsData: {
  27. value: true
  28. }
  29. });
  30. expect(document.body.classList.contains('van-overflow-hidden')).toBeTruthy();
  31. triggerDrag(document, 0, 100);
  32. triggerDrag(document, 0, -150);
  33. const wrapper2 = mount(Popup, {
  34. propsData: {
  35. value: true
  36. }
  37. });
  38. wrapper1.vm.$destroy();
  39. expect(document.body.classList.contains('van-overflow-hidden')).toBeTruthy();
  40. wrapper2.vm.$destroy();
  41. expect(document.body.classList.contains('van-overflow-hidden')).toBeFalsy();
  42. });
  43. test('get container with parent', () => {
  44. const div1 = document.createElement('div');
  45. const div2 = document.createElement('div');
  46. wrapper = mount({
  47. template: `
  48. <div>
  49. <popup :value="true" :get-container="getContainer" />
  50. </div>
  51. `,
  52. components: {
  53. Popup
  54. },
  55. data() {
  56. return {
  57. getContainer: () => div1
  58. };
  59. }
  60. });
  61. const popup = wrapper.find('.van-popup').element;
  62. expect(popup.parentNode).toEqual(div1);
  63. wrapper.vm.getContainer = () => div2;
  64. expect(popup.parentNode).toEqual(div2);
  65. wrapper.vm.getContainer = null;
  66. expect(popup.parentNode).toEqual(wrapper.element);
  67. });
  68. test('get container with selector', () => {
  69. wrapper = mount({
  70. template: `
  71. <div>
  72. <popup class="get-container-selector-1" :value="true" get-container="body"></popup>
  73. <popup class="get-container-selector-2" :value="true" get-container="unknown"></popup>
  74. </div>
  75. `,
  76. components: {
  77. Popup
  78. }
  79. });
  80. const dom1 = document.querySelector('.get-container-selector-1');
  81. const dom2 = wrapper.vm.$el.querySelector('.get-container-selector-2');
  82. expect(dom1.parentNode).toEqual(document.body);
  83. expect(dom2.parentNode).toEqual(wrapper.vm.$el);
  84. });
  85. test('render overlay', () => {
  86. const div = document.createElement('div');
  87. wrapper = mount({
  88. template: `
  89. <div>
  90. <popup :value="true" :get-container="getContainer" />
  91. </div>
  92. `,
  93. components: {
  94. Popup
  95. },
  96. data() {
  97. return {
  98. getContainer: () => div
  99. };
  100. }
  101. });
  102. expect(div.querySelector('.van-overlay')).toBeTruthy();
  103. });
  104. test('watch overlay prop', () => {
  105. const div = document.createElement('div');
  106. wrapper = mount({
  107. template: `
  108. <div>
  109. <popup :value="show" :overlay="overlay" :get-container="getContainer" />
  110. </div>
  111. `,
  112. components: {
  113. Popup
  114. },
  115. data() {
  116. return {
  117. show: false,
  118. overlay: false,
  119. getContainer: () => div
  120. };
  121. }
  122. });
  123. expect(div.querySelector('.van-overlay')).toBeFalsy();
  124. wrapper.setData({ overlay: true });
  125. expect(div.querySelector('.van-overlay')).toBeFalsy();
  126. wrapper.setData({ show: true });
  127. expect(div.querySelector('.van-overlay')).toBeTruthy();
  128. });
  129. test('close on click overlay', () => {
  130. const div = document.createElement('div');
  131. const onClickOverlay = jest.fn();
  132. wrapper = mount({
  133. template: `
  134. <div>
  135. <popup
  136. v-model="value"
  137. :get-container="getContainer"
  138. @click-overlay="onClickOverlay"
  139. />
  140. </div>
  141. `,
  142. components: {
  143. Popup
  144. },
  145. data() {
  146. return {
  147. value: true,
  148. getContainer: () => div
  149. };
  150. },
  151. methods: {
  152. onClickOverlay
  153. }
  154. });
  155. const modal = div.querySelector('.van-overlay');
  156. triggerDrag(modal, 0, -30);
  157. modal.click();
  158. expect(wrapper.vm.value).toBeFalsy();
  159. expect(onClickOverlay).toHaveBeenCalledTimes(1);
  160. });
  161. test('oepn & close event', () => {
  162. wrapper = mount(Popup);
  163. wrapper.vm.value = true;
  164. expect(wrapper.emitted('open')).toBeTruthy();
  165. wrapper.vm.value = false;
  166. expect(wrapper.emitted('close')).toBeTruthy();
  167. });