cascader.spec.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. import { createVue, destroyVM, triggerEvent } from '../util';
  2. describe('Cascader', () => {
  3. let vm;
  4. afterEach(() => {
  5. destroyVM(vm);
  6. });
  7. it('create', done => {
  8. vm = createVue({
  9. template: `
  10. <el-cascader
  11. ref="cascader"
  12. placeholder="请选择"
  13. :options="options"
  14. v-model="selectedOptions"
  15. ></el-cascader>
  16. `,
  17. data() {
  18. return {
  19. options: [{
  20. value: 'zhejiang',
  21. label: 'Zhejiang',
  22. children: [{
  23. value: 'hangzhou',
  24. label: 'Hangzhou',
  25. children: [{
  26. value: 'xihu',
  27. label: 'West Lake'
  28. }]
  29. }, {
  30. value: 'ningbo',
  31. label: 'NingBo',
  32. children: [{
  33. value: 'jiangbei',
  34. label: 'Jiang Bei'
  35. }]
  36. }]
  37. }, {
  38. value: 'jiangsu',
  39. label: 'Jiangsu',
  40. children: [{
  41. value: 'nanjing',
  42. label: 'Nanjing',
  43. children: [{
  44. value: 'zhonghuamen',
  45. label: 'Zhong Hua Men'
  46. }]
  47. }]
  48. }],
  49. selectedOptions: []
  50. };
  51. }
  52. }, true);
  53. expect(vm.$el).to.be.exist;
  54. vm.$el.click();
  55. setTimeout(_ => {
  56. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  57. const menu = vm.$refs.cascader.menu;
  58. const menuElm = menu.$el;
  59. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  60. item1.click();
  61. menu.$nextTick(_ => {
  62. expect(menuElm.children.length).to.be.equal(2);
  63. expect(item1.classList.contains('is-active')).to.be.true;
  64. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  65. item2.click();
  66. menu.$nextTick(_ => {
  67. expect(menuElm.children.length).to.be.equal(3);
  68. expect(item2.classList.contains('is-active')).to.be.true;
  69. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  70. item3.click();
  71. setTimeout(_ => {
  72. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  73. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  74. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  75. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  76. done();
  77. }, 500);
  78. });
  79. });
  80. }, 300);
  81. });
  82. it('disabled options', done => {
  83. vm = createVue({
  84. template: `
  85. <el-cascader
  86. ref="cascader"
  87. placeholder="请选择"
  88. :options="options"
  89. v-model="selectedOptions"
  90. ></el-cascader>
  91. `,
  92. data() {
  93. return {
  94. options: [{
  95. value: 'zhejiang',
  96. label: 'Zhejiang',
  97. disabled: true,
  98. children: [{
  99. value: 'hangzhou',
  100. label: 'Hangzhou',
  101. children: [{
  102. value: 'xihu',
  103. label: 'West Lake'
  104. }]
  105. }, {
  106. value: 'ningbo',
  107. label: 'NingBo',
  108. children: [{
  109. value: 'jiangbei',
  110. label: 'Jiang Bei'
  111. }]
  112. }]
  113. }, {
  114. value: 'jiangsu',
  115. label: 'Jiangsu',
  116. children: [{
  117. value: 'nanjing',
  118. label: 'Nanjing',
  119. children: [{
  120. value: 'zhonghuamen',
  121. label: 'Zhong Hua Men'
  122. }]
  123. }]
  124. }],
  125. selectedOptions: []
  126. };
  127. }
  128. }, true);
  129. expect(vm.$el).to.be.exist;
  130. vm.$el.click();
  131. setTimeout(_ => {
  132. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  133. const menu = vm.$refs.cascader.menu;
  134. const menuElm = menu.$el;
  135. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  136. item1.click();
  137. menu.$nextTick(_ => {
  138. expect(menuElm.children.length).to.be.equal(1);
  139. expect(item1.classList.contains('is-active')).to.be.false;
  140. done();
  141. });
  142. }, 300);
  143. });
  144. it('default value', done => {
  145. vm = createVue({
  146. template: `
  147. <el-cascader
  148. ref="cascader"
  149. placeholder="请选择"
  150. :options="options"
  151. v-model="selectedOptions"
  152. ></el-cascader>
  153. `,
  154. data() {
  155. return {
  156. options: [{
  157. value: 'zhejiang',
  158. label: 'Zhejiang',
  159. children: [{
  160. value: 'hangzhou',
  161. label: 'Hangzhou',
  162. children: [{
  163. value: 'xihu',
  164. label: 'West Lake'
  165. }]
  166. }, {
  167. value: 'ningbo',
  168. label: 'NingBo',
  169. children: [{
  170. value: 'jiangbei',
  171. label: 'Jiang Bei'
  172. }]
  173. }]
  174. }, {
  175. value: 'jiangsu',
  176. label: 'Jiangsu',
  177. children: [{
  178. value: 'nanjing',
  179. label: 'Nanjing',
  180. children: [{
  181. value: 'zhonghuamen',
  182. label: 'Zhong Hua Men'
  183. }]
  184. }]
  185. }],
  186. selectedOptions: ['zhejiang', 'hangzhou', 'xihu']
  187. };
  188. }
  189. }, true);
  190. expect(vm.$el).to.be.exist;
  191. vm.$el.click();
  192. setTimeout(_ => {
  193. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  194. const menu = vm.$refs.cascader.menu;
  195. const menuElm = menu.$el;
  196. const item1 = menuElm.children[0].querySelector('.el-cascader-menu__item');
  197. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  198. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  199. expect(menuElm.children.length).to.be.equal(3);
  200. expect(item1.classList.contains('is-active')).to.be.true;
  201. expect(item2.classList.contains('is-active')).to.be.true;
  202. expect(item3.classList.contains('is-active')).to.be.true;
  203. document.body.click();
  204. setTimeout(_ => {
  205. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  206. done();
  207. }, 500);
  208. }, 300);
  209. });
  210. it('expand by hover', done => {
  211. vm = createVue({
  212. template: `
  213. <el-cascader
  214. ref="cascader"
  215. placeholder="请选择"
  216. :options="options"
  217. expand-trigger="hover"
  218. v-model="selectedOptions"
  219. ></el-cascader>
  220. `,
  221. data() {
  222. return {
  223. options: [{
  224. value: 'zhejiang',
  225. label: 'Zhejiang',
  226. children: [{
  227. value: 'hangzhou',
  228. label: 'Hangzhou',
  229. children: [{
  230. value: 'xihu',
  231. label: 'West Lake'
  232. }]
  233. }, {
  234. value: 'ningbo',
  235. label: 'NingBo',
  236. children: [{
  237. value: 'jiangbei',
  238. label: 'Jiang Bei'
  239. }]
  240. }]
  241. }, {
  242. value: 'jiangsu',
  243. label: 'Jiangsu',
  244. children: [{
  245. value: 'nanjing',
  246. label: 'Nanjing',
  247. children: [{
  248. value: 'zhonghuamen',
  249. label: 'Zhong Hua Men'
  250. }]
  251. }]
  252. }],
  253. selectedOptions: []
  254. };
  255. }
  256. }, true);
  257. expect(vm.$el).to.be.exist;
  258. vm.$el.click();
  259. setTimeout(_ => {
  260. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  261. const menu = vm.$refs.cascader.menu;
  262. const menuElm = menu.$el;
  263. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  264. triggerEvent(item1, 'mouseenter');
  265. menu.$nextTick(_ => {
  266. expect(menuElm.children.length).to.be.equal(2);
  267. expect(item1.classList.contains('is-active')).to.be.true;
  268. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  269. triggerEvent(item2, 'mouseenter');
  270. menu.$nextTick(_ => {
  271. expect(menuElm.children.length).to.be.equal(3);
  272. expect(item2.classList.contains('is-active')).to.be.true;
  273. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  274. item3.click();
  275. setTimeout(_ => {
  276. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  277. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  278. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  279. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  280. done();
  281. }, 500);
  282. });
  283. });
  284. }, 300);
  285. });
  286. it('change on select', done => {
  287. vm = createVue({
  288. template: `
  289. <el-cascader
  290. ref="cascader"
  291. placeholder="请选择"
  292. :options="options"
  293. change-on-select
  294. v-model="selectedOptions"
  295. ></el-cascader>
  296. `,
  297. data() {
  298. return {
  299. options: [{
  300. value: 'zhejiang',
  301. label: 'Zhejiang',
  302. children: [{
  303. value: 'hangzhou',
  304. label: 'Hangzhou',
  305. children: [{
  306. value: 'xihu',
  307. label: 'West Lake'
  308. }]
  309. }, {
  310. value: 'ningbo',
  311. label: 'NingBo',
  312. children: [{
  313. value: 'jiangbei',
  314. label: 'Jiang Bei'
  315. }]
  316. }]
  317. }, {
  318. value: 'jiangsu',
  319. label: 'Jiangsu',
  320. children: [{
  321. value: 'nanjing',
  322. label: 'Nanjing',
  323. children: [{
  324. value: 'zhonghuamen',
  325. label: 'Zhong Hua Men'
  326. }]
  327. }]
  328. }],
  329. selectedOptions: []
  330. };
  331. }
  332. }, true);
  333. expect(vm.$el).to.be.exist;
  334. vm.$el.click();
  335. setTimeout(_ => {
  336. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  337. const menu = vm.$refs.cascader.menu;
  338. const menuElm = menu.$el;
  339. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  340. item1.click();
  341. menu.$nextTick(_ => {
  342. expect(menuElm.children.length).to.be.equal(2);
  343. expect(item1.classList.contains('is-active')).to.be.true;
  344. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  345. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  346. item2.click();
  347. menu.$nextTick(_ => {
  348. expect(menuElm.children.length).to.be.equal(3);
  349. expect(item2.classList.contains('is-active')).to.be.true;
  350. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  351. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  352. item3.click();
  353. setTimeout(_ => {
  354. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  355. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  356. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  357. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  358. done();
  359. }, 500);
  360. });
  361. });
  362. }, 300);
  363. });
  364. it('filterable', done => {
  365. vm = createVue({
  366. template: `
  367. <el-cascader
  368. ref="cascader"
  369. placeholder="请选择"
  370. :options="options"
  371. filterable
  372. v-model="selectedOptions"
  373. ></el-cascader>
  374. `,
  375. data() {
  376. return {
  377. options: [{
  378. value: 'zhejiang',
  379. label: 'Zhejiang',
  380. children: [{
  381. value: 'hangzhou',
  382. label: 'Hangzhou',
  383. children: [{
  384. value: 'xihu',
  385. label: 'West Lake'
  386. }]
  387. }, {
  388. value: 'ningbo',
  389. label: 'NingBo',
  390. children: [{
  391. value: 'jiangbei',
  392. label: 'Jiang Bei'
  393. }]
  394. }]
  395. }, {
  396. value: 'jiangsu',
  397. label: 'Jiangsu',
  398. children: [{
  399. value: 'nanjing',
  400. label: 'Nanjing',
  401. children: [{
  402. value: 'zhonghuamen',
  403. label: 'Zhong Hua Men'
  404. }]
  405. }]
  406. }],
  407. selectedOptions: []
  408. };
  409. }
  410. }, true);
  411. expect(vm.$el).to.be.exist;
  412. vm.$refs.cascader.inputValue = 'z';
  413. vm.$el.click();
  414. setTimeout(_ => {
  415. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  416. const menu = vm.$refs.cascader.menu;
  417. const menuElm = menu.$el;
  418. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  419. expect(menuElm.children.length).to.be.equal(1);
  420. expect(menuElm.children[0].children.length).to.be.equal(1);
  421. done();
  422. item1.click();
  423. setTimeout(_ => {
  424. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  425. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  426. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  427. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  428. done();
  429. }, 500);
  430. }, 300);
  431. });
  432. });