popover.spec.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. import { createVue, triggerEvent, createTest, destroyVM, wait } from '../util';
  2. import Popover 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('manual', done => {
  42. vm = createVM('manual');
  43. const compo = vm.$refs.popover;
  44. const button = vm.$el.querySelector('button');
  45. triggerEvent(button, 'mouseenter');
  46. expect(compo.showPopper).to.false;
  47. triggerEvent(button, 'mouseleave');
  48. setTimeout(_ => {
  49. expect(compo.showPopper).to.false;
  50. done();
  51. }, 250); // 代码里是 200ms
  52. });
  53. it('focus input in children node', () => {
  54. vm = createVue(`
  55. <div>
  56. <el-popover
  57. ref="popover"
  58. trigger="focus"
  59. content="content">
  60. <div slot="reference">
  61. <input type="text" value="trigger focus" />
  62. </div>
  63. </el-popover>
  64. </div>
  65. `, true);
  66. const compo = vm.$refs.popover;
  67. const input = vm.$el.querySelector('input');
  68. input.focus();
  69. expect(compo.showPopper).to.true;
  70. input.blur();
  71. expect(compo.showPopper).to.false;
  72. });
  73. it('focus textarea in children node', () => {
  74. vm = createVue(`
  75. <div>
  76. <el-popover
  77. ref="popover"
  78. trigger="focus"
  79. content="content">
  80. <div slot="reference">
  81. <textarea></textarea>
  82. </div>
  83. </el-popover>
  84. </div>
  85. `, true);
  86. const compo = vm.$refs.popover;
  87. const textarea = vm.$el.querySelector('textarea');
  88. textarea.focus();
  89. expect(compo.showPopper).to.true;
  90. textarea.blur();
  91. expect(compo.showPopper).to.false;
  92. });
  93. it('focus input', () => {
  94. vm = createVue(`
  95. <div>
  96. <el-popover
  97. ref="popover"
  98. trigger="focus"
  99. content="content">
  100. <input type="text" slot="reference" value="trigger focus" />
  101. </el-popover>
  102. </div>
  103. `, true);
  104. const compo = vm.$refs.popover;
  105. const input = vm.$el.querySelector('input');
  106. input.focus();
  107. expect(compo.showPopper).to.true;
  108. input.blur();
  109. expect(compo.showPopper).to.false;
  110. });
  111. it('focus button', () => {
  112. vm = createVM('focus');
  113. const compo = vm.$refs.popover;
  114. const button = vm.$el.querySelector('button');
  115. triggerEvent(button, 'mousedown');
  116. expect(compo.showPopper).to.true;
  117. triggerEvent(button, 'mouseup');
  118. expect(compo.showPopper).to.false;
  119. });
  120. });
  121. describe('create by directive', () => {
  122. const vm = createVue({
  123. template: `
  124. <div>
  125. <el-popover
  126. ref="popover1"
  127. trigger="click"
  128. content="content">
  129. </el-popover>
  130. <button v-popover:popover1>create by directive</button>
  131. </div>
  132. `,
  133. directives: {
  134. Popover: Popover.directive
  135. }
  136. }, true);
  137. const compo = vm.$refs.popover1;
  138. it('render', () => {
  139. expect(vm.$el.querySelector('.el-popover')).to.have.deep.property('textContent').include('content');
  140. });
  141. it('triggering click', done => {
  142. vm.$el.querySelector('button').click();
  143. expect(compo.popperElm).to.not.exist;
  144. vm.$nextTick(_ => {
  145. const popperElm = compo.popperElm;
  146. expect(getComputedStyle(popperElm).display).to.not.equal('none');
  147. done();
  148. });
  149. });
  150. it('click outside', () => {
  151. document.body.click();
  152. expect(compo.showPopper).to.false;
  153. });
  154. });
  155. describe('create by slot', () => {
  156. const vm = createVue(`
  157. <div>
  158. <el-popover
  159. ref="popover"
  160. trigger="click"
  161. content="content">
  162. <button slot="reference">create by slot</button>
  163. </el-popover>
  164. </div>
  165. `, true);
  166. const compo = vm.$refs.popover;
  167. it('render', () => {
  168. expect(vm.$el.querySelector('.el-popover')).to.have.deep.property('textContent').include('content');
  169. });
  170. it('triggering click', done => {
  171. vm.$el.querySelector('button').click();
  172. expect(compo.popperElm).to.not.exist;
  173. vm.$nextTick(_ => {
  174. const popperElm = compo.popperElm;
  175. expect(getComputedStyle(popperElm).display).to.not.equal('none');
  176. done();
  177. });
  178. });
  179. it('click outside', () => {
  180. document.body.click();
  181. expect(compo.showPopper).to.false;
  182. });
  183. });
  184. it('show/hide events', done => {
  185. vm = createVue({
  186. template: `
  187. <div>
  188. <el-popover
  189. ref="popover"
  190. trigger="click"
  191. @show="handleShow"
  192. @hide="handleHide"
  193. content="content">
  194. <button slot="reference">trigger</button>
  195. </el-popover>
  196. </div>
  197. `,
  198. methods: {
  199. handleShow() {
  200. this.trigger = true;
  201. },
  202. handleHide() {
  203. this.trigger = false;
  204. }
  205. },
  206. data() {
  207. return {
  208. trigger: false
  209. };
  210. }
  211. }, true);
  212. vm.$el.querySelector('button').click();
  213. setTimeout(_ => {
  214. expect(vm.trigger).to.true;
  215. document.body.click();
  216. setTimeout(_ => {
  217. expect(vm.trigger).to.false;
  218. done();
  219. }, 50);
  220. }, 50);
  221. });
  222. describe('open/close delays', () => {
  223. it('100ms open / instant close', async() => {
  224. vm = createVue(`
  225. <div>
  226. <el-popover
  227. ref="popover"
  228. content="content"
  229. trigger="hover"
  230. :open-delay="100"
  231. :close-delay="0">
  232. <button slot="reference">reference</button>
  233. </el-popover>
  234. </div>
  235. `, true);
  236. const compo = vm.$refs.popover;
  237. const button = vm.$el.querySelector('button');
  238. triggerEvent(button, 'mouseenter');
  239. expect(compo.showPopper).to.false;
  240. await wait(150);
  241. expect(compo.showPopper).to.true;
  242. triggerEvent(button, 'mouseleave');
  243. expect(compo.showPopper).to.false;
  244. });
  245. it('instant open / 100ms close', async() => {
  246. vm = createVue(`
  247. <div>
  248. <el-popover
  249. ref="popover"
  250. content="content"
  251. trigger="hover"
  252. :open-delay="0"
  253. :close-delay="100">
  254. <button slot="reference">reference</button>
  255. </el-popover>
  256. </div>
  257. `, true);
  258. const compo = vm.$refs.popover;
  259. const button = vm.$el.querySelector('button');
  260. triggerEvent(button, 'mouseenter');
  261. expect(compo.showPopper).to.true;
  262. triggerEvent(button, 'mouseleave');
  263. expect(compo.showPopper).to.true;
  264. await wait(150);
  265. expect(compo.showPopper).to.false;
  266. });
  267. });
  268. it('destroy event', () => {
  269. vm = createTest(Popover, {
  270. reference: document.createElement('div'),
  271. popper: document.createElement('div')
  272. });
  273. expect(() => vm.$destroy(true)).not.throw();
  274. });
  275. });