treeMultiple.test.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  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('controlled: leaf values show correct', () => {
  338. let tree = getTree({
  339. value: 'Beijing'
  340. });
  341. let selectedNode = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  342. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  343. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  344. tree.unmount();
  345. // array case only select first item
  346. let tree2 = getTree({
  347. value: ['Dongjing', 'Beijing']
  348. });
  349. let level3Nodes = tree2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  350. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  351. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  352. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  353. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('东京');
  354. });
  355. it('controlled: leaf values checked => ancester half checked', () => {
  356. let tree = getTree({
  357. value: ['Dongjing', 'Beijing']
  358. });
  359. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  360. let level2Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  361. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  362. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  363. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  364. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  365. expect(level2Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).exists()).toEqual(true);
  366. });
  367. it('controlled: leaf values checked => parent checked + ancester half checked', () => {
  368. let tree = getTree({
  369. value: ['Shanghai', 'Beijing']
  370. });
  371. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  372. let level2Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  373. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  374. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  375. });
  376. it('controlled: all leaf items checked => checked ancesters', () => {
  377. let tree = getTree({
  378. value: ['Shanghai', 'Beijing', 'Dongjing', 'Daban']
  379. });
  380. let level1Nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  381. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  382. });
  383. it('controlled: fire onChange and ui not update', () => {
  384. let spyOnChange = sinon.spy(() => { });
  385. let tree = getTree({
  386. value: '',
  387. defaultExpandAll: true,
  388. onChange: spyOnChange,
  389. });
  390. expect(tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  391. let nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  392. // select beijing
  393. nodeBeijing.simulate('click');
  394. // onChange
  395. expect(spyOnChange.calledOnce).toBe(true);
  396. expect(spyOnChange.calledWithMatch(["Beijing"])).toEqual(true);
  397. expect(tree.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  398. });
  399. it('treedata in json format', () => {
  400. let spyOnChange = sinon.spy(() => { });
  401. let tree = mount(
  402. <Tree
  403. defaultExpandAll={true}
  404. onChange={spyOnChange}
  405. multiple
  406. treeDataSimpleJson={{
  407. "Node1": {
  408. "Child1": '0-0-1',
  409. "Child2": '0-0-2',
  410. },
  411. "Node2": "0-1"
  412. }}
  413. />,
  414. {
  415. attachTo: document.getElementById('container')
  416. }
  417. );
  418. let nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  419. expect(nodes.length).toEqual(4);
  420. // select
  421. let childNodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  422. childNodes.at(0).simulate('click');
  423. expect(spyOnChange.calledOnce).toBe(true);
  424. expect(spyOnChange.calledWithMatch({
  425. "Node1": {
  426. "Child1": '0-0-1',
  427. },
  428. })).toEqual(true);
  429. // check another child
  430. childNodes.at(1).simulate('click');
  431. expect(spyOnChange.calledWithMatch(
  432. {
  433. "Node1": {
  434. "Child1": '0-0-1',
  435. "Child2": '0-0-2'
  436. },
  437. }
  438. )).toEqual(true);
  439. // unchecked
  440. tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0).simulate('click');
  441. expect(spyOnChange.calledWithMatch({})).toEqual(true);
  442. });
  443. it('onContextMenu', () => {
  444. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  445. let spyOnContextMenu = sinon.spy(() => { });
  446. let tree = getTree({
  447. onContextMenu: spyOnContextMenu,
  448. });
  449. let event = {};
  450. // yazhou
  451. let topNodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  452. // right click on yazhou
  453. topNodeAsia.simulate('contextmenu', nativeEvent);
  454. expect(spyOnContextMenu.calledWithMatch(event, { key: 'yazhou' })).toEqual(true);
  455. // should not select item
  456. expect(topNodeAsia.hasClass(`${BASE_CLASS_PREFIX}-tree-option-selected`)).toEqual(false);
  457. expect(tree.state().checkedKeys.size).toEqual(0);
  458. expect(tree.state().halfCheckedKeys.size).toEqual(0);
  459. });
  460. it('expandAction = click', () => {
  461. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  462. let spyOnExpand = sinon.spy(() => { });
  463. let tree = getTree({
  464. onExpand: spyOnExpand,
  465. expandAction: 'click',
  466. });
  467. // yazhou
  468. let topNodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  469. // expand yazhou
  470. topNodeAsia.simulate('click', nativeEvent);
  471. expect(spyOnExpand.calledOnce).toBe(true);
  472. expect(spyOnExpand.calledWithMatch(["yazhou"], { expanded: true, node: { key: 'yazhou' } })).toEqual(true);
  473. expect(tree.state().expandedKeys).toEqual(new Set(["yazhou"]));
  474. expect(tree.state().checkedKeys.size).toEqual(7);
  475. // collapse yazhou
  476. topNodeAsia.simulate('click', nativeEvent);
  477. expect(spyOnExpand.calledWithMatch([], { expanded: false, node: { key: 'yazhou' } })).toEqual(true);
  478. expect(tree.state().checkedKeys.size).toEqual(0);
  479. expect(tree.state().expandedKeys.size).toEqual(0);
  480. });
  481. it('expandAction = doubleClick', () => {
  482. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  483. let spyOnExpand = sinon.spy(() => { });
  484. let tree = getTree({
  485. onExpand: spyOnExpand,
  486. expandAction: 'doubleClick',
  487. });
  488. // yazhou
  489. let topNodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  490. // expand yazhou
  491. topNodeAsia.simulate('click', nativeEvent);
  492. expect(spyOnExpand.calledOnce).toBe(false);
  493. topNodeAsia.simulate('doubleClick', nativeEvent);
  494. expect(spyOnExpand.calledOnce).toBe(true);
  495. expect(spyOnExpand.calledWithMatch(["yazhou"], { expanded: true, node: { key: 'yazhou' } })).toEqual(true);
  496. // state
  497. expect(tree.state().expandedKeys).toEqual(new Set(["yazhou"]));
  498. expect(tree.state().checkedKeys.size).toEqual(7);
  499. });
  500. it('async load data + check dynamic children when their parent is checked', () => {
  501. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  502. function mockLoadData() { }
  503. const data = {
  504. label: '亚洲',
  505. value: 'Asia',
  506. key: 'asia',
  507. };
  508. let tree = getTree({
  509. loadData: mockLoadData,
  510. defaultValue: 'Asia',
  511. treeData: [data]
  512. });
  513. tree.setProps({
  514. treeData: [{
  515. ...data, children: treeChildren
  516. }]
  517. });
  518. // expand yazhou
  519. expect(tree.state().checkedKeys.size).toEqual(3);
  520. });
  521. it('disableStrictly', () => {
  522. let spyOnChange = sinon.spy(() => { });
  523. let tree = getTree({
  524. defaultExpandAll: true,
  525. onChange: spyOnChange,
  526. disableStrictly: true,
  527. defaultValue: 'Shanghai',
  528. multiple: true
  529. }, true);
  530. let nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`);
  531. expect(tree.state().checkedKeys.size).toEqual(1);
  532. expect(nodes.length).toEqual(3);
  533. // cannot select
  534. let nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  535. nodeBeijing.simulate('click');
  536. expect(spyOnChange.notCalled).toBe(true);
  537. // cannot change by ancestor
  538. let nodeAsia = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  539. nodeAsia.simulate('click');
  540. expect(tree.state().checkedKeys.size).toEqual(3);
  541. });
  542. it('disabled', () => {
  543. let spyOnChange = sinon.spy(() => { });
  544. let tree = getTree({
  545. defaultExpandAll: true,
  546. disabled: true,
  547. multiple: true,
  548. onChange: spyOnChange,
  549. });
  550. let nodes = tree.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`);
  551. expect(nodes.length).toEqual(10);
  552. // cannot select
  553. let nodeBeijing = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  554. nodeBeijing.simulate('click');
  555. expect(spyOnChange.notCalled).toBe(true);
  556. expect(tree.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`).exists()).toEqual(false);
  557. });
  558. })