cascader.spec.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  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. clearable
  15. v-model="selectedOptions"
  16. ></el-cascader>
  17. `,
  18. data() {
  19. return {
  20. options: [{
  21. value: 'zhejiang',
  22. label: 'Zhejiang',
  23. children: [{
  24. value: 'hangzhou',
  25. label: 'Hangzhou',
  26. children: [{
  27. value: 'xihu',
  28. label: 'West Lake'
  29. }]
  30. }, {
  31. value: 'ningbo',
  32. label: 'NingBo',
  33. children: [{
  34. value: 'jiangbei',
  35. label: 'Jiang Bei'
  36. }]
  37. }]
  38. }, {
  39. value: 'jiangsu',
  40. label: 'Jiangsu',
  41. children: [{
  42. value: 'nanjing',
  43. label: 'Nanjing',
  44. children: [{
  45. value: 'zhonghuamen',
  46. label: 'Zhong Hua Men'
  47. }]
  48. }]
  49. }],
  50. selectedOptions: []
  51. };
  52. }
  53. }, true);
  54. expect(vm.$el).to.be.exist;
  55. vm.$el.click();
  56. setTimeout(_ => {
  57. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  58. const menu = vm.$refs.cascader.menu;
  59. const menuElm = menu.$el;
  60. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  61. item1.click();
  62. menu.$nextTick(_ => {
  63. expect(menuElm.children.length).to.be.equal(2);
  64. expect(item1.classList.contains('is-active')).to.be.true;
  65. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  66. item2.click();
  67. menu.$nextTick(_ => {
  68. expect(menuElm.children.length).to.be.equal(3);
  69. expect(item2.classList.contains('is-active')).to.be.true;
  70. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  71. item3.click();
  72. setTimeout(_ => {
  73. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  74. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  75. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  76. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  77. triggerEvent(vm.$refs.cascader.$el, 'mouseenter');
  78. vm.$nextTick(_ => {
  79. vm.$refs.cascader.$el.querySelector('.el-cascader__clearIcon').click();
  80. vm.$nextTick(_ => {
  81. expect(vm.selectedOptions.length).to.be.equal(0);
  82. done();
  83. });
  84. });
  85. }, 500);
  86. });
  87. });
  88. }, 300);
  89. });
  90. it('not allow clearable', done => {
  91. vm = createVue({
  92. template: `
  93. <el-cascader
  94. ref="cascader"
  95. placeholder="请选择"
  96. :options="options"
  97. :clearable="false"
  98. v-model="selectedOptions"
  99. ></el-cascader>
  100. `,
  101. data() {
  102. return {
  103. options: [{
  104. value: 'zhejiang',
  105. label: 'Zhejiang',
  106. children: [{
  107. value: 'hangzhou',
  108. label: 'Hangzhou',
  109. children: [{
  110. value: 'xihu',
  111. label: 'West Lake'
  112. }]
  113. }, {
  114. value: 'ningbo',
  115. label: 'NingBo',
  116. children: [{
  117. value: 'jiangbei',
  118. label: 'Jiang Bei'
  119. }]
  120. }]
  121. }, {
  122. value: 'jiangsu',
  123. label: 'Jiangsu',
  124. children: [{
  125. value: 'nanjing',
  126. label: 'Nanjing',
  127. children: [{
  128. value: 'zhonghuamen',
  129. label: 'Zhong Hua Men'
  130. }]
  131. }]
  132. }],
  133. selectedOptions: []
  134. };
  135. }
  136. }, true);
  137. expect(vm.$el).to.be.exist;
  138. triggerEvent(vm.$refs.cascader.$el, 'mouseenter');
  139. vm.$nextTick(_ => {
  140. expect(vm.$refs.cascader.$el.querySelector('.el-cascader__clearIcon')).to.not.exist;
  141. done();
  142. });
  143. });
  144. it('disabled options', 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. disabled: true,
  160. children: [{
  161. value: 'hangzhou',
  162. label: 'Hangzhou',
  163. children: [{
  164. value: 'xihu',
  165. label: 'West Lake'
  166. }]
  167. }, {
  168. value: 'ningbo',
  169. label: 'NingBo',
  170. children: [{
  171. value: 'jiangbei',
  172. label: 'Jiang Bei'
  173. }]
  174. }]
  175. }, {
  176. value: 'jiangsu',
  177. label: 'Jiangsu',
  178. children: [{
  179. value: 'nanjing',
  180. label: 'Nanjing',
  181. children: [{
  182. value: 'zhonghuamen',
  183. label: 'Zhong Hua Men'
  184. }]
  185. }]
  186. }],
  187. selectedOptions: []
  188. };
  189. }
  190. }, true);
  191. expect(vm.$el).to.be.exist;
  192. vm.$el.click();
  193. setTimeout(_ => {
  194. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  195. const menu = vm.$refs.cascader.menu;
  196. const menuElm = menu.$el;
  197. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  198. item1.click();
  199. menu.$nextTick(_ => {
  200. expect(menuElm.children.length).to.be.equal(1);
  201. expect(item1.classList.contains('is-active')).to.be.false;
  202. done();
  203. });
  204. }, 300);
  205. });
  206. it('default value', done => {
  207. vm = createVue({
  208. template: `
  209. <el-cascader
  210. ref="cascader"
  211. placeholder="请选择"
  212. :options="options"
  213. v-model="selectedOptions"
  214. ></el-cascader>
  215. `,
  216. data() {
  217. return {
  218. options: [{
  219. value: 'zhejiang',
  220. label: 'Zhejiang',
  221. children: [{
  222. value: 'hangzhou',
  223. label: 'Hangzhou',
  224. children: [{
  225. value: 'xihu',
  226. label: 'West Lake'
  227. }]
  228. }, {
  229. value: 'ningbo',
  230. label: 'NingBo',
  231. children: [{
  232. value: 'jiangbei',
  233. label: 'Jiang Bei'
  234. }]
  235. }]
  236. }, {
  237. value: 'jiangsu',
  238. label: 'Jiangsu',
  239. children: [{
  240. value: 'nanjing',
  241. label: 'Nanjing',
  242. children: [{
  243. value: 'zhonghuamen',
  244. label: 'Zhong Hua Men'
  245. }]
  246. }]
  247. }],
  248. selectedOptions: ['zhejiang', 'hangzhou', 'xihu']
  249. };
  250. }
  251. }, true);
  252. expect(vm.$el).to.be.exist;
  253. vm.$el.click();
  254. setTimeout(_ => {
  255. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  256. const menu = vm.$refs.cascader.menu;
  257. const menuElm = menu.$el;
  258. const item1 = menuElm.children[0].querySelector('.el-cascader-menu__item');
  259. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  260. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  261. expect(menuElm.children.length).to.be.equal(3);
  262. expect(item1.classList.contains('is-active')).to.be.true;
  263. expect(item2.classList.contains('is-active')).to.be.true;
  264. expect(item3.classList.contains('is-active')).to.be.true;
  265. document.body.click();
  266. setTimeout(_ => {
  267. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  268. done();
  269. }, 500);
  270. }, 300);
  271. });
  272. it('expand by hover', done => {
  273. vm = createVue({
  274. template: `
  275. <el-cascader
  276. ref="cascader"
  277. placeholder="请选择"
  278. :options="options"
  279. expand-trigger="hover"
  280. v-model="selectedOptions"
  281. ></el-cascader>
  282. `,
  283. data() {
  284. return {
  285. options: [{
  286. value: 'zhejiang',
  287. label: 'Zhejiang',
  288. children: [{
  289. value: 'hangzhou',
  290. label: 'Hangzhou',
  291. children: [{
  292. value: 'xihu',
  293. label: 'West Lake'
  294. }]
  295. }, {
  296. value: 'ningbo',
  297. label: 'NingBo',
  298. children: [{
  299. value: 'jiangbei',
  300. label: 'Jiang Bei'
  301. }]
  302. }]
  303. }, {
  304. value: 'jiangsu',
  305. label: 'Jiangsu',
  306. children: [{
  307. value: 'nanjing',
  308. label: 'Nanjing',
  309. children: [{
  310. value: 'zhonghuamen',
  311. label: 'Zhong Hua Men'
  312. }]
  313. }]
  314. }],
  315. selectedOptions: []
  316. };
  317. }
  318. }, true);
  319. expect(vm.$el).to.be.exist;
  320. vm.$el.click();
  321. setTimeout(_ => {
  322. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  323. const menu = vm.$refs.cascader.menu;
  324. const menuElm = menu.$el;
  325. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  326. triggerEvent(item1, 'mouseenter');
  327. menu.$nextTick(_ => {
  328. expect(menuElm.children.length).to.be.equal(2);
  329. expect(item1.classList.contains('is-active')).to.be.true;
  330. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  331. triggerEvent(item2, 'mouseenter');
  332. menu.$nextTick(_ => {
  333. expect(menuElm.children.length).to.be.equal(3);
  334. expect(item2.classList.contains('is-active')).to.be.true;
  335. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  336. item3.click();
  337. setTimeout(_ => {
  338. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  339. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  340. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  341. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  342. done();
  343. }, 500);
  344. });
  345. });
  346. }, 300);
  347. });
  348. it('change on select', done => {
  349. vm = createVue({
  350. template: `
  351. <el-cascader
  352. ref="cascader"
  353. placeholder="请选择"
  354. :options="options"
  355. change-on-select
  356. v-model="selectedOptions"
  357. ></el-cascader>
  358. `,
  359. data() {
  360. return {
  361. options: [{
  362. value: 'zhejiang',
  363. label: 'Zhejiang',
  364. children: [{
  365. value: 'hangzhou',
  366. label: 'Hangzhou',
  367. children: [{
  368. value: 'xihu',
  369. label: 'West Lake'
  370. }]
  371. }, {
  372. value: 'ningbo',
  373. label: 'NingBo',
  374. children: [{
  375. value: 'jiangbei',
  376. label: 'Jiang Bei'
  377. }]
  378. }]
  379. }, {
  380. value: 'jiangsu',
  381. label: 'Jiangsu',
  382. children: [{
  383. value: 'nanjing',
  384. label: 'Nanjing',
  385. children: [{
  386. value: 'zhonghuamen',
  387. label: 'Zhong Hua Men'
  388. }]
  389. }]
  390. }],
  391. selectedOptions: []
  392. };
  393. }
  394. }, true);
  395. expect(vm.$el).to.be.exist;
  396. vm.$el.click();
  397. setTimeout(_ => {
  398. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  399. const menu = vm.$refs.cascader.menu;
  400. const menuElm = menu.$el;
  401. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  402. item1.click();
  403. menu.$nextTick(_ => {
  404. expect(menuElm.children.length).to.be.equal(2);
  405. expect(item1.classList.contains('is-active')).to.be.true;
  406. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  407. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  408. item2.click();
  409. menu.$nextTick(_ => {
  410. expect(menuElm.children.length).to.be.equal(3);
  411. expect(item2.classList.contains('is-active')).to.be.true;
  412. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  413. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  414. item3.click();
  415. setTimeout(_ => {
  416. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  417. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  418. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  419. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  420. done();
  421. }, 500);
  422. });
  423. });
  424. }, 300);
  425. });
  426. it('filterable', done => {
  427. vm = createVue({
  428. template: `
  429. <el-cascader
  430. ref="cascader"
  431. placeholder="请选择"
  432. :options="options"
  433. filterable
  434. :debounce="0"
  435. v-model="selectedOptions"
  436. ></el-cascader>
  437. `,
  438. data() {
  439. return {
  440. options: [{
  441. value: 'zhejiang',
  442. label: 'Zhejiang',
  443. children: [{
  444. value: 'hangzhou',
  445. label: 'Hangzhou',
  446. children: [{
  447. value: 'xihu',
  448. label: 'West Lake'
  449. }]
  450. }, {
  451. value: 'ningbo',
  452. label: 'NingBo',
  453. children: [{
  454. value: 'jiangbei',
  455. label: 'Jiang Bei'
  456. }]
  457. }]
  458. }, {
  459. value: 'jiangsu',
  460. label: 'Jiangsu',
  461. children: [{
  462. value: 'nanjing',
  463. label: 'Nanjing',
  464. children: [{
  465. value: 'zhonghuamen',
  466. label: 'Zhong Hua Men'
  467. }]
  468. }]
  469. }],
  470. selectedOptions: []
  471. };
  472. }
  473. }, true);
  474. expect(vm.$el).to.be.exist;
  475. vm.$el.click();
  476. vm.$nextTick(_ => {
  477. vm.$refs.cascader.handleInputChange('z');
  478. setTimeout(_ => {
  479. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  480. const menu = vm.$refs.cascader.menu;
  481. const menuElm = menu.$el;
  482. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  483. expect(menuElm.children.length).to.be.equal(1);
  484. expect(menuElm.children[0].children.length).to.be.equal(3);
  485. done();
  486. item1.click();
  487. setTimeout(_ => {
  488. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  489. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  490. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  491. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  492. done();
  493. }, 500);
  494. }, 300);
  495. });
  496. });
  497. it('props', done => {
  498. vm = createVue({
  499. template: `
  500. <el-cascader
  501. ref="cascader"
  502. :options="options"
  503. :props="props"
  504. v-model="selectedOptions"
  505. ></el-cascader>
  506. `,
  507. data() {
  508. return {
  509. options: [{
  510. label: 'Zhejiang',
  511. cities: [{
  512. label: 'Hangzhou'
  513. }, {
  514. label: 'NingBo'
  515. }]
  516. }, {
  517. label: 'Jiangsu',
  518. cities: [{
  519. label: 'Nanjing'
  520. }]
  521. }],
  522. props: {
  523. value: 'label',
  524. children: 'cities'
  525. },
  526. selectedOptions: []
  527. };
  528. }
  529. }, true);
  530. vm.$el.click();
  531. setTimeout(_ => {
  532. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  533. const menu = vm.$refs.cascader.menu;
  534. const menuElm = menu.$el;
  535. let items = menuElm.querySelectorAll('.el-cascader-menu__item');
  536. expect(items.length).to.equal(2);
  537. items[0].click();
  538. setTimeout(_ => {
  539. items = menuElm.querySelectorAll('.el-cascader-menu__item');
  540. expect(items.length).to.equal(4);
  541. expect(items[items.length - 1].innerText).to.equal('NingBo');
  542. done();
  543. }, 100);
  544. }, 100);
  545. });
  546. it('show last level', done => {
  547. vm = createVue({
  548. template: `
  549. <el-cascader
  550. ref="cascader"
  551. :options="options"
  552. :show-all-levels="false"
  553. v-model="selectedOptions"
  554. ></el-cascader>
  555. `,
  556. data() {
  557. return {
  558. options: [{
  559. value: 'zhejiang',
  560. label: 'Zhejiang',
  561. children: [{
  562. value: 'hangzhou',
  563. label: 'Hangzhou',
  564. children: [{
  565. value: 'xihu',
  566. label: 'West Lake'
  567. }]
  568. }, {
  569. value: 'ningbo',
  570. label: 'NingBo',
  571. children: [{
  572. value: 'jiangbei',
  573. label: 'Jiang Bei'
  574. }]
  575. }]
  576. }, {
  577. value: 'jiangsu',
  578. label: 'Jiangsu',
  579. children: [{
  580. value: 'nanjing',
  581. label: 'Nanjing',
  582. children: [{
  583. value: 'zhonghuamen',
  584. label: 'Zhong Hua Men'
  585. }]
  586. }]
  587. }],
  588. selectedOptions: ['zhejiang', 'ningbo', 'jiangbei']
  589. };
  590. }
  591. }, true);
  592. setTimeout(_ => {
  593. const span = vm.$el.querySelector('.el-cascader__label');
  594. expect(span.innerText).to.equal('Jiang Bei');
  595. done();
  596. }, 100);
  597. });
  598. });