treeSelect.test.js 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311
  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 treeData2 = [
  65. {
  66. label: '亚洲',
  67. value: 'Asia',
  68. key: '0',
  69. children: [
  70. {
  71. label: '中国',
  72. value: 'China',
  73. key: '0-0',
  74. children: [
  75. {
  76. label: '北京',
  77. value: 'Beijing',
  78. key: '0-0-0',
  79. },
  80. {
  81. label: '上海',
  82. value: 'Shanghai',
  83. key: '0-0-1',
  84. },
  85. ],
  86. },
  87. ],
  88. },
  89. {
  90. label: '北美洲',
  91. value: 'North America',
  92. key: '1',
  93. }
  94. ];
  95. const treeData3 = [
  96. {
  97. label: '亚洲',
  98. value: 'Asia',
  99. key: '0',
  100. children: [
  101. {
  102. label: '中国',
  103. value: 'China',
  104. key: '0-0',
  105. },
  106. ],
  107. },
  108. {
  109. label: '北美洲',
  110. value: 'North America',
  111. key: '1',
  112. }
  113. ];
  114. const specialTreeData = [
  115. {
  116. label1: '亚洲',
  117. value1: 'Yazhou',
  118. key1: 'yazhou',
  119. children1: [
  120. {
  121. label1: '中国',
  122. value1: 'Zhongguo',
  123. key1: 'zhongguo',
  124. disabled1: true,
  125. children1: [
  126. {
  127. label1: '北京',
  128. value1: 'Beijing',
  129. key1: 'beijing',
  130. },
  131. {
  132. label1: '上海',
  133. value1: 'Shanghai',
  134. key1: 'shanghai',
  135. },
  136. ],
  137. },
  138. {
  139. label1: '日本',
  140. value1: 'Riben',
  141. key1: 'riben',
  142. children1: [
  143. {
  144. label1: '东京',
  145. value1: 'Dongjing',
  146. key1: 'dongjing',
  147. },
  148. {
  149. label1: '大阪',
  150. value1: 'Daban',
  151. key1: 'daban',
  152. },
  153. ],
  154. },
  155. ],
  156. },
  157. {
  158. label1: '北美洲',
  159. value1: 'Beimeizhou',
  160. key1: 'beimeizhou',
  161. children1: [
  162. {
  163. label1: '美国',
  164. value1: 'Meiguo',
  165. key1: 'meiguo',
  166. },
  167. {
  168. label1: '加拿大',
  169. value1: 'Jianada',
  170. key1: 'jianada',
  171. },
  172. ],
  173. },
  174. ];
  175. const treeDataEnNA = {
  176. label: 'North America',
  177. value: 'North America',
  178. key: '1',
  179. children: [
  180. {
  181. label: 'United States',
  182. value: 'United States',
  183. key: '1-0'
  184. },
  185. {
  186. label: 'Canada',
  187. value: 'Canada',
  188. key: '1-1'
  189. }
  190. ]
  191. }
  192. const treeDataEn = [
  193. {
  194. label: 'Asia',
  195. value: 'Asia',
  196. key: '0',
  197. children: [
  198. {
  199. label: 'China',
  200. value: 'China',
  201. key: '0-0',
  202. children: [
  203. {
  204. label: 'Beijing',
  205. value: 'Beijing',
  206. key: '0-0-0',
  207. },
  208. {
  209. label: 'Shanghai',
  210. value: 'Shanghai',
  211. key: '0-0-1',
  212. },
  213. {
  214. label: 'Chengdu',
  215. value: 'Chengdu',
  216. key: '0-0-2',
  217. },
  218. ],
  219. },
  220. {
  221. label: 'Japan',
  222. value: 'Japan',
  223. key: '0-1',
  224. children: [
  225. {
  226. label: 'Osaka',
  227. value: 'Osaka',
  228. key: '0-1-0'
  229. }
  230. ]
  231. },
  232. ],
  233. },
  234. treeDataEnNA
  235. ];
  236. const defaultKeyMaps = {
  237. value: 'value1',
  238. key: 'key1',
  239. label: 'label1',
  240. children: 'children1',
  241. disabled: 'disabled1'
  242. }
  243. const treeChildrenWithoutValue = [
  244. {
  245. label: '北京',
  246. key: 'beijing',
  247. },
  248. {
  249. label: '上海',
  250. key: 'shanghai',
  251. },
  252. ];
  253. const treeDataWithoutValue = [
  254. {
  255. label: '亚洲',
  256. key: 'yazhou',
  257. children: [
  258. {
  259. label: '中国',
  260. key: 'zhongguo',
  261. children: treeChildrenWithoutValue,
  262. },
  263. {
  264. label: '日本',
  265. key: 'riben',
  266. children: [
  267. {
  268. label: '东京',
  269. key: 'dongjing'
  270. },
  271. {
  272. label: '大阪',
  273. key: 'daban'
  274. }
  275. ]
  276. },
  277. ],
  278. },
  279. {
  280. label: '北美洲',
  281. key: 'beimeizhou',
  282. children: [
  283. {
  284. label: '美国',
  285. key: 'meiguo'
  286. },
  287. {
  288. label: '加拿大',
  289. key: 'jianada'
  290. }
  291. ]
  292. },
  293. ];
  294. let commonProps = {
  295. motion: false,
  296. motionExpand: false,
  297. mouseEnterDelay: 0,
  298. mouseLeaveDelay: 0,
  299. };
  300. function getTreeSelect(props) {
  301. props = { treeData: treeData, ...props }
  302. return mount(
  303. <TreeSelect
  304. {...commonProps}
  305. defaultOpen={true}
  306. {...props}
  307. />,
  308. {
  309. attachTo: document.getElementById('container')
  310. }
  311. );
  312. }
  313. describe('TreeSelect', () => {
  314. beforeEach(() => {
  315. // Avoid `attachTo: document.body` Warning
  316. const div = document.createElement('div');
  317. div.setAttribute('id', 'container');
  318. document.body.appendChild(div);
  319. });
  320. afterEach(() => {
  321. const div = document.getElementById('container');
  322. if (div) {
  323. document.body.removeChild(div);
  324. }
  325. document.body.innerHTML = '';
  326. });
  327. it('className / style', () => {
  328. let props = {
  329. className: 'test',
  330. style: { height: 420 },
  331. };
  332. let treeSelect = getTreeSelect(props);
  333. expect(treeSelect.hasClass('test')).toEqual(true);
  334. expect(treeSelect.find('div.test')).toHaveStyle('height', 420);
  335. });
  336. it('placeholder', () => {
  337. const props = {
  338. placeholder: 'semi'
  339. };
  340. const treeSelect = getTreeSelect(props);
  341. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection-placeholder`).instance().textContent).toEqual('semi');
  342. });
  343. it('validateStatus', () => {
  344. const props = {};
  345. const treeSelect = getTreeSelect(props);
  346. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-error`)).toEqual(false);
  347. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-warning`)).toEqual(false);
  348. treeSelect.setProps({ validateStatus: 'error' });
  349. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-error`)).toEqual(true);
  350. treeSelect.setProps({ validateStatus: 'warning' });
  351. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-warning`)).toEqual(true);
  352. });
  353. it('outerBottomSlot', () => {
  354. let outerBottomSlot = <div class="outer-slot">outer</div>;
  355. let props = {
  356. outerBottomSlot: outerBottomSlot,
  357. };
  358. const treeSelect = getTreeSelect(props);
  359. expect(treeSelect.contains(outerBottomSlot)).toEqual(true);
  360. });
  361. it('size', () => {
  362. const props = {};
  363. const treeSelect = getTreeSelect(props);
  364. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-large`)).toEqual(false);
  365. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-small`)).toEqual(false);
  366. treeSelect.setProps({ size: 'large' });
  367. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-large`)).toEqual(true);
  368. treeSelect.setProps({ size: 'small' });
  369. expect(treeSelect.exists(`.${BASE_CLASS_PREFIX}-tree-select-small`)).toEqual(true);
  370. });
  371. it('custom dropdownClassName / dropdownStyle / zIndex', () => {
  372. let props = {
  373. dropdownClassName: 'test',
  374. dropdownStyle: {
  375. color: 'red',
  376. },
  377. zIndex: 2000,
  378. };
  379. let treeSelect = getTreeSelect(props);
  380. expect(treeSelect.exists('.test')).toEqual(true);
  381. expect(treeSelect.find('.test')).toHaveStyle('color', 'red');
  382. expect(document.querySelector(`.${BASE_CLASS_PREFIX}-portal`).style.zIndex).toEqual("2000");
  383. });
  384. it('dropdownMatchSelectWidth = true', () => {
  385. // dropdownMatchSelectWidth default is true
  386. let props = {
  387. style: { width: 90 },
  388. defaultValue: 'abc',
  389. };
  390. let treeSelect = getTreeSelect(props);
  391. // cause jsdom doesn't support layout engine like browser, so you can't access offsetWidth/scrollWidth or use getBoundingRect(), it will always return 0;
  392. // just use getComputedStyle to avoid this problem.
  393. let selector = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select`).getDOMNode();
  394. let selectorWidth = window.getComputedStyle(selector).width; // expect 90px
  395. let list = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-popover`).getDOMNode();
  396. let listWidth = window.getComputedStyle(list).minWidth;
  397. expect(selectorWidth).toEqual(listWidth);
  398. treeSelect.unmount();
  399. });
  400. it('dropdownMatchSelectWidth = false', () => {
  401. let props = {
  402. style: { width: 90 },
  403. defaultValue: 'abc',
  404. dropdownMatchSelectWidth: false,
  405. };
  406. let treeSelect = getTreeSelect(props);
  407. let selector = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select`).getDOMNode();
  408. let selectorWidth = window.getComputedStyle(selector).width; // expect 90px
  409. let list = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-popover`).getDOMNode();
  410. let listWidth = window.getComputedStyle(list).minWidth;
  411. expect(selectorWidth).not.toEqual(listWidth);
  412. treeSelect.unmount();
  413. });
  414. it('getPopupContainer', () => {
  415. let treeSelect = getTreeSelect({
  416. getPopupContainer: () => document.querySelector(`.${BASE_CLASS_PREFIX}-tree-select`),
  417. });
  418. let dom = document.querySelector(`.${BASE_CLASS_PREFIX}-tree-select`);
  419. expect(dom.querySelectorAll(`.${BASE_CLASS_PREFIX}-tree-select-popover`).length).toEqual(1);
  420. });
  421. it('custom prefix / suffix / insetLabel', () => {
  422. let prefix = <div className="prefix">prefix content</div>;
  423. let suffix = <div className="suffix">suffix content</div>;
  424. let insetLabel = 'semi';
  425. const props = {
  426. prefix: prefix,
  427. suffix: suffix,
  428. };
  429. let treeSelect = getTreeSelect(props);
  430. expect(treeSelect.contains(prefix)).toEqual(true);
  431. expect(treeSelect.contains(suffix)).toEqual(true);
  432. treeSelect.unmount();
  433. let ntreeSelect = getTreeSelect({ insetLabel: insetLabel });
  434. expect(ntreeSelect.contains(insetLabel)).toEqual(true);
  435. ntreeSelect.unmount();
  436. });
  437. it('empty data', () => {
  438. let treeSelect = getTreeSelect({
  439. treeData: [],
  440. emptyContent: 'empty'
  441. });
  442. let node = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  443. expect(node.length).toEqual(1);
  444. expect(node.hasClass(`${BASE_CLASS_PREFIX}-tree-option-empty`)).toEqual(true);
  445. expect(node.instance().textContent).toEqual('empty');
  446. });
  447. it('defaultOpen', () => {
  448. let props = {
  449. defaultOpen: false,
  450. };
  451. let treeSelect = getTreeSelect(props);
  452. expect(treeSelect.state().isOpen).toEqual(false);
  453. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-popover`).exists()).toEqual(false);
  454. treeSelect.unmount();
  455. let ntreeSelect = getTreeSelect({ defaultOpen: true, });
  456. expect(ntreeSelect.state().isOpen).toEqual(true);
  457. expect(ntreeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-popover`).exists()).toEqual(true);
  458. let options = ntreeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  459. expect(ntreeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(2);
  460. expect(options.at(0).getDOMNode().textContent).toEqual('亚洲');
  461. expect(options.at(1).getDOMNode().textContent).toEqual('北美洲');
  462. });
  463. it('defaultValue', () => {
  464. // auto expand parent, if node exist means parent is open
  465. let treeSelect = getTreeSelect({
  466. defaultValue: 'Beijing'
  467. });
  468. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`);
  469. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('北京');
  470. expect(selectedNode.instance().textContent).toEqual('北京');
  471. treeSelect.unmount();
  472. // array case only select first item
  473. let tree2 = getTreeSelect({
  474. defaultValue: ['Riben', 'Beijing']
  475. });
  476. let selectedNode2 = tree2.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`);
  477. expect(selectedNode2.instance().textContent).toEqual('日本');
  478. expect(tree2.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('日本');
  479. expect(tree2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  480. })
  481. it('defaultExpandedKeys', () => {
  482. // auto expand parent
  483. let treeSelect = getTreeSelect({
  484. defaultExpandedKeys: ['zhongguo', 'beimeizhou']
  485. });
  486. // yazhou beimeizhou
  487. let topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  488. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  489. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  490. // zhongguo riben
  491. let children = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  492. expect(children.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  493. expect(children.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  494. })
  495. it('defaultExpandAll', () => {
  496. let treeSelect = getTreeSelect({
  497. defaultExpandAll: true
  498. });
  499. let nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  500. let collapsed = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-collapsed`);
  501. expect(nodes.length).toEqual(10);
  502. expect(collapsed.length).toEqual(0);
  503. treeSelect.setProps({ treeData: treeData2});
  504. treeSelect.update();
  505. const nodes2 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  506. const collapsed2 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-collapsed`);
  507. expect(nodes2.length).toEqual(2);
  508. expect(collapsed2.length).toEqual(2);
  509. })
  510. it('expandAll', () => {
  511. const treeSelect = getTreeSelect({
  512. expandAll: true
  513. });
  514. const nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  515. const collapsed = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-collapsed`);
  516. expect(nodes.length).toEqual(10);
  517. expect(collapsed.length).toEqual(0);
  518. treeSelect.setProps({ treeData: treeData2});
  519. treeSelect.update();
  520. const nodes2 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  521. const collapsed2 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-collapsed`);
  522. expect(nodes2.length).toEqual(5);
  523. expect(collapsed2.length).toEqual(0);
  524. })
  525. it('if expandedKeys values work', () => {
  526. // auto expand parent
  527. let treeSelect = getTreeSelect({
  528. expandedKeys: ['beimeizhou']
  529. });
  530. // yazhou beimeizhou
  531. let topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  532. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  533. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  534. treeSelect.setProps({ expandedKeys: ['yazhou', 'zhongguo', 'beimeizhou'] });
  535. treeSelect.update();
  536. // zhongguo riben
  537. let children = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  538. expect(children.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  539. expect(children.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  540. });
  541. it('if expand behavior works / onExpand', () => {
  542. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  543. let spyOnExpand = sinon.spy(() => { });
  544. let treeSelect = getTreeSelect({
  545. onExpand: spyOnExpand,
  546. });
  547. // yazhou
  548. let topNodeAsia = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  549. let expandIcon = topNodeAsia.find(`.${BASE_CLASS_PREFIX}-tree-option-expand-icon`).at(0);
  550. // expand yazhou
  551. expandIcon.simulate('click', nativeEvent);
  552. expect(spyOnExpand.calledOnce).toBe(true);
  553. expect(spyOnExpand.calledWithMatch(["yazhou"], { expanded: true, node: { key: 'yazhou' } })).toEqual(true);
  554. // zhongguo riben
  555. let topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  556. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  557. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  558. // collapse yazhou
  559. expandIcon.simulate('click', nativeEvent);
  560. expect(spyOnExpand.calledWithMatch([], { expanded: false, node: { key: 'yazhou' } })).toEqual(true);
  561. topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  562. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  563. });
  564. it('if expandedKeys controlled work / onExpand', () => {
  565. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  566. let spyOnExpand = sinon.spy(() => { });
  567. let treeSelect = getTreeSelect({
  568. expandedKeys: ['beimeizhou'],
  569. onExpand: spyOnExpand,
  570. });
  571. // yazhou
  572. let topNodeAsia = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  573. let expandIcon = topNodeAsia.find(`.${BASE_CLASS_PREFIX}-tree-option-expand-icon`).at(0);
  574. // expand yazhou
  575. expandIcon.simulate('click', nativeEvent);
  576. expect(spyOnExpand.calledWithMatch(["beimeizhou", "yazhou"], { expanded: true, node: { key: 'yazhou' } })).toEqual(true);
  577. // zhongguo riben
  578. let topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  579. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  580. });
  581. it('select item / onSelect / onChange', () => {
  582. let spyOnSelect = sinon.spy(() => { });
  583. let spyOnChange = sinon.spy(() => { });
  584. let treeSelect = getTreeSelect({
  585. defaultExpandAll: true,
  586. onSelect: spyOnSelect,
  587. onChange: spyOnChange,
  588. });
  589. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  590. // select beijing
  591. nodeBeijing.simulate('click');
  592. // onSelect & onChange
  593. expect(spyOnSelect.calledOnce).toBe(true);
  594. expect(spyOnChange.calledOnce).toBe(true);
  595. expect(spyOnSelect.calledWithMatch('beijing', true, { key: "beijing" })).toEqual(true);
  596. expect(spyOnChange.calledWithMatch('Beijing', { key: "beijing" })).toEqual(true);
  597. let selectBox = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select`).at(0);
  598. selectBox.simulate('click');
  599. // classname
  600. nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  601. expect(nodeBeijing.hasClass(`${BASE_CLASS_PREFIX}-tree-option-selected`)).toEqual(true);
  602. // render in input box
  603. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('北京');
  604. // change
  605. let nodeAsia = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  606. // select asia
  607. nodeAsia.simulate('click');
  608. // onSelect & onChange
  609. expect(spyOnSelect.calledWithMatch('yazhou', true, { key: "yazhou" })).toEqual(true);
  610. expect(spyOnChange.calledWithMatch('Yazhou', { key: "yazhou" })).toEqual(true);
  611. selectBox.simulate('click');
  612. // classname
  613. nodeAsia = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  614. expect(nodeAsia.hasClass(`${BASE_CLASS_PREFIX}-tree-option-selected`)).toEqual(true);
  615. // render in input box
  616. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('亚洲');
  617. });
  618. it('onClear', () => {
  619. let spyOnClear = sinon.spy(() => { });
  620. let treeSelect = getTreeSelect({
  621. defaultExpandAll: true,
  622. onClear: spyOnClear,
  623. showClear: true,
  624. });
  625. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  626. // select beijing
  627. nodeBeijing.simulate('click');
  628. let nodeSelectTree = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select.${BASE_CLASS_PREFIX}-tree-select-single`).at(0);
  629. nodeSelectTree.simulate('mouseenter');
  630. let nodeClearIcon = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-clearbtn`).at(0);
  631. nodeClearIcon.simulate('click');
  632. expect(spyOnClear.calledOnce).toBe(true);
  633. })
  634. it('onChange + value not changed', () => {
  635. let spyOnSelect = sinon.spy(() => { });
  636. let spyOnChange = sinon.spy(() => { });
  637. let treeSelect = getTreeSelect({
  638. defaultExpandAll: true,
  639. onSelect: spyOnSelect,
  640. onChange: spyOnChange,
  641. defaultValue: 'Beijing'
  642. });
  643. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  644. // select beijing
  645. nodeBeijing.simulate('click');
  646. // onSelect & onChange
  647. expect(spyOnSelect.calledOnce).toBe(true);
  648. expect(spyOnChange.notCalled).toBe(true);
  649. });
  650. it('onChange + onChangeWithObject', () => {
  651. let spyOnChange = sinon.spy(() => { });
  652. let treeSelect = getTreeSelect({
  653. defaultExpandAll: true,
  654. onChangeWithObject: true,
  655. onChange: spyOnChange,
  656. });
  657. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  658. // select beijing
  659. nodeBeijing.simulate('click');
  660. // onSelect & onChange
  661. expect(spyOnChange.calledOnce).toBe(true);
  662. expect(spyOnChange.calledWithMatch({ key: "beijing" })).toEqual(true);
  663. });
  664. it('treeNodeLabelProp', () => {
  665. // auto expand parent, if node exist means parent is open
  666. let treeSelect = getTreeSelect({
  667. defaultValue: 'Beijing',
  668. treeNodeLabelProp: 'value'
  669. });
  670. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('Beijing');
  671. // select asia
  672. let nodeAsia = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  673. nodeAsia.simulate('click');
  674. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('Yazhou');
  675. })
  676. it('filterTreeNode = true shows input box', () => {
  677. let treeSelect = getTreeSelect({});
  678. let searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`)
  679. expect(searchWrapper.exists()).toEqual(false);
  680. treeSelect.setProps({
  681. filterTreeNode: true
  682. });
  683. treeSelect.update();
  684. searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`)
  685. expect(searchWrapper.exists()).toEqual(true);
  686. });
  687. it('searchPlaceholder', () => {
  688. let treeSelect = getTreeSelect({
  689. filterTreeNode: true,
  690. searchPlaceholder: 'test',
  691. });
  692. let searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`)
  693. expect(searchWrapper.find('input').instance().getAttribute('placeholder')).toEqual('test');
  694. });
  695. it('onSearch', () => {
  696. let onSearch = value => { };
  697. let spyOnSearch = sinon.spy(onSearch);
  698. let treeSelect = getTreeSelect({
  699. filterTreeNode: true,
  700. onSearch: spyOnSearch,
  701. });
  702. const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  703. let searchValue = 'semi';
  704. let event = { target: { value: searchValue } };
  705. searchWrapper.find('input').simulate('change', event);
  706. expect(spyOnSearch.calledOnce).toBe(true);
  707. expect(spyOnSearch.calledWithMatch(searchValue)).toBe(true);
  708. /* Check the input parameters of onSearch */
  709. searchValue = '北京';
  710. event = { target: { value: searchValue } };
  711. searchWrapper.find('input').simulate('change', event);
  712. expect(spyOnSearch.callCount).toBe(2);
  713. const firstCall = spyOnSearch.getCall(1);
  714. const args = firstCall.args;
  715. expect(args[0]).toEqual('北京');
  716. expect(args[1].includes('yazhou')).toEqual(true);
  717. expect(args[1].includes('zhongguo')).toEqual(true);
  718. });
  719. it('filterTreeNode shows correct result', () => {
  720. let treeSelect1 = getTreeSelect({
  721. filterTreeNode: true,
  722. });
  723. const searchWrapper = treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  724. let searchValue = '北';
  725. let event = { target: { value: searchValue } };
  726. searchWrapper.find('input').simulate('change', event);
  727. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(6);
  728. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(2);
  729. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(0).instance().textContent).toEqual('北');
  730. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(1).instance().textContent).toEqual('北');
  731. treeSelect1.unmount();
  732. let treeSelect2 = getTreeSelect({
  733. filterTreeNode: true,
  734. treeNodeFilterProp: 'value',
  735. });
  736. const searchWrapper2 = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  737. let searchValue2 = 'an';
  738. let event2 = { target: { value: searchValue2 } };
  739. searchWrapper2.find('input').simulate('change', event2);
  740. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(10);
  741. });
  742. it('filterTreeNode + no result', () => {
  743. let treeSelect1 = getTreeSelect({
  744. filterTreeNode: true,
  745. });
  746. const searchWrapper = treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  747. let searchValue = 'Bei';
  748. let event = { target: { value: searchValue } };
  749. searchWrapper.find('input').simulate('change', event);
  750. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(2);
  751. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(0);
  752. treeSelect1.unmount();
  753. let treeSelect2 = getTreeSelect({
  754. filterTreeNode: true,
  755. treeNodeFilterProp: 'value',
  756. });
  757. const searchWrapper2 = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  758. let searchValue2 = '北';
  759. let event2 = { target: { value: searchValue2 } };
  760. searchWrapper2.find('input').simulate('change', event2);
  761. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(2);
  762. });
  763. it('async load data', () => {
  764. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  765. const then = jest.fn(() => Promise.resolve());
  766. const loadData = jest.fn(() => ({ then }));
  767. const data = {
  768. label: '亚洲',
  769. value: 'Asia',
  770. key: 'asia',
  771. };
  772. const treeSelect = getTreeSelect({
  773. loadData,
  774. loadedKeys: ['0-1'],
  775. treeData: [data]
  776. });
  777. const topNodeAsia = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  778. const expandIcon = topNodeAsia.find(`.${BASE_CLASS_PREFIX}-tree-option-expand-icon`).at(0);
  779. expandIcon.simulate('click', nativeEvent);
  780. expect(loadData).toHaveBeenCalledWith(data);
  781. expect(then).toHaveBeenCalled();
  782. });
  783. it('filterTreeNode + treeNodeFilterProp', () => {
  784. let treeSelect = getTreeSelect({
  785. filterTreeNode: true,
  786. treeNodeFilterProp: 'value',
  787. });
  788. const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  789. let searchValue = 'Bei';
  790. let event = { target: { value: searchValue } };
  791. searchWrapper.find('input').simulate('change', event);
  792. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(6);
  793. });
  794. it('filterTreeNode + showFilteredOnly + no result', () => {
  795. let treeSelect = getTreeSelect({
  796. filterTreeNode: true,
  797. showFilteredOnly: true,
  798. });
  799. const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  800. let searchValue = 'Bei';
  801. let event = { target: { value: searchValue } };
  802. searchWrapper.find('input').simulate('change', event);
  803. let node = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  804. expect(node.length).toEqual(1);
  805. expect(node.hasClass(`${BASE_CLASS_PREFIX}-tree-option-empty`)).toEqual(true);
  806. });
  807. it('filterTreeNode + showFilteredOnly shows correct result', () => {
  808. let treeSelect = getTreeSelect({
  809. filterTreeNode: true,
  810. showFilteredOnly: true,
  811. });
  812. const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  813. let searchValue = '北';
  814. let event = { target: { value: searchValue } };
  815. searchWrapper.find('input').simulate('change', event);
  816. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(4);
  817. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(2);
  818. });
  819. it('filterTreeNode as a func', () => {
  820. let treeSelect = getTreeSelect({
  821. filterTreeNode: (inputValue, treeNode) => treeNode === inputValue,
  822. });
  823. const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  824. searchWrapper.find('input').simulate('change', { target: { value: '北' } });
  825. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(0);
  826. // update
  827. searchWrapper.find('input').simulate('change', { target: { value: '北京' } });
  828. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(1);
  829. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).instance().textContent).toEqual('北京');
  830. });
  831. it('controlled: value shows correct', () => {
  832. let treeSelect = getTreeSelect({
  833. value: 'Beijing'
  834. });
  835. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`);
  836. expect(selectedNode.instance().textContent).toEqual('北京');
  837. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('北京');
  838. treeSelect.unmount();
  839. // array case only select first item
  840. let treeSelect2 = getTreeSelect({
  841. value: ['Riben', 'Beijing']
  842. });
  843. let selectedNode2 = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`);
  844. expect(selectedNode2.instance().textContent).toEqual('日本');
  845. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('日本');
  846. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  847. });
  848. it('controlled: fire onChange and ui not update', () => {
  849. let spyOnChange = sinon.spy(() => { });
  850. let treeSelect = getTreeSelect({
  851. value: '',
  852. defaultExpandAll: true,
  853. onChange: spyOnChange,
  854. });
  855. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`).exists()).toEqual(false);
  856. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  857. // select beijing
  858. nodeBeijing.simulate('click');
  859. // onSelect & onChange
  860. expect(spyOnChange.calledOnce).toBe(true);
  861. expect(spyOnChange.calledWithMatch("Beijing")).toEqual(true);
  862. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`).exists()).toEqual(false);
  863. });
  864. it('controlled: value + onChangeWithObject', () => {
  865. let spyOnChange = sinon.spy(() => { });
  866. let treeSelect = getTreeSelect({
  867. value: {
  868. label: '北京',
  869. value: 'Beijing',
  870. key: 'beijing',
  871. },
  872. defaultExpandAll: true,
  873. onChange: spyOnChange,
  874. onChangeWithObject: true,
  875. });
  876. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`).exists()).toEqual(true);
  877. });
  878. it('virtualized: fixed height', () => {
  879. let treeSelect = getTreeSelect({
  880. defaultExpandAll: true,
  881. virtualize: {
  882. itemSize: 28,
  883. height: 84,
  884. },
  885. });
  886. // virtual list
  887. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-virtual-list`).exists()).toEqual(true);
  888. // fewer nodes
  889. let nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`);
  890. expect(nodes.length).toBeLessThan(10);
  891. });
  892. it('disabled', () => {
  893. let treeSelect = getTreeSelect({
  894. disabled: true,
  895. });
  896. let inputBox = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-disabled`);
  897. expect(inputBox.exists()).toEqual(true);
  898. expect(treeSelect.state().isOpen).toEqual(false);
  899. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-wrapper`).exists()).toEqual(false);
  900. inputBox.simulate('click');
  901. expect(treeSelect.state().isOpen).toEqual(false);
  902. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-wrapper`).exists()).toEqual(false);
  903. });
  904. it('renderSelectedItem', () => {
  905. let spyOnSelect = sinon.spy(() => { });
  906. let spyOnChange = sinon.spy(() => { });
  907. let treeSelect = getTreeSelect({
  908. renderSelectedItem: treeNode => treeNode.value,
  909. defaultExpandAll: true,
  910. onSelect: spyOnSelect,
  911. onChange: spyOnChange,
  912. });
  913. const yaZhouKey = 'yazhou';
  914. const yaZhouValue = 'Yazhou';
  915. let nodeYaZhou = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  916. nodeYaZhou.simulate('click');
  917. // 判断回调,这里其实没有更新,不是很重要
  918. expect(spyOnSelect.calledOnce).toBe(true);
  919. expect(spyOnChange.calledOnce).toBe(true);
  920. expect(spyOnSelect.getCall(0).args[0]).toEqual(yaZhouKey);
  921. expect(spyOnChange.getCall(0).args[0]).toEqual(yaZhouValue);
  922. // 判断已选项的渲染
  923. const innerHTML = document.querySelector('.semi-tree-select-selection span').textContent;
  924. expect(innerHTML).toEqual(yaZhouValue);
  925. });
  926. it('search autofocus', () => {
  927. let treeSelect = getTreeSelect({
  928. filterTreeNode: true,
  929. searchAutoFocus: true,
  930. });
  931. let selectEle = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select`)
  932. selectEle.simulate('click');
  933. setTimeout(() => {
  934. let searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`)
  935. const searchInput = searchWrapper.find(`input`)
  936. expect(searchInput.matchesElement(document.activeElement)).toEqual(true);
  937. done();
  938. }, 100);
  939. });
  940. it('treeData is updated should not clear value when uncontrolled mode and single selection', () => {
  941. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  942. const treeSelect = getTreeSelect({
  943. defaultExpandAll: true
  944. });
  945. treeSelect
  946. .find(`.${BASE_CLASS_PREFIX}-tree-option-list .${BASE_CLASS_PREFIX}-tree-option`)
  947. .at(2)
  948. .simulate('click', nativeEvent);
  949. expect(
  950. treeSelect
  951. .find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection span`)
  952. .getDOMNode()
  953. .textContent
  954. ).toEqual('北京');
  955. treeSelect.setProps({ treeData: treeChildren});
  956. treeSelect.update();
  957. expect(
  958. treeSelect
  959. .find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection span`)
  960. .getDOMNode()
  961. .textContent
  962. ).toEqual('北京');
  963. treeSelect.setProps({ treeData: treeData2});
  964. treeSelect.update();
  965. expect(
  966. treeSelect
  967. .find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection span`)
  968. .getDOMNode()
  969. .textContent
  970. ).toEqual('');
  971. });
  972. it('treeData is updated should not clear value when uncontrolled mode and multiple selection', () => {
  973. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  974. const treeSelect = getTreeSelect({
  975. defaultExpandAll: true,
  976. multiple: true,
  977. });
  978. treeSelect
  979. .find(`.${BASE_CLASS_PREFIX}-tree-option-list .${BASE_CLASS_PREFIX}-tree-option`)
  980. .at(2)
  981. .simulate('click', nativeEvent);
  982. expect(
  983. treeSelect
  984. .find(`.${BASE_CLASS_PREFIX}-tree-select-selection .${BASE_CLASS_PREFIX}-tag-group .${BASE_CLASS_PREFIX}-tag`)
  985. .at(0)
  986. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  987. .getDOMNode()
  988. .textContent
  989. ).toEqual('北京');
  990. treeSelect.setProps({ treeData: treeChildren});
  991. treeSelect.update();
  992. expect(
  993. treeSelect
  994. .find(`.${BASE_CLASS_PREFIX}-tree-select-selection .${BASE_CLASS_PREFIX}-tag-group .${BASE_CLASS_PREFIX}-tag`)
  995. .at(0)
  996. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  997. .getDOMNode()
  998. .textContent
  999. ).toEqual('北京');
  1000. treeSelect.setProps({ treeData: treeData2});
  1001. treeSelect.update();
  1002. expect(
  1003. treeSelect
  1004. .find(`.${BASE_CLASS_PREFIX}-tree-select-selection .${BASE_CLASS_PREFIX}-tag-group .${BASE_CLASS_PREFIX}-tag`)
  1005. .at(0)
  1006. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1007. .length
  1008. ).toEqual(0);
  1009. });
  1010. it('treeData is updated should not clear value when controlled mode and single selection', () => {
  1011. const treeSelect = getTreeSelect({
  1012. defaultExpandAll: true,
  1013. value: 'Beijing'
  1014. });
  1015. expect(
  1016. treeSelect
  1017. .find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection span`)
  1018. .getDOMNode()
  1019. .textContent
  1020. ).toEqual('北京');
  1021. treeSelect.setProps({ treeData: treeChildren});
  1022. treeSelect.update();
  1023. expect(
  1024. treeSelect
  1025. .find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection span`)
  1026. .getDOMNode()
  1027. .textContent
  1028. ).toEqual('北京');
  1029. treeSelect.setProps({ treeData: treeData3});
  1030. treeSelect.update();
  1031. // If the value exists, but not in the treeData, the value will be displayed in the trigger
  1032. expect(
  1033. treeSelect
  1034. .find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection span`)
  1035. .getDOMNode()
  1036. .textContent
  1037. ).toEqual('Beijing');
  1038. });
  1039. it('treeData is updated should not clear value when controlled mode and multiple selection', () => {
  1040. const treeSelect = getTreeSelect({
  1041. defaultExpandAll: true,
  1042. multiple: true,
  1043. value: 'Beijing'
  1044. });
  1045. expect(
  1046. treeSelect
  1047. .find(`.${BASE_CLASS_PREFIX}-tree-select-selection .${BASE_CLASS_PREFIX}-tag-group .${BASE_CLASS_PREFIX}-tag`)
  1048. .at(0)
  1049. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1050. .getDOMNode()
  1051. .textContent
  1052. ).toEqual('北京');
  1053. treeSelect.setProps({ treeData: treeChildren});
  1054. treeSelect.update();
  1055. expect(
  1056. treeSelect
  1057. .find(`.${BASE_CLASS_PREFIX}-tree-select-selection .${BASE_CLASS_PREFIX}-tag-group .${BASE_CLASS_PREFIX}-tag`)
  1058. .at(0)
  1059. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1060. .getDOMNode()
  1061. .textContent
  1062. ).toEqual('北京');
  1063. treeSelect.setProps({ treeData: treeData3});
  1064. treeSelect.update();
  1065. expect(
  1066. treeSelect
  1067. .find(`.${BASE_CLASS_PREFIX}-tree-select-selection .${BASE_CLASS_PREFIX}-tag-group .${BASE_CLASS_PREFIX}-tag`)
  1068. .at(0)
  1069. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1070. .length
  1071. ).toEqual(1);
  1072. });
  1073. it('expandedKeys controlled + filterTreeNode', () => {
  1074. const spyOnExpand = sinon.spy(() => { });
  1075. const treeSelect = getTreeSelect({
  1076. expandedKeys: [],
  1077. onExpand: spyOnExpand,
  1078. filterTreeNode: true,
  1079. });
  1080. const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  1081. const searchValue = '北京';
  1082. const event = { target: { value: searchValue } };
  1083. searchWrapper.find('input').simulate('change', event);
  1084. expect(spyOnExpand.callCount).toBe(0);
  1085. /* filter won't impact on the expansion of node when expandedKeys is controlled */
  1086. const topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  1087. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  1088. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  1089. });
  1090. it('option not in treeData + treeData item with value', () => {
  1091. const spyOnSelect = sinon.spy(() => { });
  1092. const spyOnChange = sinon.spy(() => { });
  1093. let treeSelect = getTreeSelect({
  1094. defaultValue: 'fish',
  1095. defaultExpandAll: true,
  1096. onSelect: spyOnSelect,
  1097. onChange: spyOnChange,
  1098. });
  1099. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('fish');
  1100. // beijing
  1101. let topNodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  1102. topNodeBeijing.simulate('click');
  1103. expect(spyOnChange.calledWithMatch("Beijing")).toEqual(true);
  1104. treeSelect.unmount();
  1105. // onChangeWithObject
  1106. treeSelect = getTreeSelect({
  1107. defaultValue: { label: '鱼', value: 'Fish', key: 'fish' },
  1108. onChangeWithObject: true,
  1109. defaultExpandAll: true,
  1110. onSelect: spyOnSelect,
  1111. onChange: spyOnChange,
  1112. });
  1113. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('鱼');
  1114. // beijing
  1115. topNodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  1116. topNodeBeijing.simulate('click');
  1117. expect(spyOnChange.calledWithMatch({ label: '北京', value: 'Beijing', key: 'beijing' })).toEqual(true);
  1118. treeSelect.unmount();
  1119. })
  1120. it('option not in treeData + treeData item without value', () => {
  1121. const spyOnSelect = sinon.spy(() => { });
  1122. const spyOnChange = sinon.spy(() => { });
  1123. let treeSelect = getTreeSelect({
  1124. treeData: treeDataWithoutValue,
  1125. defaultValue: 'fish',
  1126. defaultExpandAll: true,
  1127. onSelect: spyOnSelect,
  1128. onChange: spyOnChange,
  1129. });
  1130. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('fish');
  1131. // beijing
  1132. let topNodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  1133. topNodeBeijing.simulate('click');
  1134. expect(spyOnChange.calledWithMatch("beijing")).toEqual(true);
  1135. treeSelect.unmount();
  1136. // onChangeWithObject
  1137. treeSelect = getTreeSelect({
  1138. defaultValue: { label: '鱼', key: 'fish' },
  1139. onChangeWithObject: true,
  1140. defaultExpandAll: true,
  1141. onSelect: spyOnSelect,
  1142. onChange: spyOnChange,
  1143. });
  1144. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).getDOMNode().textContent).toEqual('鱼');
  1145. // beijing
  1146. topNodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  1147. topNodeBeijing.simulate('click');
  1148. expect(spyOnChange.calledWithMatch({ label: '北京', key: 'beijing' })).toEqual(true);
  1149. treeSelect.unmount();
  1150. })
  1151. it('keyMaps', () => {
  1152. let spyOnChange = sinon.spy(() => { });
  1153. let treeSelect = getTreeSelect({
  1154. treeData: specialTreeData,
  1155. defaultValue: 'Beijing',
  1156. onChange: spyOnChange,
  1157. defaultExpandAll: true,
  1158. motion: false,
  1159. keyMaps: defaultKeyMaps
  1160. });
  1161. let disabledNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`).at(0);
  1162. expect(disabledNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('中国');
  1163. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`);
  1164. expect(selectedNode.instance().textContent).toEqual('北京');
  1165. let nodeShanghai = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(1);
  1166. // select beijing
  1167. nodeShanghai.simulate('click');
  1168. // onSelect & onChange
  1169. expect(spyOnChange.calledOnce).toBe(true);
  1170. expect(spyOnChange.calledWithMatch("Shanghai")).toEqual(true);
  1171. let selectContentNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection-content`)
  1172. expect(selectContentNode.instance().textContent).toEqual('上海');
  1173. });
  1174. it('keyMaps + onChangeWithObject', () => {
  1175. let spyOnChange = sinon.spy(() => { });
  1176. let treeSelect = getTreeSelect({
  1177. treeData: specialTreeData,
  1178. defaultValue: {
  1179. label1: '北京',
  1180. value1: 'Beijing',
  1181. key1: 'beijing',
  1182. },
  1183. onChangeWithObject: true,
  1184. onChange: spyOnChange,
  1185. defaultExpandAll: true,
  1186. keyMaps: defaultKeyMaps
  1187. });
  1188. let disabledNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`).at(0);
  1189. expect(disabledNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('中国');
  1190. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-selected`);
  1191. expect(selectedNode.instance().textContent).toEqual('北京');
  1192. let nodeShanghai = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(1);
  1193. // select beijing
  1194. nodeShanghai.simulate('click');
  1195. // onSelect & onChange
  1196. expect(spyOnChange.calledOnce).toBe(true);
  1197. expect(spyOnChange.calledWithMatch({
  1198. label1: '上海',
  1199. value1: 'Shanghai',
  1200. key1: 'shanghai',
  1201. })).toEqual(true);
  1202. let selectContentNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection-content`)
  1203. expect(selectContentNode.instance().textContent).toEqual('上海');
  1204. });
  1205. it('onSearch + filteredNodes', () => {
  1206. let spyOnSearch = sinon.spy(() => { });
  1207. console.log('treeDataEn', treeDataEn);
  1208. let treeSelect = getTreeSelect({
  1209. filterTreeNode: true,
  1210. treeData: treeDataEn,
  1211. onSearch: spyOnSearch
  1212. });
  1213. const searchWrapper = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-search-wrapper`);
  1214. let searchValue = 'o';
  1215. let event = { target: { value: searchValue } };
  1216. searchWrapper.find('input').simulate('change', event);
  1217. const firstCall = spyOnSearch.getCall(0);
  1218. const args = firstCall.args;
  1219. expect(args[0]).toEqual(searchValue);
  1220. expect(args[1]).toEqual(['0-1', '0']);
  1221. expect(args[2]).toEqual([
  1222. treeDataEnNA,
  1223. { "label": "Osaka", "value": "Osaka", "key": "0-1-0" }
  1224. ]);
  1225. });
  1226. })