treeMultiple.test.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. import { Tree, Icon } from '../../index';
  2. // import toJson from 'enzyme-to-json';
  3. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  4. const treeChildren = [
  5. {
  6. label: '北京',
  7. value: 'Beijing',
  8. key: 'beijing',
  9. },
  10. {
  11. label: '上海',
  12. value: 'Shanghai',
  13. key: 'shanghai',
  14. },
  15. ];
  16. const treeData = [
  17. {
  18. label: '亚洲',
  19. value: 'Yazhou',
  20. key: 'yazhou',
  21. children: [
  22. {
  23. label: '中国',
  24. value: 'Zhongguo',
  25. key: 'zhongguo',
  26. children: treeChildren,
  27. },
  28. {
  29. label: '日本',
  30. value: 'Riben',
  31. key: 'riben',
  32. children: [
  33. {
  34. label: '东京',
  35. value: 'Dongjing',
  36. key: 'dongjing'
  37. },
  38. {
  39. label: '大阪',
  40. value: 'Daban',
  41. key: 'daban'
  42. }
  43. ]
  44. },
  45. ],
  46. },
  47. {
  48. label: '北美洲',
  49. value: 'Beimeizhou',
  50. key: 'beimeizhou',
  51. children: [
  52. {
  53. label: '美国',
  54. value: 'Meiguo',
  55. key: 'meiguo'
  56. },
  57. {
  58. label: '加拿大',
  59. value: 'Jianada',
  60. key: 'jianada'
  61. }
  62. ]
  63. },
  64. ];
  65. const treeDataWithDisabled = [
  66. {
  67. label: 'Asia',
  68. value: 'Asia',
  69. key: '0',
  70. children: [
  71. {
  72. label: 'China',
  73. value: 'China',
  74. key: '0-0',
  75. children: [
  76. {
  77. label: 'Beijing',
  78. value: 'Beijing',
  79. key: '0-0-0',
  80. disabled: true,
  81. },
  82. {
  83. label: 'Shanghai',
  84. value: 'Shanghai',
  85. key: '0-0-1',
  86. disabled: true,
  87. },
  88. ],
  89. },
  90. {
  91. label: 'Japan',
  92. value: 'Japan',
  93. key: '0-1',
  94. children: [
  95. {
  96. label: 'Osaka',
  97. value: 'Osaka',
  98. key: '0-1-0'
  99. }
  100. ]
  101. },
  102. ],
  103. },
  104. {
  105. label: 'North America',
  106. value: 'North America',
  107. key: '1',
  108. children: [
  109. {
  110. label: 'United States',
  111. value: 'United States',
  112. key: '1-0'
  113. },
  114. {
  115. label: 'Canada',
  116. value: 'Canada',
  117. key: '1-1'
  118. }
  119. ]
  120. }
  121. ];
  122. function getTree(props, haveDisabled = false) {
  123. if (haveDisabled) {
  124. props = { treeData: treeDataWithDisabled, ...props }
  125. } else {
  126. props = { treeData: treeData, ...props }
  127. }
  128. return mount(
  129. <Tree
  130. multiple
  131. {...props}
  132. />,
  133. {
  134. attachTo: document.getElementById('container')
  135. }
  136. );
  137. }
  138. describe('Tree', () => {
  139. beforeEach(() => {
  140. // Avoid `attachTo: document.body` Warning
  141. const div = document.createElement('div');
  142. div.setAttribute('id', 'container');
  143. document.body.appendChild(div);
  144. });
  145. afterEach(() => {
  146. const div = document.getElementById('container');
  147. if (div) {
  148. document.body.removeChild(div);
  149. }
  150. document.body.innerHTML = '';
  151. });
  152. it('defaultValue + leaf item checked', () => {
  153. // auto expand parent, if node exist means parent is open
  154. let tree = getTree({
  155. defaultValue: 'Beijing'
  156. });
  157. let selectedNode = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  158. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  159. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  160. tree.unmount();
  161. // array case select both
  162. let tree2 = getTree({
  163. defaultValue: ['Dongjing', 'Beijing']
  164. });
  165. let level3Nodes = tree2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  166. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  167. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  168. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  169. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('东京');
  170. })
  171. it('defaultValue + leaf item checked => half checked parent', () => {
  172. let tree = getTree({
  173. defaultValue: ['Dongjing', 'Beijing']
  174. });
  175. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  176. let level2Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  177. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  178. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  179. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  180. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  181. expect(level2Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).exists()).toEqual(true);
  182. })
  183. it('defaultValue + leaf item checked => checked parent', () => {
  184. let tree = getTree({
  185. defaultValue: ['Shanghai', 'Beijing']
  186. });
  187. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  188. let level2Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  189. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  190. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  191. })
  192. it('defaultValue + all leaf items checked => checked ancesters', () => {
  193. let tree = getTree({
  194. defaultValue: ['Shanghai', 'Beijing', 'Dongjing', 'Daban']
  195. });
  196. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  197. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  198. })
  199. it('defaultValue + parent checked => all descendants checked', () => {
  200. let tree = getTree({
  201. defaultValue: ['Yazhou'],
  202. defaultExpandAll: true
  203. });
  204. let checkedNode = tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  205. expect(checkedNode.length).toEqual(7);
  206. })
  207. it('defaultValue + onChangeWithObject', () => {
  208. let tree = getTree({
  209. defaultValue: treeChildren,
  210. defaultExpandAll: true,
  211. onChangeWithObject: true
  212. });
  213. let checkedNode = tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  214. expect(checkedNode.length).toEqual(3);
  215. })
  216. it('select one leaf item / onSelect / onChange', () => {
  217. let spyOnSelect = sinon.spy(() => { });
  218. let spyOnChange = sinon.spy(() => { });
  219. let tree = getTree({
  220. defaultExpandAll: true,
  221. onSelect: spyOnSelect,
  222. onChange: spyOnChange,
  223. });
  224. let nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  225. // check beijing
  226. nodeBeijing.simulate('click');
  227. // onSelect & onChange
  228. expect(spyOnSelect.calledWithMatch('beijing', true, { key: "beijing" })).toEqual(true);
  229. expect(spyOnChange.calledWithMatch(['Beijing'])).toEqual(true);
  230. // classname
  231. nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  232. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  233. // uncheck
  234. nodeBeijing.simulate('click');
  235. // onSelect & onChange
  236. expect(spyOnSelect.calledWithMatch('beijing', false, { key: "beijing" })).toEqual(true);
  237. expect(spyOnChange.calledWithMatch([])).toEqual(true);
  238. // classname
  239. nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  240. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  241. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  242. });
  243. it('select two different branches of leaf items / onSelect / onChange', () => {
  244. let spyOnSelect = sinon.spy(() => { });
  245. let spyOnChange = sinon.spy(() => { });
  246. let tree = getTree({
  247. defaultExpandAll: true,
  248. onSelect: spyOnSelect,
  249. onChange: spyOnChange,
  250. });
  251. let nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  252. nodelevel3.at(0).simulate('click');
  253. nodelevel3.at(2).simulate('click');
  254. // onSelect & onChange
  255. expect(spyOnSelect.calledWithMatch('dongjing', true, { key: "dongjing" })).toEqual(true);
  256. expect(spyOnChange.calledWithMatch(['Beijing', 'Dongjing'])).toEqual(true);
  257. });
  258. it('select one branche of all leaf items / onSelect / onChange', () => {
  259. let spyOnSelect = sinon.spy(() => { });
  260. let spyOnChange = sinon.spy(() => { });
  261. let tree = getTree({
  262. defaultExpandAll: true,
  263. onSelect: spyOnSelect,
  264. onChange: spyOnChange,
  265. });
  266. let nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  267. nodelevel3.at(0).simulate('click');
  268. nodelevel3.at(1).simulate('click');
  269. // onSelect & onChange
  270. expect(spyOnSelect.calledWithMatch('shanghai', true, { key: "shanghai" })).toEqual(true);
  271. expect(spyOnChange.calledWithMatch(['Zhongguo'])).toEqual(true);
  272. // ui
  273. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  274. let level2Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  275. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  276. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  277. });
  278. it('select all leaf items / onSelect / onChange', () => {
  279. let spyOnSelect = sinon.spy(() => { });
  280. let spyOnChange = sinon.spy(() => { });
  281. let tree = getTree({
  282. defaultExpandAll: true,
  283. onSelect: spyOnSelect,
  284. onChange: spyOnChange,
  285. });
  286. let nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  287. nodelevel3.at(0).simulate('click');
  288. nodelevel3.at(1).simulate('click');
  289. nodelevel3.at(2).simulate('click');
  290. nodelevel3.at(3).simulate('click');
  291. // onSelect & onChange
  292. expect(spyOnSelect.calledWithMatch('daban', true, { key: "daban" })).toEqual(true);
  293. expect(spyOnChange.calledWithMatch(['Yazhou'])).toEqual(true);
  294. // ui
  295. expect(tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).length).toEqual(7);
  296. });
  297. it('select a parent node / onSelect / onChange', () => {
  298. let spyOnSelect = sinon.spy(() => { });
  299. let spyOnChange = sinon.spy(() => { });
  300. let tree = getTree({
  301. defaultExpandAll: true,
  302. onSelect: spyOnSelect,
  303. onChange: spyOnChange,
  304. });
  305. let nodelevel1 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  306. nodelevel1.at(0).simulate('click');
  307. // onSelect & onChange
  308. expect(spyOnSelect.calledWithMatch('yazhou', true, { key: "yazhou" })).toEqual(true);
  309. expect(spyOnChange.calledWithMatch(['Yazhou'])).toEqual(true);
  310. // ui
  311. let checkedNode = tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  312. expect(checkedNode.length).toEqual(7);
  313. });
  314. it('onChange + onChangeWithObject', () => {
  315. let spyOnChange = sinon.spy(() => { });
  316. let tree = getTree({
  317. defaultExpandAll: true,
  318. onChangeWithObject: true,
  319. onChange: spyOnChange,
  320. });
  321. let nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  322. nodelevel3.at(0).simulate('click');
  323. nodelevel3.at(2).simulate('click');
  324. // onChange
  325. expect(spyOnChange.calledTwice).toBe(true);
  326. expect(spyOnChange.calledWithMatch([{
  327. label: '北京',
  328. value: 'Beijing',
  329. key: 'beijing',
  330. }, {
  331. label: '东京',
  332. value: 'Dongjing',
  333. key: 'dongjing'
  334. }])
  335. ).toEqual(true);
  336. });
  337. it('unRelated', () => {
  338. const spyOnChange = sinon.spy(() => { });
  339. const tree = getTree({
  340. defaultExpandAll: true,
  341. onChange: spyOnChange,
  342. checkRelation: 'unRelated',
  343. });
  344. const nodelevel2 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  345. const selectedNode = nodelevel2.at(0);
  346. selectedNode.simulate('click');
  347. expect(spyOnChange.calledOnce).toBe(true);
  348. expect(spyOnChange.calledWithMatch(['Zhongguo'])).toEqual(true);
  349. // Note: selectedNode cannot be used directly here. selectedNode is the original node in the unselected state
  350. expect(
  351. tree
  352. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  353. .at(0)
  354. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  355. ).toEqual(true);
  356. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  357. expect(
  358. nodelevel3
  359. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  360. ).toEqual(true);
  361. expect(
  362. nodelevel3
  363. .at(1)
  364. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  365. ).toEqual(true);
  366. });
  367. it('unRelated + value', () => {
  368. const tree = getTree({
  369. defaultExpandAll: true,
  370. checkRelation: 'unRelated',
  371. value: 'Zhongguo'
  372. });
  373. expect(
  374. tree
  375. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  376. .at(0)
  377. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  378. ).toEqual(true);
  379. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  380. expect(
  381. nodelevel3
  382. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  383. ).toEqual(true);
  384. expect(
  385. nodelevel3
  386. .at(1)
  387. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  388. ).toEqual(true);
  389. });
  390. it('unRelated + defaultValue', () => {
  391. const tree = getTree({
  392. defaultExpandAll: true,
  393. checkRelation: 'unRelated',
  394. defaultValue: 'Zhongguo'
  395. });
  396. expect(
  397. tree
  398. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  399. .at(0)
  400. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  401. ).toEqual(true);
  402. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  403. expect(
  404. nodelevel3
  405. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  406. ).toEqual(true);
  407. expect(
  408. nodelevel3
  409. .at(1)
  410. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  411. ).toEqual(true);
  412. });
  413. it('unRelated + onSelect', () => {
  414. const spyOnSelect = sinon.spy(() => { });
  415. const tree = getTree({
  416. defaultExpandAll: true,
  417. onSelect: spyOnSelect,
  418. checkRelation: 'unRelated',
  419. });
  420. const nodelevel2 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  421. const selectedNode = nodelevel2.at(0);
  422. selectedNode.simulate('click');
  423. expect(spyOnSelect.calledOnce).toBe(true);
  424. // onSelect first args is key, not value
  425. expect(spyOnSelect.calledWithMatch('zhongguo')).toEqual(true);
  426. });
  427. it('controlled: leaf values show correct', () => {
  428. let tree = getTree({
  429. value: 'Beijing'
  430. });
  431. let selectedNode = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  432. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  433. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  434. tree.unmount();
  435. // array case only select first item
  436. let tree2 = getTree({
  437. value: ['Dongjing', 'Beijing']
  438. });
  439. let level3Nodes = tree2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  440. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  441. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  442. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  443. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('东京');
  444. });
  445. it('controlled: leaf values checked => ancester half checked', () => {
  446. let tree = getTree({
  447. value: ['Dongjing', 'Beijing']
  448. });
  449. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  450. let level2Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  451. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  452. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  453. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  454. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  455. expect(level2Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).exists()).toEqual(true);
  456. });
  457. it('controlled: leaf values checked => parent checked + ancester half checked', () => {
  458. let tree = getTree({
  459. value: ['Shanghai', 'Beijing']
  460. });
  461. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  462. let level2Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  463. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  464. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  465. });
  466. it('controlled: all leaf items checked => checked ancesters', () => {
  467. let tree = getTree({
  468. value: ['Shanghai', 'Beijing', 'Dongjing', 'Daban']
  469. });
  470. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  471. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  472. });
  473. it('controlled: fire onChange and ui not update', () => {
  474. let spyOnChange = sinon.spy(() => { });
  475. let tree = getTree({
  476. value: '',
  477. defaultExpandAll: true,
  478. onChange: spyOnChange,
  479. });
  480. expect(tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  481. let nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  482. // select beijing
  483. nodeBeijing.simulate('click');
  484. // onChange
  485. expect(spyOnChange.calledOnce).toBe(true);
  486. expect(spyOnChange.calledWithMatch(["Beijing"])).toEqual(true);
  487. expect(tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  488. });
  489. it('treedata in json format', () => {
  490. let spyOnChange = sinon.spy(() => { });
  491. let tree = mount(
  492. <Tree
  493. defaultExpandAll={true}
  494. onChange={spyOnChange}
  495. multiple
  496. treeDataSimpleJson={{
  497. "Node1": {
  498. "Child1": '0-0-1',
  499. "Child2": '0-0-2',
  500. },
  501. "Node2": "0-1"
  502. }}
  503. />,
  504. {
  505. attachTo: document.getElementById('container')
  506. }
  507. );
  508. let nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  509. expect(nodes.length).toEqual(4);
  510. // select
  511. let childNodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  512. childNodes.at(0).simulate('click');
  513. expect(spyOnChange.calledOnce).toBe(true);
  514. expect(spyOnChange.calledWithMatch({
  515. "Node1": {
  516. "Child1": '0-0-1',
  517. },
  518. })).toEqual(true);
  519. // check another child
  520. childNodes.at(1).simulate('click');
  521. expect(spyOnChange.calledWithMatch(
  522. {
  523. "Node1": {
  524. "Child1": '0-0-1',
  525. "Child2": '0-0-2'
  526. },
  527. }
  528. )).toEqual(true);
  529. // unchecked
  530. tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0).simulate('click');
  531. expect(spyOnChange.calledWithMatch({})).toEqual(true);
  532. });
  533. it('onContextMenu', () => {
  534. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  535. let spyOnContextMenu = sinon.spy(() => { });
  536. let tree = getTree({
  537. onContextMenu: spyOnContextMenu,
  538. });
  539. let event = {};
  540. // yazhou
  541. let topNodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  542. // right click on yazhou
  543. topNodeAsia.simulate('contextmenu', nativeEvent);
  544. expect(spyOnContextMenu.calledWithMatch(event, { key: 'yazhou' })).toEqual(true);
  545. // should not select item
  546. expect(topNodeAsia.hasClass(`${BASE_CLASS_PREFIX}-tree-option-selected`)).toEqual(false);
  547. expect(tree.state().checkedKeys.size).toEqual(0);
  548. expect(tree.state().halfCheckedKeys.size).toEqual(0);
  549. });
  550. it('expandAction = click', () => {
  551. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  552. let spyOnExpand = sinon.spy(() => { });
  553. let tree = getTree({
  554. onExpand: spyOnExpand,
  555. expandAction: 'click',
  556. });
  557. // yazhou
  558. let topNodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  559. // expand yazhou
  560. topNodeAsia.simulate('click', nativeEvent);
  561. expect(spyOnExpand.calledOnce).toBe(true);
  562. expect(spyOnExpand.calledWithMatch(["yazhou"], { expanded: true, node: { key: 'yazhou' } })).toEqual(true);
  563. expect(tree.state().expandedKeys).toEqual(new Set(["yazhou"]));
  564. expect(tree.state().checkedKeys.size).toEqual(7);
  565. // collapse yazhou
  566. topNodeAsia.simulate('click', nativeEvent);
  567. expect(spyOnExpand.calledWithMatch([], { expanded: false, node: { key: 'yazhou' } })).toEqual(true);
  568. expect(tree.state().checkedKeys.size).toEqual(0);
  569. expect(tree.state().expandedKeys.size).toEqual(0);
  570. });
  571. it('expandAction = doubleClick', () => {
  572. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  573. let spyOnExpand = sinon.spy(() => { });
  574. let tree = getTree({
  575. onExpand: spyOnExpand,
  576. expandAction: 'doubleClick',
  577. });
  578. // yazhou
  579. let topNodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  580. // expand yazhou
  581. topNodeAsia.simulate('click', nativeEvent);
  582. expect(spyOnExpand.calledOnce).toBe(false);
  583. topNodeAsia.simulate('doubleClick', nativeEvent);
  584. expect(spyOnExpand.calledOnce).toBe(true);
  585. expect(spyOnExpand.calledWithMatch(["yazhou"], { expanded: true, node: { key: 'yazhou' } })).toEqual(true);
  586. // state
  587. expect(tree.state().expandedKeys).toEqual(new Set(["yazhou"]));
  588. expect(tree.state().checkedKeys.size).toEqual(7);
  589. });
  590. it('async load data + check dynamic children when their parent is checked', () => {
  591. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  592. function mockLoadData() { }
  593. const data = {
  594. label: '亚洲',
  595. value: 'Asia',
  596. key: 'asia',
  597. };
  598. let tree = getTree({
  599. loadData: mockLoadData,
  600. defaultValue: 'Asia',
  601. treeData: [data]
  602. });
  603. tree.setProps({
  604. treeData: [{
  605. ...data, children: treeChildren
  606. }]
  607. });
  608. // expand yazhou
  609. expect(tree.state().checkedKeys.size).toEqual(3);
  610. });
  611. it('disableStrictly', () => {
  612. let spyOnChange = sinon.spy(() => { });
  613. let tree = getTree({
  614. defaultExpandAll: true,
  615. onChange: spyOnChange,
  616. disableStrictly: true,
  617. defaultValue: 'Shanghai',
  618. multiple: true
  619. }, true);
  620. let nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`);
  621. expect(tree.state().checkedKeys.size).toEqual(1);
  622. expect(nodes.length).toEqual(3);
  623. // cannot select
  624. let nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  625. nodeBeijing.simulate('click');
  626. expect(spyOnChange.notCalled).toBe(true);
  627. // cannot change by ancestor
  628. let nodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  629. nodeAsia.simulate('click');
  630. expect(tree.state().checkedKeys.size).toEqual(3);
  631. });
  632. it('disabled', () => {
  633. let spyOnChange = sinon.spy(() => { });
  634. let tree = getTree({
  635. defaultExpandAll: true,
  636. disabled: true,
  637. multiple: true,
  638. onChange: spyOnChange,
  639. });
  640. let nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`);
  641. expect(nodes.length).toEqual(10);
  642. // cannot select
  643. let nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  644. nodeBeijing.simulate('click');
  645. expect(spyOnChange.notCalled).toBe(true);
  646. expect(tree.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`).exists()).toEqual(false);
  647. });
  648. })