tree.spec.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834
  1. import { createVue, destroyVM, waitImmediate } from '../util';
  2. const DELAY = 10;
  3. describe('Tree', () => {
  4. let vm;
  5. afterEach(() => {
  6. destroyVM(vm);
  7. });
  8. const getTreeVm = (props, options) => {
  9. return createVue(Object.assign({
  10. template: `
  11. <el-tree ref="tree" :data="data" ${ props }></el-tree>
  12. `,
  13. data() {
  14. return {
  15. defaultExpandedKeys: [],
  16. defaultCheckedKeys: [],
  17. clickedNode: null,
  18. count: 1,
  19. data: [{
  20. id: 1,
  21. label: '一级 1',
  22. children: [{
  23. id: 11,
  24. label: '二级 1-1',
  25. children: [{
  26. id: 111,
  27. label: '三级 1-1'
  28. }]
  29. }]
  30. }, {
  31. id: 2,
  32. label: '一级 2',
  33. children: [{
  34. id: 21,
  35. label: '二级 2-1'
  36. }, {
  37. id: 22,
  38. label: '二级 2-2'
  39. }]
  40. }, {
  41. id: 3,
  42. label: '一级 3',
  43. children: [{
  44. id: 31,
  45. label: '二级 3-1'
  46. }, {
  47. id: 32,
  48. label: '二级 3-2'
  49. }]
  50. }],
  51. defaultProps: {
  52. children: 'children',
  53. label: 'label'
  54. }
  55. };
  56. }
  57. }, options), true);
  58. };
  59. const getDisableTreeVm = (props, options) => {
  60. return createVue(Object.assign({
  61. template: `
  62. <el-tree ref="tree" :data="data" ${ props }></el-tree>
  63. `,
  64. data() {
  65. return {
  66. defaultExpandedKeys: [],
  67. defaultCheckedKeys: [],
  68. clickedNode: null,
  69. count: 1,
  70. data: [{
  71. id: 1,
  72. label: '一级 1',
  73. children: [{
  74. id: 11,
  75. label: '二级 1-1',
  76. children: [{
  77. id: 111,
  78. label: '三级 1-1',
  79. disabled: true
  80. }]
  81. }]
  82. }, {
  83. id: 2,
  84. label: '一级 2',
  85. children: [{
  86. id: 21,
  87. label: '二级 2-1'
  88. }, {
  89. id: 22,
  90. label: '二级 2-2'
  91. }]
  92. }, {
  93. id: 3,
  94. label: '一级 3',
  95. children: [{
  96. id: 31,
  97. label: '二级 3-1'
  98. }, {
  99. id: 32,
  100. label: '二级 3-2'
  101. }]
  102. }],
  103. defaultProps: {
  104. children: 'children',
  105. label: 'label',
  106. disabled: 'disabled'
  107. }
  108. };
  109. }
  110. }, options), true);
  111. };
  112. const ALL_NODE_COUNT = 9;
  113. it('create', () => {
  114. vm = getTreeVm(':props="defaultProps" default-expand-all');
  115. expect(document.querySelector('.el-tree')).to.exist;
  116. expect(document.querySelectorAll('.el-tree > .el-tree-node').length).to.equal(3);
  117. expect(document.querySelectorAll('.el-tree .el-tree-node').length).to.equal(ALL_NODE_COUNT);
  118. vm.data[1].children = [{ label: '二级 2-1' }];
  119. const tree = vm.$children[0];
  120. expect(tree.children).to.deep.equal(vm.data);
  121. });
  122. it('click node', done => {
  123. vm = getTreeVm(':props="defaultProps" @node-click="handleNodeClick"', {
  124. methods: {
  125. handleNodeClick(data) {
  126. this.clickedNode = data;
  127. }
  128. }
  129. });
  130. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  131. firstNode.click();
  132. expect(vm.clickedNode.label).to.equal('一级 1');
  133. setTimeout(() => {
  134. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.true;
  135. firstNode.click();
  136. setTimeout(() => {
  137. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.false;
  138. done();
  139. }, DELAY);
  140. }, DELAY);
  141. });
  142. it('current change', done => {
  143. vm = getTreeVm(':props="defaultProps" @current-change="handleCurrentChange"', {
  144. methods: {
  145. handleCurrentChange(data) {
  146. this.currentNode = data;
  147. }
  148. }
  149. });
  150. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  151. firstNode.click();
  152. expect(vm.currentNode.label).to.equal('一级 1');
  153. done();
  154. });
  155. it('emptyText', (done) => {
  156. vm = getTreeVm(':props="defaultProps"');
  157. vm.data = [];
  158. vm.$nextTick(() => {
  159. expect(vm.$el.querySelectorAll('.el-tree__empty-block').length).to.equal(1);
  160. done();
  161. });
  162. });
  163. it('highlight current', done => {
  164. vm = getTreeVm(':props="defaultProps" highlight-current');
  165. const firstNode = document.querySelector('.el-tree-node');
  166. firstNode.click();
  167. vm.$nextTick(() => {
  168. expect(firstNode.className.indexOf('is-current')).to.not.equal(-1);
  169. done();
  170. });
  171. });
  172. it('expandOnNodeClick', done => {
  173. vm = getTreeVm(':props="defaultProps" :expand-on-click-node="false"');
  174. const firstNode = document.querySelector('.el-tree-node');
  175. firstNode.click();
  176. vm.$nextTick(() => {
  177. expect(firstNode.className.indexOf('is-expanded')).to.equal(-1);
  178. done();
  179. });
  180. });
  181. it('checkOnNodeClick', done => {
  182. vm = getTreeVm(':props="defaultProps" show-checkbox check-on-click-node');
  183. const firstNode = document.querySelector('.el-tree-node');
  184. firstNode.click();
  185. vm.$nextTick(() => {
  186. expect(firstNode.querySelector('input').checked).to.true;
  187. done();
  188. });
  189. });
  190. it('current-node-key', () => {
  191. vm = getTreeVm(':props="defaultProps" default-expand-all highlight-current node-key="id" :current-node-key="11"');
  192. const currentNodeLabel = document.querySelector('.is-current .el-tree-node__label').textContent;
  193. expect(currentNodeLabel).to.be.equal('二级 1-1');
  194. });
  195. it('defaultExpandAll', () => {
  196. vm = getTreeVm(':props="defaultProps" default-expand-all');
  197. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(ALL_NODE_COUNT);
  198. });
  199. it('defaultExpandedKeys', () => {
  200. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  201. created() {
  202. this.defaultExpandedKeys = [1, 3];
  203. }
  204. });
  205. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  206. });
  207. it('defaultExpandedKeys set', (done) => {
  208. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  209. created() {
  210. this.defaultExpandedKeys = [1, 3];
  211. }
  212. });
  213. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  214. vm.defaultExpandedKeys = [2];
  215. vm.data = JSON.parse(JSON.stringify(vm.data));
  216. setTimeout(() => {
  217. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(1);
  218. done();
  219. }, 50);
  220. });
  221. it('filter-node-method', (done) => {
  222. vm = getTreeVm(':props="defaultProps" :filter-node-method="filterNode"', {
  223. methods: {
  224. filterNode(value, data) {
  225. if (!value) return true;
  226. return data.label.indexOf(value) !== -1;
  227. }
  228. }
  229. });
  230. const tree = vm.$refs.tree;
  231. tree.filter('2-1');
  232. setTimeout(() => {
  233. expect(tree.$el.querySelectorAll('.el-tree-node.is-hidden').length).to.equal(3);
  234. done();
  235. }, 100);
  236. });
  237. it('autoExpandParent = true', () => {
  238. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  239. created() {
  240. this.defaultExpandedKeys = [111];
  241. }
  242. });
  243. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(3);
  244. });
  245. it('autoExpandParent = false', (done) => {
  246. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id" :auto-expand-parent="false"', {
  247. created() {
  248. this.defaultExpandedKeys = [11];
  249. }
  250. });
  251. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(0);
  252. const firstNode = document.querySelector('.el-tree-node__content');
  253. firstNode.querySelector('.el-tree-node__expand-icon').click();
  254. setTimeout(() => {
  255. expect(document.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  256. done();
  257. }, 100);
  258. });
  259. it('defaultCheckedKeys & check-strictly = false', () => {
  260. vm = getTreeVm(':props="defaultProps" default-expand-all show-checkbox :default-checked-keys="defaultCheckedKeys" node-key="id"', {
  261. created() {
  262. this.defaultCheckedKeys = [1];
  263. }
  264. });
  265. expect(vm.$el.querySelectorAll('.el-checkbox .is-checked').length).to.equal(3);
  266. });
  267. it('defaultCheckedKeys & check-strictly', () => {
  268. vm = getTreeVm(':props="defaultProps" default-expand-all show-checkbox :default-checked-keys="defaultCheckedKeys" node-key="id" check-strictly', {
  269. created() {
  270. this.defaultCheckedKeys = [1];
  271. }
  272. });
  273. expect(vm.$el.querySelectorAll('.el-checkbox .is-checked').length).to.equal(1);
  274. });
  275. it('show checkbox', done => {
  276. vm = getTreeVm(':props="defaultProps" show-checkbox');
  277. const tree = vm.$children[0];
  278. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  279. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  280. expect(nodeCheckbox).to.be.exist;
  281. nodeCheckbox.click();
  282. setTimeout(() => {
  283. expect(tree.getCheckedNodes().length).to.equal(3);
  284. expect(tree.getCheckedNodes(true).length).to.equal(2);
  285. secondNode.querySelector('.el-tree-node__expand-icon').click();
  286. setTimeout(() => {
  287. const firstLeaf = secondNode.nextElementSibling.querySelector('.el-tree-node__content');
  288. const leafCheckbox = firstLeaf.querySelector('.el-checkbox');
  289. leafCheckbox.click();
  290. setTimeout(() => {
  291. expect(tree.getCheckedNodes().length).to.equal(1);
  292. done();
  293. }, 10);
  294. }, 10);
  295. }, 10);
  296. });
  297. it('check', done => {
  298. const spy = sinon.spy();
  299. vm = getTreeVm(':props="defaultProps" show-checkbox @check="handleCheck"', {
  300. methods: {
  301. handleCheck: spy
  302. }
  303. });
  304. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  305. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  306. expect(nodeCheckbox).to.be.exist;
  307. nodeCheckbox.click();
  308. setTimeout(() => {
  309. expect(spy.calledOnce).to.be.true;
  310. const [data, args] = spy.args[0];
  311. expect(data.id).to.equal(2);
  312. expect(args.checkedNodes.length).to.equal(3);
  313. done();
  314. }, 10);
  315. });
  316. it('setCheckedNodes', (done) => {
  317. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  318. const tree = vm.$children[0];
  319. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  320. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  321. nodeCheckbox.click();
  322. setTimeout(() => {
  323. expect(tree.getCheckedNodes().length).to.equal(3);
  324. expect(tree.getCheckedNodes(true).length).to.equal(2);
  325. setTimeout(() => {
  326. tree.setCheckedNodes([]);
  327. expect(tree.getCheckedNodes().length).to.equal(0);
  328. done();
  329. }, 10);
  330. }, 10);
  331. });
  332. it('setCheckedKeys', async() => {
  333. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  334. const tree = vm.$children[0];
  335. tree.setCheckedKeys([111]);
  336. await waitImmediate();
  337. expect(tree.getCheckedNodes().length).to.equal(3);
  338. expect(tree.getCheckedKeys().length).to.equal(3);
  339. tree.setCheckedKeys([1]);
  340. await waitImmediate();
  341. expect(tree.getCheckedNodes().length).to.equal(3);
  342. expect(tree.getCheckedKeys().length).to.equal(3);
  343. tree.setCheckedKeys([2]);
  344. await waitImmediate();
  345. expect(tree.getCheckedNodes().length).to.equal(3);
  346. expect(tree.getCheckedKeys().length).to.equal(3);
  347. tree.setCheckedKeys([21]);
  348. await waitImmediate();
  349. expect(tree.getCheckedNodes().length).to.equal(1);
  350. expect(tree.getCheckedKeys().length).to.equal(1);
  351. });
  352. it('setCheckedKeys with checkStrictly', async() => {
  353. vm = getTreeVm(':props="defaultProps" checkStrictly show-checkbox node-key="id"');
  354. const tree = vm.$children[0];
  355. tree.setCheckedKeys([111]);
  356. expect(tree.getCheckedNodes().length).to.equal(1);
  357. expect(tree.getCheckedKeys().length).to.equal(1);
  358. tree.setCheckedKeys([1]);
  359. await waitImmediate();
  360. expect(tree.getCheckedNodes().length).to.equal(1);
  361. expect(tree.getCheckedKeys().length).to.equal(1);
  362. tree.setCheckedKeys([2]);
  363. await waitImmediate();
  364. expect(tree.getCheckedNodes().length).to.equal(1);
  365. expect(tree.getCheckedKeys().length).to.equal(1);
  366. tree.setCheckedKeys([21, 22]);
  367. await waitImmediate();
  368. expect(tree.getCheckedNodes().length).to.equal(2);
  369. expect(tree.getCheckedKeys().length).to.equal(2);
  370. });
  371. it('method setChecked', () => {
  372. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  373. const tree = vm.$children[0];
  374. tree.setChecked(111, true, true);
  375. expect(tree.getCheckedNodes().length).to.equal(3);
  376. expect(tree.getCheckedKeys().length).to.equal(3);
  377. tree.setChecked(vm.data[0], false, true);
  378. expect(tree.getCheckedNodes().length).to.equal(0);
  379. expect(tree.getCheckedKeys().length).to.equal(0);
  380. });
  381. it('setCheckedKeys with leafOnly=false', async() => {
  382. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  383. const tree = vm.$children[0];
  384. tree.setCheckedKeys([1, 11, 111, 2], false);
  385. await waitImmediate();
  386. expect(tree.getCheckedNodes().length).to.equal(6);
  387. expect(tree.getCheckedKeys().length).to.equal(6);
  388. });
  389. it('setCheckedKeys with leafOnly=true', async() => {
  390. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  391. const tree = vm.$children[0];
  392. tree.setCheckedKeys([2], true);
  393. await waitImmediate();
  394. expect(tree.getCheckedNodes().length).to.equal(2);
  395. expect(tree.getCheckedKeys().length).to.equal(2);
  396. });
  397. it('setCurrentKey', (done) => {
  398. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  399. const tree = vm.$children[0];
  400. tree.setCurrentKey(111);
  401. vm.$nextTick(() => {
  402. expect(tree.store.currentNode.data.id).to.equal(111);
  403. // cancel highlight
  404. tree.setCurrentKey(null);
  405. vm.$nextTick(() => {
  406. expect(tree.store.currentNode).to.equal(null);
  407. done();
  408. });
  409. });
  410. });
  411. it('setCurrentNode', (done) => {
  412. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  413. const tree = vm.$children[0];
  414. tree.setCurrentNode({
  415. id: 111,
  416. label: '三级 1-1'
  417. });
  418. vm.$nextTick(() => {
  419. expect(tree.store.currentNode.data.id).to.equal(111);
  420. done();
  421. });
  422. });
  423. it('getCurrentKey', (done) => {
  424. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  425. const tree = vm.$children[0];
  426. tree.setCurrentKey(111);
  427. vm.$nextTick(() => {
  428. expect(tree.getCurrentKey()).to.equal(111);
  429. done();
  430. });
  431. });
  432. it('getCurrentNode', (done) => {
  433. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  434. const tree = vm.$children[0];
  435. tree.setCurrentKey(111);
  436. vm.$nextTick(() => {
  437. expect(tree.getCurrentNode().id).to.equal(111);
  438. done();
  439. });
  440. });
  441. it('getNode', () => {
  442. vm = getTreeVm(':props="defaultProps" node-key="id"');
  443. const tree = vm.$children[0];
  444. const node = tree.getNode(111);
  445. expect(node.data.id).to.equal(111);
  446. });
  447. it('remove', (done) => {
  448. vm = getTreeVm(':props="defaultProps" node-key="id"');
  449. const tree = vm.$children[0];
  450. tree.setCurrentKey(1);
  451. expect(tree.getCurrentNode().id).to.equal(1);
  452. tree.remove(1);
  453. vm.$nextTick(() => {
  454. expect(vm.data[0].id).to.equal(2);
  455. expect(tree.getNode(1)).to.equal(null);
  456. expect(tree.getCurrentNode()).to.equal(null);
  457. done();
  458. });
  459. });
  460. it('append', () => {
  461. vm = getTreeVm(':props="defaultProps" node-key="id"');
  462. const tree = vm.$children[0];
  463. const nodeData = { id: 88, label: '88' };
  464. tree.append(nodeData, tree.getNode(1));
  465. expect(vm.data[0].children.length).to.equal(2);
  466. expect(tree.getNode(88).data).to.equal(nodeData);
  467. });
  468. it('insertBefore', () => {
  469. vm = getTreeVm(':props="defaultProps" node-key="id"');
  470. const tree = vm.$children[0];
  471. const nodeData = { id: 88, label: '88' };
  472. tree.insertBefore(nodeData, tree.getNode(11));
  473. expect(vm.data[0].children.length).to.equal(2);
  474. expect(vm.data[0].children[0]).to.equal(nodeData);
  475. expect(tree.getNode(88).data).to.equal(nodeData);
  476. });
  477. it('insertAfter', () => {
  478. vm = getTreeVm(':props="defaultProps" node-key="id"');
  479. const tree = vm.$children[0];
  480. const nodeData = { id: 88, label: '88' };
  481. tree.insertAfter(nodeData, tree.getNode(11));
  482. expect(vm.data[0].children.length).to.equal(2);
  483. expect(vm.data[0].children[1]).to.equal(nodeData);
  484. expect(tree.getNode(88).data).to.equal(nodeData);
  485. });
  486. it('set disabled checkbox', done => {
  487. vm = getDisableTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  488. const node = document.querySelectorAll('.el-tree-node__content')[2];
  489. const nodeCheckbox = node.querySelector('.el-checkbox input');
  490. vm.$nextTick(() => {
  491. expect(nodeCheckbox.disabled).to.equal(true);
  492. done();
  493. });
  494. });
  495. it('check strictly', (done) => {
  496. vm = getTreeVm(':props="defaultProps" show-checkbox check-strictly default-expand-all');
  497. const tree = vm.$children[0];
  498. const secondNode = document.querySelectorAll('.el-tree-node__content')[3];
  499. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  500. nodeCheckbox.click();
  501. expect(tree.getCheckedNodes().length).to.equal(1);
  502. expect(tree.getCheckedNodes(true).length).to.equal(0);
  503. const firstLeaf = secondNode.nextElementSibling.querySelector('.el-tree-node__content');
  504. const leafCheckbox = firstLeaf.querySelector('.el-checkbox');
  505. vm.$nextTick(() => {
  506. leafCheckbox.click();
  507. expect(tree.getCheckedNodes().length).to.equal(2);
  508. done();
  509. });
  510. });
  511. it('render content', () => {
  512. vm = getTreeVm(':props="defaultProps" :render-content="renderContent"', {
  513. methods: {
  514. renderContent(h, node) {
  515. return (
  516. <span class="custom-content">
  517. <el-button>{ node.node.label }</el-button>
  518. </span>
  519. );
  520. }
  521. }
  522. });
  523. const firstNode = document.querySelector('.el-tree-node__content');
  524. expect(firstNode.querySelector('.custom-content')).to.exist;
  525. const button = firstNode.querySelector('.custom-content .el-button');
  526. expect(button).to.exist;
  527. expect(button.querySelector('span').textContent).to.equal('一级 1');
  528. });
  529. it('scoped slot', () => {
  530. vm = createVue({
  531. template: `
  532. <el-tree ref="tree" :data="data">
  533. <div slot-scope="scope" class="custom-tree-template">
  534. <span>{{ scope.node.label }}</span>
  535. <el-button></el-button>
  536. </div>
  537. </el-tree>
  538. `,
  539. data() {
  540. return {
  541. data: [{
  542. id: 1,
  543. label: '一级 1',
  544. children: [{
  545. id: 11,
  546. label: '二级 1-1',
  547. children: [{
  548. id: 111,
  549. label: '三级 1-1'
  550. }]
  551. }]
  552. }, {
  553. id: 2,
  554. label: '一级 2',
  555. children: [{
  556. id: 21,
  557. label: '二级 2-1'
  558. }, {
  559. id: 22,
  560. label: '二级 2-2'
  561. }]
  562. }, {
  563. id: 3,
  564. label: '一级 3',
  565. children: [{
  566. id: 31,
  567. label: '二级 3-1'
  568. }, {
  569. id: 32,
  570. label: '二级 3-2'
  571. }]
  572. }]
  573. };
  574. }
  575. }, true);
  576. const firstNode = document.querySelector('.custom-tree-template');
  577. expect(firstNode).to.exist;
  578. const span = firstNode.querySelector('span');
  579. const button = firstNode.querySelector('.el-button');
  580. expect(span).to.exist;
  581. expect(span.innerText).to.equal('一级 1');
  582. expect(button).to.exist;
  583. });
  584. it('load node', done => {
  585. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" show-checkbox', {
  586. methods: {
  587. loadNode(node, resolve) {
  588. if (node.level === 0) {
  589. return resolve([{ label: 'region1' }, { label: 'region2' }]);
  590. }
  591. if (node.level > 4) return resolve([]);
  592. setTimeout(() => {
  593. resolve([{
  594. label: 'zone' + this.count++
  595. }, {
  596. label: 'zone' + this.count++
  597. }]);
  598. }, 50);
  599. }
  600. }
  601. });
  602. const nodes = document.querySelectorAll('.el-tree-node__content');
  603. expect(nodes.length).to.equal(2);
  604. nodes[0].click();
  605. setTimeout(() => {
  606. expect(document.querySelectorAll('.el-tree-node__content').length).to.equal(4);
  607. done();
  608. }, 100);
  609. });
  610. it('lazy defaultChecked', done => {
  611. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  612. methods: {
  613. loadNode(node, resolve) {
  614. if (node.level === 0) {
  615. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  616. }
  617. if (node.level > 4) return resolve([]);
  618. setTimeout(() => {
  619. resolve([{
  620. label: 'zone' + this.count,
  621. id: this.count++
  622. }, {
  623. label: 'zone' + this.count,
  624. id: this.count++
  625. }]);
  626. }, 50);
  627. }
  628. }
  629. });
  630. const tree = vm.$children[0];
  631. const firstNode = document.querySelector('.el-tree-node__content');
  632. const initStatus = firstNode.querySelector('.is-indeterminate');
  633. expect(initStatus).to.equal(null);
  634. tree.store.setCheckedKeys([3]);
  635. firstNode.querySelector('.el-tree-node__expand-icon').click();
  636. setTimeout(() => {
  637. const clickStatus = firstNode.querySelector('.is-indeterminate');
  638. expect(clickStatus).to.not.equal(null);
  639. const child = document.querySelectorAll('.el-tree-node__content')[1];
  640. expect(child.querySelector('input').checked).to.equal(true);
  641. done();
  642. }, 300);
  643. });
  644. it('lazy expandOnChecked', done => {
  645. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox check-descendants', {
  646. methods: {
  647. loadNode(node, resolve) {
  648. if (node.level === 0) {
  649. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  650. }
  651. if (node.level > 2) return resolve([]);
  652. setTimeout(() => {
  653. resolve([{
  654. label: 'zone' + this.count,
  655. id: this.count++
  656. }, {
  657. label: 'zone' + this.count,
  658. id: this.count++
  659. }]);
  660. }, 10);
  661. }
  662. }
  663. });
  664. const tree = vm.$children[0];
  665. tree.store.setCheckedKeys([1]);
  666. setTimeout(() => {
  667. const checkedKeys = tree.getCheckedKeys();
  668. expect(checkedKeys.length).to.equal(7);
  669. done();
  670. }, 400);
  671. });
  672. it('lazy without expandOnChecked', done => {
  673. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  674. methods: {
  675. loadNode(node, resolve) {
  676. if (node.level === 0) {
  677. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  678. }
  679. if (node.level > 4) return resolve([]);
  680. setTimeout(() => {
  681. resolve([{
  682. label: 'zone' + this.count,
  683. id: this.count++
  684. }, {
  685. label: 'zone' + this.count,
  686. id: this.count++
  687. }]);
  688. }, 50);
  689. }
  690. }
  691. });
  692. const tree = vm.$children[0];
  693. tree.store.setCheckedKeys([1]);
  694. setTimeout(() => {
  695. const nodes = document.querySelectorAll('.el-tree-node__content');
  696. expect(nodes[0].querySelector('input').checked).to.equal(true);
  697. expect(nodes.length).to.equal(2);
  698. done();
  699. }, 300);
  700. });
  701. it('accordion', done => {
  702. vm = getTreeVm(':props="defaultProps" accordion');
  703. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  704. const secondNode = vm.$el.querySelector('.el-tree-node:nth-child(2) .el-tree-node__content');
  705. firstNode.click();
  706. setTimeout(() => {
  707. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.true;
  708. secondNode.click();
  709. setTimeout(() => {
  710. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.false;
  711. done();
  712. }, DELAY);
  713. }, DELAY);
  714. });
  715. it('handleNodeOpen & handleNodeClose', (done) => {
  716. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" @node-expand="handleNodeOpen" @node-collapse="handleNodeClose"', {
  717. methods: {
  718. loadNode(node, resolve) {
  719. if (node.level === 0) {
  720. return resolve([{label: 'region1'}, {label: 'region2'}]);
  721. }
  722. if (node.level > 4) return resolve([]);
  723. setTimeout(() => {
  724. resolve([{
  725. label: 'zone' + this.count++
  726. }, {
  727. label: 'zone' + this.count++
  728. }]);
  729. }, 50);
  730. },
  731. handleNodeOpen(data, node, vm) {
  732. this.currentNode = data;
  733. this.nodeExpended = true;
  734. },
  735. handleNodeClose(data, node, vm) {
  736. this.currentNode = data;
  737. this.nodeExpended = false;
  738. }
  739. }
  740. });
  741. const firstNode = document.querySelector('.el-tree-node__content');
  742. expect(firstNode.nextElementSibling).to.not.exist;
  743. firstNode.click();
  744. setTimeout(() => {
  745. expect(vm.nodeExpended).to.equal(true);
  746. expect(vm.currentNode.label).to.equal('region1');
  747. firstNode.click();
  748. setTimeout(() => {
  749. expect(vm.nodeExpended).to.equal(false);
  750. expect(vm.currentNode.label).to.equal('region1');
  751. done();
  752. }, 100);
  753. }, 100);
  754. });
  755. it('updateKeyChildren', (done) => {
  756. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  757. const tree = vm.$children[0];
  758. tree.updateKeyChildren(1, [{
  759. id: 111,
  760. label: '三级 1-1'
  761. }]);
  762. const node = document.querySelectorAll('.el-tree-node__content')[2];
  763. const label = node.querySelector('.el-tree-node__label');
  764. vm.$nextTick(() => {
  765. expect(tree.store.nodesMap['11']).to.equal(undefined);
  766. expect(tree.store.nodesMap['1'].childNodes[0].data.id).to.equal(111);
  767. expect(label.textContent).to.equal('三级 1-1');
  768. done();
  769. });
  770. });
  771. });