1
0

treeMultiple.test.js 29 KB

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