treeMultiple.test.js 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008
  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 treeChildrenWithFakeObj = [
  16. {
  17. label: '北京',
  18. value: 'Beijing',
  19. key: 'beijing',
  20. },
  21. {
  22. label: '鱼',
  23. value: 'Fish',
  24. key: 'fish',
  25. },
  26. ]
  27. const treeData = [
  28. {
  29. label: '亚洲',
  30. value: 'Yazhou',
  31. key: 'yazhou',
  32. children: [
  33. {
  34. label: '中国',
  35. value: 'Zhongguo',
  36. key: 'zhongguo',
  37. children: treeChildren,
  38. },
  39. {
  40. label: '日本',
  41. value: 'Riben',
  42. key: 'riben',
  43. children: [
  44. {
  45. label: '东京',
  46. value: 'Dongjing',
  47. key: 'dongjing'
  48. },
  49. {
  50. label: '大阪',
  51. value: 'Daban',
  52. key: 'daban'
  53. }
  54. ]
  55. },
  56. ],
  57. },
  58. {
  59. label: '北美洲',
  60. value: 'Beimeizhou',
  61. key: 'beimeizhou',
  62. children: [
  63. {
  64. label: '美国',
  65. value: 'Meiguo',
  66. key: 'meiguo'
  67. },
  68. {
  69. label: '加拿大',
  70. value: 'Jianada',
  71. key: 'jianada'
  72. }
  73. ]
  74. },
  75. ];
  76. const treeDataWithDisabled = [
  77. {
  78. label: '亚洲',
  79. value: 'Asia',
  80. key: '0',
  81. children: [
  82. {
  83. label: '中国',
  84. value: 'China',
  85. key: '0-0',
  86. disabled: true,
  87. children: [
  88. {
  89. label: '北京',
  90. value: 'Beijing',
  91. key: '0-0-0',
  92. },
  93. {
  94. label: '上海',
  95. value: 'Shanghai',
  96. key: '0-0-1',
  97. },
  98. ],
  99. },
  100. {
  101. label: '日本',
  102. value: 'Japan',
  103. key: '0-1',
  104. },
  105. ],
  106. },
  107. {
  108. label: '北美洲',
  109. value: 'North America',
  110. key: '1',
  111. }
  112. ];
  113. const treeChildrenWithoutValue = [
  114. {
  115. label: '北京',
  116. key: 'beijing',
  117. },
  118. {
  119. label: '上海',
  120. key: 'shanghai',
  121. },
  122. ];
  123. const treeDataWithoutValue = [
  124. {
  125. label: '亚洲',
  126. key: 'yazhou',
  127. children: [
  128. {
  129. label: '中国',
  130. key: 'zhongguo',
  131. children: treeChildrenWithoutValue,
  132. },
  133. {
  134. label: '日本',
  135. key: 'riben',
  136. children: [
  137. {
  138. label: '东京',
  139. key: 'dongjing'
  140. },
  141. {
  142. label: '大阪',
  143. key: 'daban'
  144. }
  145. ]
  146. },
  147. ],
  148. },
  149. {
  150. label: '北美洲',
  151. key: 'beimeizhou',
  152. children: [
  153. {
  154. label: '美国',
  155. key: 'meiguo'
  156. },
  157. {
  158. label: '加拿大',
  159. key: 'jianada'
  160. }
  161. ]
  162. },
  163. ];
  164. let commonProps = {
  165. motion: false,
  166. motionExpand: false,
  167. mouseEnterDelay: 0,
  168. mouseLeaveDelay: 0,
  169. };
  170. function getTreeSelect(props) {
  171. props = { treeData: treeData, ...props }
  172. return mount(
  173. <TreeSelect
  174. multiple
  175. {...commonProps}
  176. defaultOpen={true}
  177. {...props}
  178. />,
  179. {
  180. attachTo: document.getElementById('container')
  181. }
  182. );
  183. }
  184. describe('TreeSelect', () => {
  185. beforeEach(() => {
  186. // Avoid `attachTo: document.body` Warning
  187. const div = document.createElement('div');
  188. div.setAttribute('id', 'container');
  189. document.body.appendChild(div);
  190. });
  191. afterEach(() => {
  192. const div = document.getElementById('container');
  193. if (div) {
  194. document.body.removeChild(div);
  195. }
  196. document.body.innerHTML = '';
  197. });
  198. it('defaultValue + leaf item checked', () => {
  199. // auto expand parent, if node exist means parent is open
  200. let treeSelect = getTreeSelect({
  201. defaultValue: 'Beijing'
  202. });
  203. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  204. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  205. expect(tagGroup.length).toEqual(1);
  206. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  207. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  208. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  209. treeSelect.unmount();
  210. // array case select both
  211. let treeSelect2 = getTreeSelect({
  212. defaultValue: ['Dongjing', 'Beijing']
  213. });
  214. let level3Nodes = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  215. tagGroup = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`);
  216. expect(tagGroup.length).toEqual(2);
  217. expect(tagGroup.at(0).instance().textContent).toEqual('东京');
  218. expect(tagGroup.at(1).instance().textContent).toEqual('北京');
  219. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  220. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  221. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  222. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('东京');
  223. })
  224. it('defaultValue + leaf item checked => half checked parent', () => {
  225. let treeSelect = getTreeSelect({
  226. defaultValue: ['Dongjing', 'Beijing']
  227. });
  228. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  229. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  230. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  231. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  232. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  233. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  234. expect(level2Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).exists()).toEqual(true);
  235. })
  236. it('defaultValue + leaf item checked => checked parent', () => {
  237. let treeSelect = getTreeSelect({
  238. defaultValue: ['Shanghai', 'Beijing']
  239. });
  240. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  241. expect(tagGroup.length).toEqual(1);
  242. expect(tagGroup.at(0).instance().textContent).toEqual('中国');
  243. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  244. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  245. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  246. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  247. })
  248. it('defaultValue + all leaf items checked => checked ancesters', () => {
  249. let treeSelect = getTreeSelect({
  250. defaultValue: ['Shanghai', 'Beijing', 'Dongjing', 'Daban']
  251. });
  252. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  253. expect(tagGroup.length).toEqual(1);
  254. expect(tagGroup.at(0).instance().textContent).toEqual('亚洲');
  255. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  256. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  257. })
  258. it('defaultValue + parent checked => all descendants checked', () => {
  259. let treeSelect = getTreeSelect({
  260. defaultValue: ['Yazhou'],
  261. defaultExpandAll: true
  262. });
  263. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  264. expect(checkedNode.length).toEqual(7);
  265. })
  266. it('defaultValue + onChangeWithObject', () => {
  267. let treeSelect = getTreeSelect({
  268. defaultValue: treeChildren,
  269. defaultExpandAll: true,
  270. onChangeWithObject: true
  271. });
  272. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  273. expect(checkedNode.length).toEqual(3);
  274. })
  275. it('maxTagCount', () => {
  276. let treeSelect = getTreeSelect({
  277. defaultValue: ['Shanghai', 'Dongjing', 'Daban', 'Meiguo'],
  278. maxTagCount: 2,
  279. defaultExpandAll: true,
  280. });
  281. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  282. expect(tagGroup.length).toEqual(3);
  283. expect(tagGroup.at(2).instance().textContent).toEqual('+1');
  284. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  285. expect(checkedNode.length).toEqual(5);
  286. });
  287. it('removeTag', () => {
  288. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  289. let treeSelect = getTreeSelect({
  290. defaultValue: ['Shanghai', 'Dongjing'],
  291. defaultExpandAll: true,
  292. });
  293. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  294. let closeBtn = tagGroup.at(1).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  295. closeBtn.simulate('click', nativeEvent);
  296. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  297. expect(tagGroup.length).toEqual(1);
  298. expect(tagGroup.at(0).instance().textContent).toEqual('上海');
  299. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  300. expect(checkedNode.length).toEqual(1);
  301. });
  302. it('expandedKeys + autoExpandParent', () => {
  303. // auto expand parent is always true when mounted
  304. let treeSelect = getTreeSelect({
  305. expandedKeys: ['beimeizhou']
  306. });
  307. // yazhou beimeizhou
  308. let topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  309. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  310. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  311. treeSelect.setProps({ expandedKeys: ['riben'] });
  312. treeSelect.update();
  313. topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  314. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  315. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  316. // autoExpandParent
  317. treeSelect.setProps({ autoExpandParent: true });
  318. treeSelect.update();
  319. topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  320. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  321. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  322. });
  323. it('select one leaf item / onSelect / onChange', () => {
  324. let spyOnSelect = sinon.spy(() => { });
  325. let spyOnChange = sinon.spy(() => { });
  326. let treeSelect = getTreeSelect({
  327. defaultExpandAll: true,
  328. onSelect: spyOnSelect,
  329. onChange: spyOnChange,
  330. });
  331. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  332. // check beijing
  333. nodeBeijing.simulate('click');
  334. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  335. expect(tagGroup.length).toEqual(1);
  336. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  337. // onSelect & onChange
  338. expect(spyOnSelect.calledWithMatch('beijing', true, { key: "beijing" })).toEqual(true);
  339. expect(spyOnChange.calledWithMatch(['Beijing'])).toEqual(true);
  340. // classname
  341. nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  342. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  343. // uncheck
  344. nodeBeijing.simulate('click');
  345. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  346. expect(tagGroup.length).toEqual(0);
  347. // onSelect & onChange
  348. expect(spyOnSelect.calledWithMatch('beijing', false, { key: "beijing" })).toEqual(true);
  349. expect(spyOnChange.calledWithMatch([])).toEqual(true);
  350. // classname
  351. nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  352. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  353. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  354. });
  355. it('select two different branches of leaf items / onSelect / onChange', () => {
  356. let spyOnSelect = sinon.spy(() => { });
  357. let spyOnChange = sinon.spy(() => { });
  358. let treeSelect = getTreeSelect({
  359. defaultExpandAll: true,
  360. onSelect: spyOnSelect,
  361. onChange: spyOnChange,
  362. });
  363. let nodelevel3 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  364. nodelevel3.at(0).simulate('click');
  365. nodelevel3.at(2).simulate('click');
  366. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  367. expect(tagGroup.length).toEqual(2);
  368. // onSelect & onChange
  369. expect(spyOnSelect.calledWithMatch('dongjing', true, { key: "dongjing" })).toEqual(true);
  370. expect(spyOnChange.calledWithMatch(['Beijing', 'Dongjing'])).toEqual(true);
  371. });
  372. it('select one branche of all leaf items / onSelect / onChange', () => {
  373. let spyOnSelect = sinon.spy(() => { });
  374. let spyOnChange = sinon.spy(() => { });
  375. let treeSelect = getTreeSelect({
  376. defaultExpandAll: true,
  377. onSelect: spyOnSelect,
  378. onChange: spyOnChange,
  379. });
  380. let nodelevel3 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  381. nodelevel3.at(0).simulate('click');
  382. nodelevel3.at(1).simulate('click');
  383. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  384. expect(tagGroup.length).toEqual(1);
  385. // onSelect & onChange
  386. expect(spyOnSelect.calledWithMatch('shanghai', true, { key: "shanghai" })).toEqual(true);
  387. expect(spyOnChange.calledWithMatch(['Zhongguo'])).toEqual(true);
  388. // ui
  389. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  390. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  391. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  392. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  393. });
  394. it('select all leaf items / onSelect / onChange', () => {
  395. let spyOnSelect = sinon.spy(() => { });
  396. let spyOnChange = sinon.spy(() => { });
  397. let treeSelect = getTreeSelect({
  398. defaultExpandAll: true,
  399. onSelect: spyOnSelect,
  400. onChange: spyOnChange,
  401. });
  402. let nodelevel3 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  403. nodelevel3.at(0).simulate('click');
  404. nodelevel3.at(1).simulate('click');
  405. nodelevel3.at(2).simulate('click');
  406. nodelevel3.at(3).simulate('click');
  407. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  408. expect(tagGroup.length).toEqual(1);
  409. // onSelect & onChange
  410. expect(spyOnSelect.calledWithMatch('daban', true, { key: "daban" })).toEqual(true);
  411. expect(spyOnChange.calledWithMatch(['Yazhou'])).toEqual(true);
  412. // ui
  413. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).length).toEqual(7);
  414. });
  415. it('select a parent node / onSelect / onChange', () => {
  416. let spyOnSelect = sinon.spy(() => { });
  417. let spyOnChange = sinon.spy(() => { });
  418. let treeSelect = getTreeSelect({
  419. defaultExpandAll: true,
  420. onSelect: spyOnSelect,
  421. onChange: spyOnChange,
  422. });
  423. let nodelevel1 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  424. nodelevel1.at(0).simulate('click');
  425. // onSelect & onChange
  426. expect(spyOnSelect.calledWithMatch('yazhou', true, { key: "yazhou" })).toEqual(true);
  427. expect(spyOnChange.calledWithMatch(['Yazhou'])).toEqual(true);
  428. // ui
  429. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  430. expect(checkedNode.length).toEqual(7);
  431. });
  432. // it('onChange + valueInArray', () => {
  433. // let spyOnSelect = sinon.spy(() => { });
  434. // let spyOnChange = sinon.spy(() => { });
  435. // let treeSelect = getTreeSelect({
  436. // defaultExpandAll: true,
  437. // onSelect: spyOnSelect,
  438. // onChange: spyOnChange,
  439. // valueInArray: true,
  440. // });
  441. // let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  442. // // select beijing
  443. // nodeBeijing.simulate('click');
  444. // // onSelect & onChange
  445. // expect(spyOnSelect.calledOnce).toBe(true);
  446. // expect(spyOnChange.calledOnce).toBe(true);
  447. // expect(spyOnSelect.calledWithMatch('beijing', true, { key: "beijing" })).toEqual(true);
  448. // expect(spyOnChange.calledWithMatch(
  449. // [['Yazhou', 'Zhongguo', 'Beijing']],
  450. // [{ label: "北京", value: "Beijing", key: "beijing" }]
  451. // )).toEqual(true);
  452. // });
  453. it('onChange + leafOnly', () => {
  454. let spyOnSelect = sinon.spy(() => { });
  455. let spyOnChange = sinon.spy(() => { });
  456. let treeSelect = getTreeSelect({
  457. defaultExpandAll: true,
  458. onSelect: spyOnSelect,
  459. onChange: spyOnChange,
  460. leafOnly: true,
  461. });
  462. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  463. // select China
  464. nodeChina.simulate('click');
  465. // onSelect & onChange
  466. expect(spyOnSelect.calledOnce).toBe(true);
  467. expect(spyOnChange.calledOnce).toBe(true);
  468. expect(spyOnSelect.calledWithMatch('zhongguo', true, { key: "zhongguo" })).toEqual(true);
  469. expect(spyOnChange.calledWithMatch(
  470. ['Beijing', 'Shanghai'],
  471. )).toEqual(true);
  472. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  473. expect(tagGroup.length).toEqual(2);
  474. });
  475. it('controlled: leaf values show correct', () => {
  476. let treeSelect = getTreeSelect({
  477. value: 'Beijing'
  478. });
  479. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  480. expect(tagGroup.length).toEqual(1);
  481. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  482. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  483. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  484. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  485. treeSelect.unmount();
  486. let treeSelect2 = getTreeSelect({
  487. value: ['Dongjing', 'Beijing']
  488. });
  489. tagGroup = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`);
  490. expect(tagGroup.length).toEqual(2);
  491. expect(tagGroup.at(0).instance().textContent).toEqual('东京');
  492. expect(tagGroup.at(1).instance().textContent).toEqual('北京');
  493. let level3Nodes = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  494. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  495. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  496. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  497. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('东京');
  498. });
  499. it('controlled: leaf values checked => ancester half checked', () => {
  500. let treeSelect = getTreeSelect({
  501. value: ['Dongjing', 'Beijing']
  502. });
  503. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  504. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  505. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  506. expect(tagGroup.length).toEqual(2);
  507. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  508. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  509. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  510. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  511. expect(level2Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).exists()).toEqual(true);
  512. });
  513. it('controlled: leaf values checked => parent checked + ancester half checked', () => {
  514. let treeSelect = getTreeSelect({
  515. value: ['Shanghai', 'Beijing']
  516. });
  517. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  518. expect(tagGroup.length).toEqual(1);
  519. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  520. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  521. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  522. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  523. });
  524. it('controlled: all leaf items checked => checked ancesters', () => {
  525. let treeSelect = getTreeSelect({
  526. value: ['Shanghai', 'Beijing', 'Dongjing', 'Daban']
  527. });
  528. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  529. expect(tagGroup.length).toEqual(1);
  530. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  531. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  532. });
  533. it('controlled: fire onChange and ui not update', () => {
  534. let spyOnChange = sinon.spy(() => { });
  535. let treeSelect = getTreeSelect({
  536. value: '',
  537. defaultExpandAll: true,
  538. onChange: spyOnChange,
  539. });
  540. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  541. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  542. // select beijing
  543. nodeBeijing.simulate('click');
  544. // render tag
  545. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  546. expect(tagGroup.length).toEqual(0);
  547. // onChange
  548. expect(spyOnChange.calledOnce).toBe(true);
  549. expect(spyOnChange.calledWithMatch(["Beijing"])).toEqual(true);
  550. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  551. });
  552. it('disabled', () => {
  553. let treeSelect = getTreeSelect({
  554. defaultValue: ['Dongjing', 'Beijing'],
  555. disabled: true,
  556. });
  557. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tag-closable`).length).toEqual(0);
  558. });
  559. it('controlled: empty treeDate with value', () => {
  560. let treeSelect = getTreeSelect({
  561. value: [''],
  562. treeData: []
  563. });
  564. expect(treeSelect.state().selectedKeys.length).toEqual(0);
  565. });
  566. it('renderSelectedItem', () => {
  567. let spyOnSelect = sinon.spy(() => { });
  568. let spyOnChange = sinon.spy(() => { });
  569. let treeSelect = getTreeSelect({
  570. renderSelectedItem: (item, { index, onClose }) => ({ content: item.value, isRenderInTag: true }),
  571. defaultExpandAll: true,
  572. onSelect: spyOnSelect,
  573. onChange: spyOnChange,
  574. });
  575. const yaZhouKey = 'yazhou';
  576. const yaZhouValue = 'Yazhou';
  577. let nodeYaZhou = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  578. nodeYaZhou.simulate('click');
  579. // 判断回调
  580. expect(spyOnSelect.calledOnce).toBe(true);
  581. expect(spyOnChange.calledOnce).toBe(true);
  582. expect(spyOnSelect.getCall(0).args[0]).toEqual(yaZhouKey);
  583. expect(spyOnChange.getCall(0).args[0]).toEqual([yaZhouValue]);
  584. // 判断内容是否value
  585. const innerHTML = document.querySelector('.semi-tag .semi-tag-content').textContent;
  586. expect(innerHTML).toEqual(yaZhouValue);
  587. });
  588. it('disabledStrictly', () => {
  589. const treeSelect1 = mount(
  590. <TreeSelect
  591. style={{ width: 300 }}
  592. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  593. multiple
  594. defaultOpen
  595. defaultExpandAll
  596. disableStrictly
  597. leafOnly
  598. treeData={treeData}
  599. {...commonProps}
  600. />
  601. );
  602. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(0);
  603. const clickedNode1 = treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  604. clickedNode1.simulate('click', {})
  605. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(4);
  606. const treeSelect2 = mount(
  607. <TreeSelect
  608. style={{ width: 300 }}
  609. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  610. multiple
  611. defaultOpen
  612. defaultExpandAll
  613. disableStrictly
  614. treeData={treeDataWithDisabled}
  615. {...commonProps}
  616. />
  617. );
  618. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(0);
  619. const clickedNode2 = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  620. clickedNode2.simulate('click', {})
  621. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(1);
  622. });
  623. it('searchPosition is trigger', () => {
  624. const treeSelect = getTreeSelect({
  625. searchPosition: 'trigger',
  626. filterTreeNode: true,
  627. multiple: true,
  628. maxTagCount: 1,
  629. defaultValue: ['Zhongguo', 'Meiguo']
  630. });
  631. const selection = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection`);
  632. expect(selection.find(`.${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-tag`).length).toEqual(1);
  633. expect(selection.find(`.${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-tagInput-wrapper-n`).at(0).getDOMNode().textContent).toEqual('+1');
  634. const input = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-input`);
  635. const searchValue = '北';
  636. const event = { target: { value: searchValue } };
  637. input.simulate('change', event);
  638. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(6);
  639. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(2);
  640. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(0).instance().textContent).toEqual('北');
  641. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(1).instance().textContent).toEqual('北');
  642. });
  643. it('searchPosition is trigger + leafOnly', () => {
  644. const spyOnSelect = sinon.spy(() => { });
  645. const treeSelect = getTreeSelect({
  646. onSelect: spyOnSelect,
  647. searchPosition: 'trigger',
  648. filterTreeNode: true,
  649. multiple: true,
  650. defaultExpandAll: true,
  651. leafOnly: true,
  652. });
  653. // Check if leafOnly is working
  654. const nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  655. nodeChina.simulate('click');
  656. expect(spyOnSelect.calledOnce).toBe(true);
  657. expect(spyOnSelect.calledWithMatch('zhongguo', true, { key: "zhongguo" })).toEqual(true);
  658. const tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  659. expect(tagGroup.length).toEqual(2);
  660. // Check if searchPosition='trigger' is working
  661. const input = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-input`);
  662. const searchValue = '北';
  663. const event = { target: { value: searchValue } };
  664. input.simulate('change', event);
  665. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(6);
  666. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(2);
  667. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(0).instance().textContent).toEqual('北');
  668. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(1).instance().textContent).toEqual('北');
  669. });
  670. it('unRelated', () => {
  671. const spyOnChange = sinon.spy(() => { });
  672. const tree = getTreeSelect({
  673. defaultExpandAll: true,
  674. onChange: spyOnChange,
  675. checkRelation: 'unRelated',
  676. });
  677. const nodelevel2 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  678. const selectedNode = nodelevel2.at(0);
  679. selectedNode.simulate('click');
  680. expect(spyOnChange.calledOnce).toBe(true);
  681. expect(spyOnChange.calledWithMatch(['Zhongguo'])).toEqual(true);
  682. // Note: selectedNode cannot be used directly here. selectedNode is the original node in the unselected state
  683. expect(
  684. tree
  685. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  686. .at(0)
  687. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  688. ).toEqual(true);
  689. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  690. expect(
  691. nodelevel3
  692. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  693. ).toEqual(true);
  694. expect(
  695. nodelevel3
  696. .at(1)
  697. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  698. ).toEqual(true);
  699. });
  700. it('unRelated + value', () => {
  701. const tree = getTreeSelect({
  702. defaultExpandAll: true,
  703. checkRelation: 'unRelated',
  704. value: 'Zhongguo'
  705. });
  706. expect(
  707. tree
  708. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  709. .at(0)
  710. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  711. ).toEqual(true);
  712. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  713. expect(
  714. nodelevel3
  715. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  716. ).toEqual(true);
  717. expect(
  718. nodelevel3
  719. .at(1)
  720. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  721. ).toEqual(true);
  722. });
  723. it('unRelated + defaultValue', () => {
  724. const tree = getTreeSelect({
  725. defaultExpandAll: true,
  726. checkRelation: 'unRelated',
  727. defaultValue: 'Zhongguo'
  728. });
  729. expect(
  730. tree
  731. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  732. .at(0)
  733. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  734. ).toEqual(true);
  735. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  736. expect(
  737. nodelevel3
  738. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  739. ).toEqual(true);
  740. expect(
  741. nodelevel3
  742. .at(1)
  743. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  744. ).toEqual(true);
  745. });
  746. it('unRelated + onSelect', () => {
  747. const spyOnSelect = sinon.spy(() => { });
  748. const tree = getTreeSelect({
  749. defaultExpandAll: true,
  750. onSelect: spyOnSelect,
  751. checkRelation: 'unRelated',
  752. });
  753. const nodelevel2 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  754. const selectedNode = nodelevel2.at(0);
  755. selectedNode.simulate('click');
  756. expect(spyOnSelect.calledOnce).toBe(true);
  757. // onSelect first args is key, not value
  758. expect(spyOnSelect.calledWithMatch('zhongguo')).toEqual(true);
  759. });
  760. it('option not in treeData + treeData item with value', () => {
  761. const spyOnSelect = sinon.spy(() => { });
  762. const spyOnChange = sinon.spy(() => { });
  763. const treeSelect = getTreeSelect({
  764. defaultValue: ['Beijing', 'fish'],
  765. onSelect: spyOnSelect,
  766. onChange: spyOnChange,
  767. });
  768. // Nodes that do not exist in treeData also appear in the tag input box
  769. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  770. expect(tagGroup.length).toEqual(2);
  771. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  772. expect(tagGroup.at(1).instance().textContent).toEqual('fish');
  773. // Only one item is selected in the panel
  774. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  775. let selectedNode = selectedNodes.at(0);
  776. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  777. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  778. // Check for fish in onSelect and onChange
  779. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  780. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  781. closeBtn.simulate('click', nativeEvent);
  782. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  783. expect(tagGroup.length).toEqual(1);
  784. expect(tagGroup.at(0).instance().textContent).toEqual('fish');
  785. expect(spyOnChange.calledOnce).toBe(true);
  786. expect(spyOnChange.calledWithMatch(['fish'])).toEqual(true);
  787. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  788. // select China
  789. nodeChina.simulate('click');
  790. expect(spyOnSelect.calledWithMatch('zhongguo')).toEqual(true);
  791. expect(spyOnChange.calledWithMatch(['fish', 'Zhongguo'])).toEqual(true);
  792. });
  793. it('option not in treeData + treeData item has value + onChangeWithObject', () => {
  794. const spyOnSelect = sinon.spy(() => { });
  795. const spyOnChange = sinon.spy(() => { });
  796. const treeSelect = getTreeSelect({
  797. defaultValue: treeChildrenWithFakeObj,
  798. onSelect: spyOnSelect,
  799. onChange: spyOnChange,
  800. defaultExpandAll: true,
  801. onChangeWithObject: true
  802. });
  803. // Nodes that do not exist in treeData also appear in the tag input box
  804. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  805. expect(tagGroup.length).toEqual(2);
  806. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  807. expect(tagGroup.at(1).instance().textContent).toEqual('鱼');
  808. // Only one item is selected in the panel
  809. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  810. let selectedNode = selectedNodes.at(0);
  811. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  812. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  813. // Check for fish in onSelect and onChange
  814. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  815. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  816. closeBtn.simulate('click', nativeEvent);
  817. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  818. expect(tagGroup.length).toEqual(1);
  819. expect(tagGroup.at(0).instance().textContent).toEqual('鱼');
  820. expect(spyOnChange.calledOnce).toBe(true);
  821. expect(spyOnChange.calledWithMatch([{ label: '鱼', value: 'Fish', key: 'fish' }])).toEqual(true);
  822. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  823. // select China
  824. nodeChina.simulate('click');
  825. expect(spyOnSelect.calledWithMatch('beijing')).toEqual(true);
  826. expect(spyOnChange.calledWithMatch([
  827. { label: '鱼', value: 'Fish', key: 'fish' },
  828. { label: '北京', value: 'Beijing', key: 'beijing' }
  829. ])).toEqual(true);
  830. });
  831. it('option not in treeData + treeData item without value ', () => {
  832. const spyOnSelect = sinon.spy(() => { });
  833. const spyOnChange = sinon.spy(() => { });
  834. const treeSelect = getTreeSelect({
  835. treeData: treeDataWithoutValue,
  836. defaultValue: ['beijing', 'fish'],
  837. onSelect: spyOnSelect,
  838. onChange: spyOnChange,
  839. });
  840. // Nodes that do not exist in treeData also appear in the tag input box
  841. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  842. expect(tagGroup.length).toEqual(2);
  843. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  844. expect(tagGroup.at(1).instance().textContent).toEqual('fish');
  845. // Only one item is selected in the panel
  846. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  847. let selectedNode = selectedNodes.at(0);
  848. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  849. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  850. // Check for fish in onSelect and onChange
  851. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  852. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  853. closeBtn.simulate('click', nativeEvent);
  854. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  855. expect(tagGroup.length).toEqual(1);
  856. expect(tagGroup.at(0).instance().textContent).toEqual('fish');
  857. expect(spyOnChange.calledOnce).toBe(true);
  858. expect(spyOnChange.calledWithMatch(['fish'])).toEqual(true);
  859. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  860. // select China
  861. nodeChina.simulate('click');
  862. expect(spyOnSelect.calledWithMatch('zhongguo')).toEqual(true);
  863. expect(spyOnChange.calledWithMatch(['fish', 'zhongguo'])).toEqual(true);
  864. });
  865. it('option not in treeData + treeData item without value + onChangeWithObject', () => {
  866. const spyOnSelect = sinon.spy(() => { });
  867. const spyOnChange = sinon.spy(() => { });
  868. const treeSelect = getTreeSelect({
  869. treeData: treeDataWithoutValue,
  870. defaultValue: [
  871. { label: '北京', key: 'beijing' },
  872. { label: '鱼', key: 'fish' }
  873. ],
  874. onSelect: spyOnSelect,
  875. onChange: spyOnChange,
  876. defaultExpandAll: true,
  877. onChangeWithObject: true
  878. });
  879. // Nodes that do not exist in treeData also appear in the tag input box
  880. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  881. expect(tagGroup.length).toEqual(2);
  882. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  883. expect(tagGroup.at(1).instance().textContent).toEqual('鱼');
  884. // Only one item is selected in the panel
  885. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  886. let selectedNode = selectedNodes.at(0);
  887. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  888. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  889. // Check for fish in onSelect and onChange
  890. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  891. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  892. closeBtn.simulate('click', nativeEvent);
  893. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  894. expect(tagGroup.length).toEqual(1);
  895. expect(tagGroup.at(0).instance().textContent).toEqual('鱼');
  896. expect(spyOnChange.calledOnce).toBe(true);
  897. expect(spyOnChange.calledWithMatch([{ label: '鱼', key: 'fish' }])).toEqual(true);
  898. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  899. // select China
  900. nodeChina.simulate('click');
  901. expect(spyOnSelect.calledWithMatch('beijing')).toEqual(true);
  902. expect(spyOnChange.calledWithMatch([
  903. { label: '鱼', key: 'fish' },
  904. { label: '北京', key: 'beijing' }
  905. ])).toEqual(true);
  906. });
  907. })