dropdown.spec.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. import { createVue, triggerEvent, destroyVM } from '../util';
  2. const keyDown = (el, keyCode) => {
  3. const evt = document.createEvent('Events');
  4. evt.initEvent('keydown', true, true);
  5. evt.keyCode = keyCode;
  6. el.dispatchEvent(evt);
  7. };
  8. describe('Dropdown', () => {
  9. let vm;
  10. afterEach(() => {
  11. destroyVM(vm);
  12. });
  13. it('create', done => {
  14. vm = createVue({
  15. template: `
  16. <el-dropdown ref="dropdown">
  17. <span class="el-dropdown-link">
  18. 下拉菜单<i class="el-icon-caret-bottom el-icon-right"></i>
  19. </span>
  20. <el-dropdown-menu slot="dropdown" class="dropdown-test-creat">
  21. <el-dropdown-item>黄金糕</el-dropdown-item>
  22. <el-dropdown-item>狮子头</el-dropdown-item>
  23. <el-dropdown-item>螺蛳粉</el-dropdown-item>
  24. <el-dropdown-item>双皮奶</el-dropdown-item>
  25. <el-dropdown-item>蚵仔煎</el-dropdown-item>
  26. </el-dropdown-menu>
  27. </el-dropdown>
  28. `
  29. }, true);
  30. let dropdown = vm.$refs.dropdown;
  31. let dropdownElm = dropdown.$el;
  32. let triggerElm = dropdownElm.children[0];
  33. triggerEvent(triggerElm, 'mouseenter');
  34. setTimeout(_ => {
  35. expect(dropdown.visible).to.be.true;
  36. triggerEvent(triggerElm, 'mouseleave');
  37. setTimeout(_ => {
  38. expect(dropdown.visible).to.not.true;
  39. done();
  40. }, 300);
  41. }, 400);
  42. });
  43. it('menu click', done => {
  44. const myCommandObject = { name: 'CommandC' };
  45. vm = createVue({
  46. template: `
  47. <el-dropdown ref="dropdown">
  48. <span class="el-dropdown-link">
  49. 下拉菜单<i class="el-icon-caret-bottom el-icon-right"></i>
  50. </span>
  51. <el-dropdown-menu slot="dropdown">
  52. <el-dropdown-item command="a">黄金糕</el-dropdown-item>
  53. <el-dropdown-item command="b">狮子头</el-dropdown-item>
  54. <el-dropdown-item ref="commandC" :command="myCommandObject">螺蛳粉</el-dropdown-item>
  55. <el-dropdown-item command="d">双皮奶</el-dropdown-item>
  56. <el-dropdown-item command="e">蚵仔煎</el-dropdown-item>
  57. </el-dropdown-menu>
  58. </el-dropdown>
  59. `,
  60. data() {
  61. return {
  62. myCommandObject
  63. };
  64. }
  65. }, true);
  66. let dropdown = vm.$refs.dropdown;
  67. let dropdownElm = dropdown.$el;
  68. let triggerElm = dropdownElm.children[0];
  69. let callback = sinon.spy();
  70. dropdown.$on('command', callback);
  71. triggerEvent(triggerElm, 'mouseenter');
  72. setTimeout(_ => {
  73. vm.$refs.commandC.$el.click();
  74. setTimeout(_ => {
  75. expect(dropdown.visible).to.not.true;
  76. expect(callback.calledWith(myCommandObject)).to.be.true;
  77. done();
  78. }, 300);
  79. }, 300);
  80. });
  81. it('trigger', done => {
  82. vm = createVue({
  83. template: `
  84. <el-dropdown trigger="click" ref="dropdown">
  85. <span class="el-dropdown-link">
  86. 下拉菜单trigger click<i class="el-icon-caret-bottom el-icon-right"></i>
  87. </span>
  88. <el-dropdown-menu slot="dropdown">
  89. <el-dropdown-item>黄金糕</el-dropdown-item>
  90. <el-dropdown-item @click.native="handleClick">狮子头</el-dropdown-item>
  91. <el-dropdown-item>螺蛳粉</el-dropdown-item>
  92. <el-dropdown-item>双皮奶</el-dropdown-item>
  93. <el-dropdown-item>蚵仔煎</el-dropdown-item>
  94. </el-dropdown-menu>
  95. </el-dropdown>
  96. `
  97. }, true);
  98. let dropdownElm = vm.$el;
  99. let dropdown = vm.$refs.dropdown;
  100. let triggerElm = dropdownElm.children[0];
  101. triggerEvent(triggerElm, 'mouseenter');
  102. dropdown.$nextTick(_ => {
  103. expect(dropdown.visible).to.not.true;
  104. triggerElm.click();
  105. setTimeout(_ => {
  106. expect(dropdown.visible).to.be.true;
  107. done();
  108. }, 300);
  109. });
  110. });
  111. it('split button', done => {
  112. vm = createVue({
  113. template: `
  114. <el-dropdown split-button type="primary" ref="dropdown">
  115. 更多菜单
  116. <el-dropdown-menu slot="dropdown" class="dropdown-test-split-button">
  117. <el-dropdown-item>黄金糕</el-dropdown-item>
  118. <el-dropdown-item>狮子头</el-dropdown-item>
  119. <el-dropdown-item>螺蛳粉</el-dropdown-item>
  120. <el-dropdown-item>双皮奶</el-dropdown-item>
  121. <el-dropdown-item>蚵仔煎</el-dropdown-item>
  122. </el-dropdown-menu>
  123. </el-dropdown>
  124. `
  125. }, true);
  126. let dropdown = vm.$refs.dropdown;
  127. let dropdownElm = dropdown.$el;
  128. let triggerElm = dropdownElm.querySelector('.el-dropdown__caret-button');
  129. var callback = sinon.spy();
  130. dropdown.$on('click', callback);
  131. dropdownElm.querySelector('.el-button').click();
  132. setTimeout(_ => {
  133. expect(callback.called).to.be.true;
  134. }, 300);
  135. triggerEvent(triggerElm, 'mouseenter');
  136. setTimeout(_ => {
  137. expect(dropdown.visible).to.be.true;
  138. triggerEvent(triggerElm, 'mouseleave');
  139. setTimeout(_ => {
  140. expect(dropdown.visible).to.not.true;
  141. done();
  142. }, 300);
  143. }, 300);
  144. });
  145. it('hide on click', done => {
  146. vm = createVue({
  147. template: `
  148. <el-dropdown ref="dropdown" :hide-on-click="false">
  149. <span class="el-dropdown-link">
  150. 下拉菜单<i class="el-icon-caret-bottom el-icon-right"></i>
  151. </span>
  152. <el-dropdown-menu slot="dropdown">
  153. <el-dropdown-item command="a">黄金糕</el-dropdown-item>
  154. <el-dropdown-item command="b">狮子头</el-dropdown-item>
  155. <el-dropdown-item ref="commandC" command="c">螺蛳粉</el-dropdown-item>
  156. <el-dropdown-item command="d">双皮奶</el-dropdown-item>
  157. <el-dropdown-item command="e">蚵仔煎</el-dropdown-item>
  158. </el-dropdown-menu>
  159. </el-dropdown>
  160. `
  161. }, true);
  162. let dropdown = vm.$refs.dropdown;
  163. let dropdownElm = dropdown.$el;
  164. let triggerElm = dropdownElm.children[0];
  165. let callback = sinon.spy();
  166. dropdown.$on('command', callback);
  167. triggerEvent(triggerElm, 'mouseenter');
  168. setTimeout(_ => {
  169. vm.$refs.commandC.$el.click();
  170. setTimeout(_ => {
  171. expect(dropdown.visible).to.true;
  172. expect(callback.calledWith('c')).to.be.true;
  173. done();
  174. }, 300);
  175. }, 300);
  176. });
  177. it('triggerElm keydown', done => {
  178. vm = createVue({
  179. template: `
  180. <el-dropdown ref="dropdown">
  181. <span class="el-dropdown-link">
  182. 下拉菜单<i class="el-icon-caret-bottom el-icon-right"></i>
  183. </span>
  184. <el-dropdown-menu slot="dropdown" class="dropdown-test-creat">
  185. <el-dropdown-item>黄金糕</el-dropdown-item>
  186. <el-dropdown-item>狮子头</el-dropdown-item>
  187. <el-dropdown-item>螺蛳粉</el-dropdown-item>
  188. <el-dropdown-item>双皮奶</el-dropdown-item>
  189. <el-dropdown-item>蚵仔煎</el-dropdown-item>
  190. </el-dropdown-menu>
  191. </el-dropdown>
  192. `
  193. }, true);
  194. let dropdown = vm.$refs.dropdown;
  195. let dropdownElm = dropdown.$el;
  196. let triggerElm = dropdownElm.children[0];
  197. keyDown(triggerElm, 13); // enter
  198. setTimeout(() => {
  199. expect(dropdown.visible).to.be.true;
  200. keyDown(triggerElm, 27); // esc
  201. setTimeout(() => {
  202. expect(dropdown.visible).to.be.false;
  203. done();
  204. }, 300);
  205. }, 400);
  206. });
  207. it('dropdown menu keydown', done => {
  208. vm = createVue({
  209. template: `
  210. <el-dropdown ref="dropdown">
  211. <span class="el-dropdown-link">
  212. 下拉菜单<i class="el-icon-caret-bottom el-icon-right"></i>
  213. </span>
  214. <el-dropdown-menu slot="dropdown" class="dropdown-test-creat">
  215. <el-dropdown-item command="a">黄金糕</el-dropdown-item>
  216. <el-dropdown-item command="b">狮子头</el-dropdown-item>
  217. <el-dropdown-item command="c">螺蛳粉</el-dropdown-item>
  218. <el-dropdown-item command="d">双皮奶</el-dropdown-item>
  219. <el-dropdown-item command="e">蚵仔煎</el-dropdown-item>
  220. </el-dropdown-menu>
  221. </el-dropdown>
  222. `
  223. }, true);
  224. let dropdown = vm.$refs.dropdown;
  225. let dropdownElm = dropdown.$el;
  226. let triggerElm = dropdownElm.children[0];
  227. let dropdownMenu = dropdown.dropdownElm;
  228. triggerEvent(triggerElm, 'mouseenter');
  229. setTimeout(() => {
  230. expect(dropdown.visible).to.be.true;
  231. keyDown(dropdownMenu, 40); // down
  232. setTimeout(() => {
  233. keyDown(dropdownMenu, 13); // enter
  234. setTimeout(() => {
  235. expect(dropdown.visible).to.be.false;
  236. done();
  237. }, 100);
  238. }, 100);
  239. }, 300);
  240. });
  241. it('updatePopper', done => {
  242. vm = createVue({
  243. template: `
  244. <el-dropdown ref="dropdown">
  245. <span class="el-dropdown-link">
  246. 下拉菜单<i class="el-icon-caret-bottom el-icon-right"></i>
  247. </span>
  248. <el-dropdown-menu slot="dropdown" class="dropdown-test-creat">
  249. <el-dropdown-item>黄金糕</el-dropdown-item>
  250. <el-dropdown-item>狮子头</el-dropdown-item>
  251. <el-dropdown-item>螺蛳粉</el-dropdown-item>
  252. <el-dropdown-item>双皮奶</el-dropdown-item>
  253. <el-dropdown-item>蚵仔煎</el-dropdown-item>
  254. </el-dropdown-menu>
  255. </el-dropdown>
  256. `
  257. }, true);
  258. let dropdown = vm.$refs.dropdown;
  259. let dropdownElm = dropdown.$el;
  260. let triggerElm = dropdownElm.children[0];
  261. triggerEvent(triggerElm, 'mouseenter');
  262. setTimeout(() => {
  263. const zIndex1 = document.querySelector('.el-dropdown-menu').style.zIndex;
  264. dropdown.broadcast('ElDropdownMenu', 'updatePopper');
  265. setTimeout(() => {
  266. const zIndex2 = document.querySelector('.el-dropdown-menu').style.zIndex;
  267. expect(zIndex2 > zIndex1).to.be.true;
  268. done();
  269. }, 100);
  270. }, 300);
  271. });
  272. });