dropdown.spec.js 9.5 KB

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