popover.spec.js 5.1 KB

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