popover.spec.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import { createVue, triggerEvent, createTest } from '../util';
  2. import Popover, { directive } from 'packages/popover';
  3. describe('Popover', () => {
  4. describe('trigger', () => {
  5. const createVM = (trigger) => {
  6. return createVue(`
  7. <div>
  8. <el-popover
  9. ref="popover"
  10. trigger="${trigger}"
  11. content="content">
  12. <button slot="reference">trigger ${trigger}</button>
  13. </el-popover>
  14. </div>
  15. `, true);
  16. };
  17. it('click', () => {
  18. const vm = createVM('click');
  19. const compo = vm.$refs.popover;
  20. vm.$el.querySelector('button').click();
  21. expect(compo.showPopper).to.true;
  22. document.body.click();
  23. expect(compo.showPopper).to.false;
  24. });
  25. it('hover', done => {
  26. const vm = createVM('hover');
  27. const compo = vm.$refs.popover;
  28. const button = vm.$el.querySelector('button');
  29. triggerEvent(button, 'mouseenter');
  30. expect(compo.showPopper).to.true;
  31. triggerEvent(button, 'mouseleave');
  32. setTimeout(_ => {
  33. expect(compo.showPopper).to.false;
  34. done();
  35. }, 250); // 代码里是 200ms
  36. });
  37. it('focus input in children node', () => {
  38. const vm = createVue(`
  39. <div>
  40. <el-popover
  41. ref="popover"
  42. trigger="focus"
  43. content="content">
  44. <div slot="reference">
  45. <input type="text" value="trigger focus" />
  46. </div>
  47. </el-popover>
  48. </div>
  49. `, true);
  50. const compo = vm.$refs.popover;
  51. const input = vm.$el.querySelector('input');
  52. input.focus();
  53. expect(compo.showPopper).to.true;
  54. input.blur();
  55. expect(compo.showPopper).to.false;
  56. });
  57. it('focus textarea in children node', () => {
  58. const vm = createVue(`
  59. <div>
  60. <el-popover
  61. ref="popover"
  62. trigger="focus"
  63. content="content">
  64. <div slot="reference">
  65. <textarea></textarea>
  66. </div>
  67. </el-popover>
  68. </div>
  69. `, true);
  70. const compo = vm.$refs.popover;
  71. const textarea = vm.$el.querySelector('textarea');
  72. textarea.focus();
  73. expect(compo.showPopper).to.true;
  74. textarea.blur();
  75. expect(compo.showPopper).to.false;
  76. });
  77. it('focus input', () => {
  78. const vm = createVue(`
  79. <div>
  80. <el-popover
  81. ref="popover"
  82. trigger="focus"
  83. content="content">
  84. <input type="text" slot="reference" value="trigger focus" />
  85. </el-popover>
  86. </div>
  87. `, true);
  88. const compo = vm.$refs.popover;
  89. const input = vm.$el.querySelector('input');
  90. input.focus();
  91. expect(compo.showPopper).to.true;
  92. input.blur();
  93. expect(compo.showPopper).to.false;
  94. });
  95. it('focus button', () => {
  96. const vm = createVM('focus');
  97. const compo = vm.$refs.popover;
  98. const button = vm.$el.querySelector('button');
  99. triggerEvent(button, 'mousedown');
  100. expect(compo.showPopper).to.true;
  101. triggerEvent(button, 'mouseup');
  102. expect(compo.showPopper).to.false;
  103. });
  104. });
  105. describe('create by directive', () => {
  106. const vm = createVue({
  107. template: `
  108. <div>
  109. <el-popover
  110. ref="popover1"
  111. trigger="click"
  112. content="content">
  113. </el-popover>
  114. <button v-popover:popover1>create by directive</button>
  115. </div>
  116. `,
  117. directives: {
  118. Popover: directive
  119. }
  120. }, true);
  121. const compo = vm.$refs.popover1;
  122. it('render', () => {
  123. expect(vm.$el.querySelector('.el-popover')).to.have.deep.property('textContent').include('content');
  124. });
  125. it('triggering click', done => {
  126. vm.$el.querySelector('button').click();
  127. expect(compo.popperElm).to.not.exist;
  128. vm.$nextTick(_ => {
  129. expect(compo).to.have.deep.property('popperElm.style.display').not.equal('none');
  130. done();
  131. });
  132. });
  133. it('click outside', () => {
  134. document.body.click();
  135. expect(compo.showPopper).to.false;
  136. });
  137. });
  138. describe('create by slot', () => {
  139. const vm = createVue(`
  140. <div>
  141. <el-popover
  142. ref="popover"
  143. trigger="click"
  144. content="content">
  145. <button slot="reference">create by slot</button>
  146. </el-popover>
  147. </div>
  148. `, true);
  149. const compo = vm.$refs.popover;
  150. it('render', () => {
  151. expect(vm.$el.querySelector('.el-popover')).to.have.deep.property('textContent').include('content');
  152. });
  153. it('triggering click', done => {
  154. vm.$el.querySelector('button').click();
  155. expect(compo.popperElm).to.not.exist;
  156. vm.$nextTick(_ => {
  157. expect(compo).to.have.deep.property('popperElm.style.display').not.equal('none');
  158. done();
  159. });
  160. });
  161. it('click outside', () => {
  162. document.body.click();
  163. expect(compo.showPopper).to.false;
  164. });
  165. });
  166. it('destroy event', () => {
  167. const vm = createTest(Popover, {
  168. reference: document.createElement('div'),
  169. popper: document.createElement('div')
  170. });
  171. expect(() => vm.$destroy(true)).not.throw();
  172. });
  173. });