cascader.spec.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  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. triggerEvent(vm.$refs.cascader.$el, 'mouseenter');
  77. vm.$nextTick(_ => {
  78. vm.$refs.cascader.$el.querySelector('.el-cascader__clearIcon').click();
  79. vm.$nextTick(_ => {
  80. expect(vm.selectedOptions.length).to.be.equal(0);
  81. done();
  82. });
  83. });
  84. }, 500);
  85. });
  86. });
  87. }, 300);
  88. });
  89. it('not allow clearable', done => {
  90. vm = createVue({
  91. template: `
  92. <el-cascader
  93. ref="cascader"
  94. placeholder="请选择"
  95. :options="options"
  96. :clearable="false"
  97. v-model="selectedOptions"
  98. ></el-cascader>
  99. `,
  100. data() {
  101. return {
  102. options: [{
  103. value: 'zhejiang',
  104. label: 'Zhejiang',
  105. children: [{
  106. value: 'hangzhou',
  107. label: 'Hangzhou',
  108. children: [{
  109. value: 'xihu',
  110. label: 'West Lake'
  111. }]
  112. }, {
  113. value: 'ningbo',
  114. label: 'NingBo',
  115. children: [{
  116. value: 'jiangbei',
  117. label: 'Jiang Bei'
  118. }]
  119. }]
  120. }, {
  121. value: 'jiangsu',
  122. label: 'Jiangsu',
  123. children: [{
  124. value: 'nanjing',
  125. label: 'Nanjing',
  126. children: [{
  127. value: 'zhonghuamen',
  128. label: 'Zhong Hua Men'
  129. }]
  130. }]
  131. }],
  132. selectedOptions: []
  133. };
  134. }
  135. }, true);
  136. expect(vm.$el).to.be.exist;
  137. triggerEvent(vm.$refs.cascader.$el, 'mouseenter');
  138. vm.$nextTick(_ => {
  139. expect(vm.$refs.cascader.$el.querySelector('.el-cascader__clearIcon')).to.not.exist;
  140. done();
  141. });
  142. });
  143. it('disabled options', done => {
  144. vm = createVue({
  145. template: `
  146. <el-cascader
  147. ref="cascader"
  148. placeholder="请选择"
  149. :options="options"
  150. v-model="selectedOptions"
  151. ></el-cascader>
  152. `,
  153. data() {
  154. return {
  155. options: [{
  156. value: 'zhejiang',
  157. label: 'Zhejiang',
  158. disabled: true,
  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: []
  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.querySelector('.el-cascader-menu__item');
  197. item1.click();
  198. menu.$nextTick(_ => {
  199. expect(menuElm.children.length).to.be.equal(1);
  200. expect(item1.classList.contains('is-active')).to.be.false;
  201. done();
  202. });
  203. }, 300);
  204. });
  205. it('default value', done => {
  206. vm = createVue({
  207. template: `
  208. <el-cascader
  209. ref="cascader"
  210. placeholder="请选择"
  211. :options="options"
  212. v-model="selectedOptions"
  213. ></el-cascader>
  214. `,
  215. data() {
  216. return {
  217. options: [{
  218. value: 'zhejiang',
  219. label: 'Zhejiang',
  220. children: [{
  221. value: 'hangzhou',
  222. label: 'Hangzhou',
  223. children: [{
  224. value: 'xihu',
  225. label: 'West Lake'
  226. }]
  227. }, {
  228. value: 'ningbo',
  229. label: 'NingBo',
  230. children: [{
  231. value: 'jiangbei',
  232. label: 'Jiang Bei'
  233. }]
  234. }]
  235. }, {
  236. value: 'jiangsu',
  237. label: 'Jiangsu',
  238. children: [{
  239. value: 'nanjing',
  240. label: 'Nanjing',
  241. children: [{
  242. value: 'zhonghuamen',
  243. label: 'Zhong Hua Men'
  244. }]
  245. }]
  246. }],
  247. selectedOptions: ['zhejiang', 'hangzhou', 'xihu']
  248. };
  249. }
  250. }, true);
  251. expect(vm.$el).to.be.exist;
  252. vm.$el.click();
  253. setTimeout(_ => {
  254. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  255. const menu = vm.$refs.cascader.menu;
  256. const menuElm = menu.$el;
  257. const item1 = menuElm.children[0].querySelector('.el-cascader-menu__item');
  258. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  259. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  260. expect(menuElm.children.length).to.be.equal(3);
  261. expect(item1.classList.contains('is-active')).to.be.true;
  262. expect(item2.classList.contains('is-active')).to.be.true;
  263. expect(item3.classList.contains('is-active')).to.be.true;
  264. document.body.click();
  265. setTimeout(_ => {
  266. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  267. done();
  268. }, 500);
  269. }, 300);
  270. });
  271. it('expand by hover', done => {
  272. vm = createVue({
  273. template: `
  274. <el-cascader
  275. ref="cascader"
  276. placeholder="请选择"
  277. :options="options"
  278. expand-trigger="hover"
  279. v-model="selectedOptions"
  280. ></el-cascader>
  281. `,
  282. data() {
  283. return {
  284. options: [{
  285. value: 'zhejiang',
  286. label: 'Zhejiang',
  287. children: [{
  288. value: 'hangzhou',
  289. label: 'Hangzhou',
  290. children: [{
  291. value: 'xihu',
  292. label: 'West Lake'
  293. }]
  294. }, {
  295. value: 'ningbo',
  296. label: 'NingBo',
  297. children: [{
  298. value: 'jiangbei',
  299. label: 'Jiang Bei'
  300. }]
  301. }]
  302. }, {
  303. value: 'jiangsu',
  304. label: 'Jiangsu',
  305. children: [{
  306. value: 'nanjing',
  307. label: 'Nanjing',
  308. children: [{
  309. value: 'zhonghuamen',
  310. label: 'Zhong Hua Men'
  311. }]
  312. }]
  313. }],
  314. selectedOptions: []
  315. };
  316. }
  317. }, true);
  318. expect(vm.$el).to.be.exist;
  319. vm.$el.click();
  320. setTimeout(_ => {
  321. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  322. const menu = vm.$refs.cascader.menu;
  323. const menuElm = menu.$el;
  324. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  325. triggerEvent(item1, 'mouseenter');
  326. menu.$nextTick(_ => {
  327. expect(menuElm.children.length).to.be.equal(2);
  328. expect(item1.classList.contains('is-active')).to.be.true;
  329. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  330. triggerEvent(item2, 'mouseenter');
  331. menu.$nextTick(_ => {
  332. expect(menuElm.children.length).to.be.equal(3);
  333. expect(item2.classList.contains('is-active')).to.be.true;
  334. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  335. item3.click();
  336. setTimeout(_ => {
  337. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  338. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  339. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  340. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  341. done();
  342. }, 500);
  343. });
  344. });
  345. }, 300);
  346. });
  347. it('change on select', done => {
  348. vm = createVue({
  349. template: `
  350. <el-cascader
  351. ref="cascader"
  352. placeholder="请选择"
  353. :options="options"
  354. change-on-select
  355. v-model="selectedOptions"
  356. ></el-cascader>
  357. `,
  358. data() {
  359. return {
  360. options: [{
  361. value: 'zhejiang',
  362. label: 'Zhejiang',
  363. children: [{
  364. value: 'hangzhou',
  365. label: 'Hangzhou',
  366. children: [{
  367. value: 'xihu',
  368. label: 'West Lake'
  369. }]
  370. }, {
  371. value: 'ningbo',
  372. label: 'NingBo',
  373. children: [{
  374. value: 'jiangbei',
  375. label: 'Jiang Bei'
  376. }]
  377. }]
  378. }, {
  379. value: 'jiangsu',
  380. label: 'Jiangsu',
  381. children: [{
  382. value: 'nanjing',
  383. label: 'Nanjing',
  384. children: [{
  385. value: 'zhonghuamen',
  386. label: 'Zhong Hua Men'
  387. }]
  388. }]
  389. }],
  390. selectedOptions: []
  391. };
  392. }
  393. }, true);
  394. expect(vm.$el).to.be.exist;
  395. vm.$el.click();
  396. setTimeout(_ => {
  397. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  398. const menu = vm.$refs.cascader.menu;
  399. const menuElm = menu.$el;
  400. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  401. item1.click();
  402. menu.$nextTick(_ => {
  403. expect(menuElm.children.length).to.be.equal(2);
  404. expect(item1.classList.contains('is-active')).to.be.true;
  405. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  406. const item2 = menuElm.children[1].querySelector('.el-cascader-menu__item');
  407. item2.click();
  408. menu.$nextTick(_ => {
  409. expect(menuElm.children.length).to.be.equal(3);
  410. expect(item2.classList.contains('is-active')).to.be.true;
  411. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  412. const item3 = menuElm.children[2].querySelector('.el-cascader-menu__item');
  413. item3.click();
  414. setTimeout(_ => {
  415. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  416. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  417. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  418. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  419. done();
  420. }, 500);
  421. });
  422. });
  423. }, 300);
  424. });
  425. it('filterable', done => {
  426. vm = createVue({
  427. template: `
  428. <el-cascader
  429. ref="cascader"
  430. placeholder="请选择"
  431. :options="options"
  432. filterable
  433. v-model="selectedOptions"
  434. ></el-cascader>
  435. `,
  436. data() {
  437. return {
  438. options: [{
  439. value: 'zhejiang',
  440. label: 'Zhejiang',
  441. children: [{
  442. value: 'hangzhou',
  443. label: 'Hangzhou',
  444. children: [{
  445. value: 'xihu',
  446. label: 'West Lake'
  447. }]
  448. }, {
  449. value: 'ningbo',
  450. label: 'NingBo',
  451. children: [{
  452. value: 'jiangbei',
  453. label: 'Jiang Bei'
  454. }]
  455. }]
  456. }, {
  457. value: 'jiangsu',
  458. label: 'Jiangsu',
  459. children: [{
  460. value: 'nanjing',
  461. label: 'Nanjing',
  462. children: [{
  463. value: 'zhonghuamen',
  464. label: 'Zhong Hua Men'
  465. }]
  466. }]
  467. }],
  468. selectedOptions: []
  469. };
  470. }
  471. }, true);
  472. expect(vm.$el).to.be.exist;
  473. vm.$refs.cascader.inputValue = 'z';
  474. vm.$el.click();
  475. setTimeout(_ => {
  476. expect(document.body.querySelector('.el-cascader-menus')).to.be.exist;
  477. const menu = vm.$refs.cascader.menu;
  478. const menuElm = menu.$el;
  479. const item1 = menuElm.querySelector('.el-cascader-menu__item');
  480. expect(menuElm.children.length).to.be.equal(1);
  481. expect(menuElm.children[0].children.length).to.be.equal(1);
  482. done();
  483. item1.click();
  484. setTimeout(_ => {
  485. expect(document.body.querySelector('.el-cascader-menus').style.display).to.be.equal('none');
  486. expect(vm.selectedOptions[0]).to.be.equal('zhejiang');
  487. expect(vm.selectedOptions[1]).to.be.equal('hangzhou');
  488. expect(vm.selectedOptions[2]).to.be.equal('xihu');
  489. done();
  490. }, 500);
  491. }, 300);
  492. });
  493. });