cascader.test.js 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  1. import { Cascader, Icon } from '../../index';
  2. import { clear } from 'jest-date-mock';
  3. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  4. const animationMs = 200;
  5. const sleep = (ms = animationMs) =>
  6. new Promise((resolve, reject) =>
  7. setTimeout(() => {
  8. resolve(ms);
  9. }, ms)
  10. );
  11. const getPopupContainer = () => document.querySelector(`.${BASE_CLASS_PREFIX}-cascader`);
  12. const treeData = [
  13. {
  14. label: '亚洲',
  15. value: 'Asia',
  16. key: 'Asia',
  17. children: [
  18. {
  19. label: '中国',
  20. value: 'China',
  21. key: 'China',
  22. children: [
  23. {
  24. label: '北京',
  25. value: 'Beijing',
  26. key: 'beijing',
  27. },
  28. {
  29. label: '上海',
  30. value: 'Shanghai',
  31. key: 'shanghai',
  32. },
  33. ],
  34. },
  35. ],
  36. },
  37. {
  38. label: '北美洲',
  39. value: 'North America',
  40. key: 'North America',
  41. children: [
  42. {
  43. label: '美国',
  44. value: 'United States',
  45. key: 'United States',
  46. },
  47. {
  48. label: '加拿大',
  49. value: 'Canada',
  50. key: 'Canada',
  51. },
  52. ],
  53. },
  54. ];
  55. const treeDataWithDisabled = [
  56. {
  57. label: '亚洲',
  58. value: 'Asia',
  59. key: 'Asia',
  60. children: [
  61. {
  62. label: '中国',
  63. value: 'China',
  64. key: 'China',
  65. disabled: true,
  66. children: [
  67. {
  68. label: '北京',
  69. value: 'Beijing',
  70. key: 'beijing',
  71. },
  72. {
  73. label: '上海',
  74. value: 'Shanghai',
  75. key: 'shanghai',
  76. },
  77. ],
  78. },
  79. {
  80. label: '韩国',
  81. value: 'Hanguo',
  82. key: 'hanguo',
  83. }
  84. ],
  85. }
  86. ];
  87. const treeDataWithReactNode = [
  88. {
  89. label: <strong>亚洲</strong>,
  90. value: 'Asia',
  91. key: 'Asia',
  92. children: [
  93. {
  94. label: '中国',
  95. value: 'China',
  96. key: 'China',
  97. children: [
  98. {
  99. label: '北京',
  100. value: 'Beijing',
  101. key: 'beijing',
  102. },
  103. {
  104. label: <div>上海</div>,
  105. value: 'Shanghai',
  106. key: 'shanghai',
  107. },
  108. ],
  109. }
  110. ],
  111. },
  112. {
  113. label: <p>北美洲</p>,
  114. value: 'North America',
  115. key: 'North America',
  116. }
  117. ];
  118. let commonProps = {
  119. // Cascader use Popup Layer to show candidate option,
  120. // but all Popup Layer which extends from Tooltip (eg Popover, Dropdown) have animation and delay.
  121. // Turn off animation and delay during testing, to avoid wating (something like setTimeOut/balabala...) in the test code
  122. motion: false,
  123. mouseEnterDelay: 0,
  124. mouseLeaveDelay: 0,
  125. };
  126. function render(props) {
  127. props = { treeData: treeData, ...commonProps, ...props };
  128. return mount(<Cascader {...props} />, {
  129. attachTo: document.getElementById('container'),
  130. });
  131. }
  132. describe('Cascader', () => {
  133. beforeEach(() => {
  134. // Avoid `attachTo: document.body` Warning
  135. // clear();
  136. const div = document.createElement('div');
  137. div.setAttribute('id', 'container');
  138. document.body.appendChild(div);
  139. });
  140. afterEach(() => {
  141. const div = document.getElementById('container');
  142. if (div) {
  143. document.body.removeChild(div);
  144. }
  145. document.body.innerHTML = '';
  146. });
  147. it('className / style', () => {
  148. let props = {
  149. className: 'test',
  150. style: { height: 420 },
  151. };
  152. let cascader = render(props);
  153. expect(cascader.hasClass('test')).toEqual(true);
  154. expect(cascader.find('div.test')).toHaveStyle('height', 420);
  155. });
  156. it('with placeholder', () => {
  157. const props = { placeholder: 'semi' };
  158. const cascader = render(props);
  159. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection-placeholder`).instance().textContent).toEqual(
  160. 'semi'
  161. );
  162. });
  163. it('with validateStatus', () => {
  164. const props = {};
  165. const cascader = render(props);
  166. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-error`)).toEqual(false);
  167. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-warning`)).toEqual(false);
  168. cascader.setProps({ validateStatus: `error` });
  169. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-error`)).toEqual(true);
  170. cascader.setProps({ validateStatus: `warning` });
  171. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-warning`)).toEqual(true);
  172. });
  173. it('different size', () => {
  174. const props = {};
  175. const cascader = render(props);
  176. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-large`)).toEqual(false);
  177. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-small`)).toEqual(false);
  178. cascader.setProps({ size: 'large' });
  179. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-large`)).toEqual(true);
  180. cascader.setProps({ size: 'small' });
  181. expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-small`)).toEqual(true);
  182. });
  183. it('custom prefix / suffix / insetLabel', () => {
  184. let prefix = <div className="prefix">prefix content</div>;
  185. let suffix = <div className="suffix">suffix content</div>;
  186. let insetLabel = 'semi';
  187. const props = {
  188. prefix: prefix,
  189. suffix: suffix,
  190. };
  191. let cascader = render(props);
  192. expect(cascader.contains(prefix)).toEqual(true);
  193. expect(cascader.contains(suffix)).toEqual(true);
  194. cascader.unmount();
  195. let cascader2 = render({ insetLabel: insetLabel });
  196. expect(cascader2.contains(insetLabel)).toEqual(true);
  197. cascader2.unmount();
  198. });
  199. it('empty data / empty content', () => {
  200. let cascader = render({
  201. treeData: [],
  202. defaultOpen: true,
  203. });
  204. // await sleep();
  205. let opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`);
  206. expect(opt.length).toEqual(1);
  207. expect(opt[0].className.includes(`${BASE_CLASS_PREFIX}-cascader-option-empty`)).toEqual(true);
  208. cascader.setProps({ emptyContent: 'test' });
  209. cascader.update();
  210. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0].textContent).toEqual('test');
  211. // done();
  212. });
  213. it('dynamic treeData in multiple and uncontrolled mode', () => {
  214. const cascader = render({
  215. defaultValue: 'Asia',
  216. multiple: true,
  217. });
  218. const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`);
  219. expect(opt.length).toEqual(1);
  220. cascader.setProps({ treeData: treeDataWithDisabled });
  221. cascader.update();
  222. expect(opt.length).toEqual(1);
  223. });
  224. it('dynamic treeData in multiple and controlled mode', () => {
  225. const cascader = render({
  226. value: 'Asia',
  227. multiple: true,
  228. });
  229. const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`);
  230. expect(opt.length).toEqual(1);
  231. cascader.setProps({ treeData: treeDataWithDisabled });
  232. cascader.update();
  233. expect(opt.length).toEqual(1);
  234. });
  235. it('getPopupContainer', () => {
  236. let cascader = render({
  237. getPopupContainer: getPopupContainer,
  238. defaultOpen: true,
  239. });
  240. // await sleep();
  241. let dom = document.querySelector(`.${BASE_CLASS_PREFIX}-cascader`);
  242. expect(dom.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(1);
  243. // done();
  244. });
  245. it('defaultOpen', () => {
  246. let cascader = render({
  247. defaultOpen: true,
  248. });
  249. // await sleep();
  250. expect(cascader.state().isOpen).toEqual(true);
  251. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(1);
  252. // done();
  253. });
  254. it('custom dropdownClassNam/dropdownStyle/zIndex', () => {
  255. let props = {
  256. dropdownClassName: 'test',
  257. dropdownStyle: {
  258. color: 'red',
  259. },
  260. defaultOpen: true,
  261. zIndex: 2000,
  262. };
  263. let cascader = render(props);
  264. // await sleep();
  265. const dropdown = document.querySelector(`.${BASE_CLASS_PREFIX}-cascader-popover`);
  266. expect(document.querySelector(`.${BASE_CLASS_PREFIX}-portal`).style.zIndex).toEqual('2000');
  267. expect(dropdown.className.includes('test')).toEqual(true);
  268. expect(dropdown.style.color).toEqual('red');
  269. // done();
  270. });
  271. it('defaultValue', () => {
  272. let cascader = render({
  273. defaultValue: ['Asia', 'China', 'Beijing'],
  274. defaultOpen: true,
  275. });
  276. // await sleep();
  277. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  278. '亚洲 / 中国 / 北京'
  279. );
  280. let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  281. expect(lists.length).toEqual(3);
  282. let activeItems = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-active`);
  283. expect(activeItems.length).toEqual(2);
  284. expect(activeItems[0].textContent).toEqual('亚洲');
  285. expect(activeItems[1].textContent).toEqual('中国');
  286. let selectItem = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-select`);
  287. expect(selectItem.length).toEqual(1);
  288. expect(selectItem[0].textContent).toEqual('北京');
  289. expect(selectItem[0].querySelectorAll(`.${BASE_CLASS_PREFIX}-icon`).length).toEqual(1);
  290. // done();
  291. });
  292. it('displayProp', () => {
  293. let cascader = render({
  294. defaultValue: ['Asia', 'China', 'Beijing'],
  295. displayProp: 'value',
  296. });
  297. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  298. 'Asia / China / Beijing'
  299. );
  300. });
  301. it('displayRender', () => {
  302. let spyOnRender = sinon.spy(() => {});
  303. let cascader = render({
  304. defaultValue: ['Asia', 'China', 'Beijing'],
  305. displayRender: spyOnRender,
  306. });
  307. expect(spyOnRender.calledWithMatch(['亚洲', '中国', '北京'])).toEqual(true);
  308. cascader.unmount();
  309. let cusRender = render({
  310. defaultValue: ['Asia', 'China', 'Beijing'],
  311. displayRender: list => '已选择:' + list.join(' -> '),
  312. });
  313. expect(cusRender.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  314. '已选择:亚洲 -> 中国 -> 北京'
  315. );
  316. });
  317. it('label is ReactNode when unsearchable and single-selection mode', () => {
  318. const cascader = render({
  319. defaultValue: ['Asia', 'China', 'Shanghai'],
  320. treeData: treeDataWithReactNode
  321. });
  322. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span strong`).getDOMNode().textContent).toEqual(
  323. '亚洲'
  324. );
  325. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span div`).getDOMNode().textContent).toEqual(
  326. '上海'
  327. );
  328. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(
  329. '亚洲 / 中国 / 上海'
  330. );
  331. cascader.unmount();
  332. const cascader2 = render({
  333. defaultValue: ['North America'],
  334. treeData: treeDataWithReactNode,
  335. });
  336. expect(cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection span p`).getDOMNode().textContent).toEqual(
  337. '北美洲'
  338. );
  339. expect(cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(
  340. '北美洲'
  341. );
  342. cascader2.unmount();
  343. const cascader3 = render({
  344. defaultValue: ['Asia', 'China', 'Shanghai'],
  345. treeData: treeDataWithReactNode,
  346. separator: ' - '
  347. });
  348. expect(cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection span strong`).getDOMNode().textContent).toEqual(
  349. '亚洲'
  350. );
  351. expect(cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection span div`).getDOMNode().textContent).toEqual(
  352. '上海'
  353. );
  354. expect(cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(
  355. '亚洲 - 中国 - 上海'
  356. );
  357. cascader3.unmount();
  358. });
  359. it('disabled', () => {
  360. let cascader = render({
  361. disabled: true,
  362. });
  363. expect(
  364. document
  365. .querySelector(`.${BASE_CLASS_PREFIX}-cascader`)
  366. .className.includes(`${BASE_CLASS_PREFIX}-cascader-disabled`)
  367. ).toEqual(true);
  368. // cannot select
  369. let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  370. selectBox.simulate('click');
  371. // await sleep();
  372. expect(cascader.state().isOpen).toEqual(false);
  373. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(0);
  374. // done();
  375. });
  376. it('disabled + defaultValue', () => {
  377. const cascaderWithSingle = render({
  378. treeData: treeDataWithDisabled,
  379. changeOnSelect: true,
  380. defaultValue:['Asia', 'China']
  381. });
  382. expect(
  383. cascaderWithSingle
  384. .find(`.${BASE_CLASS_PREFIX}-cascader-selection span`)
  385. .at(0)
  386. .getDOMNode()
  387. .textContent
  388. ).toEqual('亚洲 / 中国');
  389. cascaderWithSingle.unmount();
  390. const cascaderWithSingleFilter = render({
  391. treeData: treeDataWithDisabled,
  392. changeOnSelect: true,
  393. filterTreeNode: true,
  394. defaultValue:['Asia', 'China']
  395. });
  396. expect(
  397. cascaderWithSingleFilter
  398. .find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper span`)
  399. .getDOMNode()
  400. .textContent
  401. ).toEqual('亚洲 / 中国');
  402. cascaderWithSingleFilter.unmount();
  403. const cascaderWithSingleControlled = render({
  404. treeData: treeDataWithDisabled,
  405. changeOnSelect: true,
  406. value: ['Asia', 'China'],
  407. });
  408. expect(cascaderWithSingleControlled.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(
  409. '亚洲 / 中国'
  410. );
  411. cascaderWithSingleControlled.unmount();
  412. const cascaderWithMultiple = render({
  413. treeData: treeDataWithDisabled,
  414. multiple: true,
  415. defaultValue:['Asia', 'China']
  416. });
  417. expect(
  418. cascaderWithMultiple
  419. .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`)
  420. .at(0)
  421. .getDOMNode()
  422. .textContent
  423. ).toEqual('中国');
  424. cascaderWithMultiple.unmount();
  425. const cascaderWithMultipleFilter = render({
  426. treeData: treeDataWithDisabled,
  427. multiple: true,
  428. filterTreeNode: true,
  429. defaultValue:['Asia', 'China']
  430. });
  431. expect(
  432. cascaderWithMultipleFilter
  433. .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`)
  434. .at(0)
  435. .getDOMNode()
  436. .textContent
  437. ).toEqual('中国');
  438. cascaderWithMultipleFilter.unmount();
  439. const cascaderWithMultipleControlled = render({
  440. treeData: treeDataWithDisabled,
  441. multiple: true,
  442. value:['Asia', 'China']
  443. });
  444. expect(
  445. cascaderWithMultipleControlled
  446. .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`)
  447. .at(0)
  448. .getDOMNode()
  449. .textContent
  450. ).toEqual('中国');
  451. cascaderWithMultipleControlled.unmount();
  452. });
  453. it('select item / onSelect / onChange', () => {
  454. let spyOnSelect = sinon.spy(() => {});
  455. let spyOnChange = sinon.spy(() => {});
  456. let cascader = render({
  457. defaultOpen: true,
  458. onSelect: spyOnSelect,
  459. onChange: spyOnChange,
  460. });
  461. // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  462. // selectBox.simulate('click');
  463. // await sleep();
  464. let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  465. expect(lists.length).toEqual(1);
  466. lists[0].querySelectorAll('li')[0].click();
  467. lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  468. expect(lists.length).toEqual(2);
  469. expect(spyOnSelect.notCalled).toBe(true);
  470. expect(spyOnChange.notCalled).toBe(true);
  471. expect(
  472. lists[0]
  473. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  474. .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`)
  475. ).toEqual(true);
  476. lists[1].querySelectorAll('li')[0].click();
  477. lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  478. expect(lists.length).toEqual(3);
  479. expect(spyOnSelect.notCalled).toBe(true);
  480. expect(spyOnChange.notCalled).toBe(true);
  481. expect(
  482. lists[1]
  483. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  484. .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`)
  485. ).toEqual(true);
  486. lists[2].querySelectorAll('li')[0].click();
  487. expect(spyOnSelect.calledOnce).toBe(true);
  488. expect(spyOnChange.calledOnce).toBe(true);
  489. expect(spyOnSelect.calledWithMatch('Beijing')).toEqual(true);
  490. expect(spyOnChange.calledWithMatch(['Asia', 'China', 'Beijing'])).toEqual(true);
  491. expect(
  492. lists[2]
  493. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  494. .querySelectorAll(`.${BASE_CLASS_PREFIX}-icon-tick`).length
  495. ).toEqual(1);
  496. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  497. '亚洲 / 中国 / 北京'
  498. );
  499. // done();
  500. });
  501. it('filterTreeNode = true shows input box', () => {
  502. let cascader = render({
  503. filterTreeNode: true,
  504. searchPlaceholder: 'placeholder',
  505. });
  506. let searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);
  507. expect(searchWrapper.exists()).toEqual(true);
  508. expect(
  509. searchWrapper
  510. .find('span')
  511. .getDOMNode()
  512. .textContent
  513. ).toEqual('placeholder');
  514. });
  515. it('onSearch', () => {
  516. let onSearch = value => {};
  517. let spyOnSearch = sinon.spy(onSearch);
  518. let cascader = render({
  519. filterTreeNode: true,
  520. onSearch: spyOnSearch,
  521. });
  522. let searchValue = '${BASE_CLASS_PREFIX}';
  523. let event = { target: { value: searchValue } };
  524. cascader.simulate('click');
  525. const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`);
  526. input.simulate('change', event);
  527. expect(spyOnSearch.calledOnce).toBe(true);
  528. expect(spyOnSearch.calledWithMatch(searchValue)).toBe(true);
  529. });
  530. it('onSelect + changeOnSelect', async () => {
  531. let spyOnSelect = sinon.spy(() => {});
  532. let spyOnChange = sinon.spy(() => {});
  533. let cascader = render({
  534. defaultOpen: true,
  535. onSelect: spyOnSelect,
  536. onChange: spyOnChange,
  537. changeOnSelect: true,
  538. });
  539. // await sleep();
  540. let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  541. lists[0].querySelectorAll('li')[0].click();
  542. expect(spyOnSelect.calledOnce).toBe(true);
  543. expect(spyOnChange.calledOnce).toBe(true);
  544. expect(spyOnSelect.calledWithMatch('Asia')).toEqual(true);
  545. expect(spyOnChange.calledWithMatch(['Asia'])).toEqual(true);
  546. expect(
  547. lists[0]
  548. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  549. .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`)
  550. ).toEqual(true);
  551. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual('亚洲');
  552. lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  553. lists[1].querySelectorAll('li')[0].click();
  554. expect(spyOnSelect.calledWithMatch('China')).toEqual(true);
  555. expect(spyOnChange.calledWithMatch(['Asia', 'China'])).toEqual(true);
  556. expect(
  557. lists[0]
  558. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  559. .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`)
  560. ).toEqual(true);
  561. expect(
  562. lists[1]
  563. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  564. .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`)
  565. ).toEqual(true);
  566. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  567. '亚洲 / 中国'
  568. );
  569. });
  570. // display none not working properly
  571. it('filterTreeNode shows correct result', () => {
  572. let cascader = render({
  573. filterTreeNode: true,
  574. defaultOpen: true,
  575. });
  576. // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  577. // selectBox.simulate('click');
  578. // await sleep();
  579. const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);
  580. let searchValue = '北';
  581. let event = { target: { value: searchValue } };
  582. searchWrapper.find('input').simulate('change', event);
  583. // await sleep();
  584. let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`);
  585. expect(resList.length).toEqual(3);
  586. // debugger
  587. // expect(resList[0].textContent).toEqual('亚洲/中国/北京');
  588. // done();
  589. });
  590. // display none not working properly
  591. it('filterTreeNode + treeNodeFilterProp', () => {
  592. let cascader = render({
  593. filterTreeNode: true,
  594. treeNodeFilterProp: 'value',
  595. defaultOpen: true,
  596. });
  597. // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  598. // selectBox.simulate('click');
  599. // await sleep();
  600. const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);
  601. let searchValue = 'Bei';
  602. let event = { target: { value: searchValue } };
  603. searchWrapper.find('input').simulate('change', event);
  604. // await sleep();
  605. let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`);
  606. expect(resList.length).toEqual(1);
  607. // debugger
  608. // expect(resList[0].textContent).toEqual('亚洲/中国/北京');
  609. // done();
  610. });
  611. it('filterTreeNode + no result', () => {
  612. let cascader = render({
  613. filterTreeNode: true,
  614. defaultOpen: true,
  615. emptyContent: 'test',
  616. });
  617. // await sleep();
  618. const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);
  619. let searchValue = 'Bei';
  620. let event = { target: { value: searchValue } };
  621. searchWrapper.find('input').simulate('change', event);
  622. // await sleep();
  623. let opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`);
  624. expect(opt.length).toEqual(1);
  625. expect(opt[0].className.includes(`${BASE_CLASS_PREFIX}-cascader-option-empty`)).toEqual(true);
  626. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0].textContent).toEqual('test');
  627. // done();
  628. });
  629. it('filterTreeNode as a func', () => {
  630. let cascader = render({
  631. filterTreeNode: (inputValue, cascaderNode) => cascaderNode === inputValue,
  632. defaultOpen: true,
  633. });
  634. const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);
  635. searchWrapper.find('input').simulate('change', { target: { value: '北' } });
  636. // await sleep();
  637. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`).length).toEqual(0);
  638. // done();
  639. });
  640. it('controlled: value shows correct', () => {
  641. let cascader = render({
  642. value: ['Asia', 'China', 'Beijing'],
  643. });
  644. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  645. '亚洲 / 中国 / 北京'
  646. );
  647. });
  648. it('controlled: fire onChange and ui not update', () => {
  649. let spyOnChange = sinon.spy(() => {});
  650. let cascader = render({
  651. value: ['Asia', 'China', 'Beijing'],
  652. defaultOpen: true,
  653. onChange: spyOnChange,
  654. changeOnSelect: true,
  655. });
  656. // await sleep();
  657. let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  658. lists[0].querySelectorAll('li')[0].click();
  659. expect(spyOnChange.calledOnce).toBe(true);
  660. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  661. '亚洲 / 中国 / 北京'
  662. );
  663. // done();
  664. });
  665. it('async load data', () => {
  666. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => {} } };
  667. const then = jest.fn(() => Promise.resolve());
  668. const loadData = jest.fn(() => ({ then }));
  669. const data = {
  670. label: '亚洲',
  671. value: 'Asia',
  672. };
  673. let cascader = render({
  674. loadData,
  675. defaultOpen: true,
  676. treeData: [data],
  677. });
  678. let topNodeAsia = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-option`).at(0);
  679. topNodeAsia.simulate('click', nativeEvent);
  680. expect(loadData).toHaveBeenCalledWith([data]);
  681. expect(then).toHaveBeenCalled();
  682. });
  683. it('select item + onChange + onChangeWithObject', () => {
  684. let spyOnChange = sinon.spy(() => {});
  685. let cascader = render({
  686. defaultOpen: true,
  687. onChange: spyOnChange,
  688. onChangeWithObject: true,
  689. });
  690. // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  691. // selectBox.simulate('click');
  692. // await sleep();
  693. let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  694. lists[0].querySelectorAll('li')[0].click();
  695. lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  696. lists[1].querySelectorAll('li')[0].click();
  697. lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  698. lists[2].querySelectorAll('li')[0].click();
  699. expect(spyOnChange.calledOnce).toBe(true);
  700. expect(
  701. spyOnChange.calledWithMatch([
  702. {
  703. label: '亚洲',
  704. value: 'Asia',
  705. key: 'Asia',
  706. children: [
  707. {
  708. label: '中国',
  709. value: 'China',
  710. key: 'China',
  711. children: [
  712. {
  713. label: '北京',
  714. value: 'Beijing',
  715. key: 'beijing',
  716. },
  717. {
  718. label: '上海',
  719. value: 'Shanghai',
  720. key: 'shanghai',
  721. },
  722. ],
  723. },
  724. ],
  725. },
  726. {
  727. label: '中国',
  728. value: 'China',
  729. key: 'China',
  730. children: [
  731. {
  732. label: '北京',
  733. value: 'Beijing',
  734. key: 'beijing',
  735. },
  736. {
  737. label: '上海',
  738. value: 'Shanghai',
  739. key: 'shanghai',
  740. },
  741. ],
  742. },
  743. {
  744. label: '北京',
  745. value: 'Beijing',
  746. key: 'beijing',
  747. },
  748. ])
  749. ).toEqual(true);
  750. expect(
  751. lists[2]
  752. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  753. .querySelectorAll(`.${BASE_CLASS_PREFIX}-icon-tick`).length
  754. ).toEqual(1);
  755. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  756. '亚洲 / 中国 / 北京'
  757. );
  758. // done();
  759. });
  760. it('select item + onChange + onChangeWithObject + changeOnSelect', () => {
  761. let spyOnChange = sinon.spy(() => {});
  762. let cascader = render({
  763. defaultOpen: true,
  764. onChange: spyOnChange,
  765. onChangeWithObject: true,
  766. changeOnSelect: true,
  767. });
  768. let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);
  769. lists[0].querySelectorAll('li')[0].click();
  770. expect(spyOnChange.calledOnce).toBe(true);
  771. expect(
  772. spyOnChange.calledWithMatch([
  773. {
  774. label: '亚洲',
  775. value: 'Asia',
  776. key: 'Asia',
  777. children: [
  778. {
  779. label: '中国',
  780. value: 'China',
  781. key: 'China',
  782. children: [
  783. {
  784. label: '北京',
  785. value: 'Beijing',
  786. key: 'beijing',
  787. },
  788. {
  789. label: '上海',
  790. value: 'Shanghai',
  791. key: 'shanghai',
  792. },
  793. ],
  794. },
  795. ],
  796. },
  797. ])
  798. ).toEqual(true);
  799. expect(
  800. lists[0]
  801. .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]
  802. .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`)
  803. ).toEqual(true);
  804. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual('亚洲');
  805. });
  806. it('controlled: value shows correct', () => {
  807. let cascader = render({
  808. value: [
  809. {
  810. label: '亚洲',
  811. value: 'Asia',
  812. key: 'Asia',
  813. children: [
  814. {
  815. label: '中国',
  816. value: 'China',
  817. key: 'China',
  818. children: [
  819. {
  820. label: '北京',
  821. value: 'Beijing',
  822. key: 'beijing',
  823. },
  824. {
  825. label: '上海',
  826. value: 'Shanghai',
  827. key: 'shanghai',
  828. },
  829. ],
  830. },
  831. ],
  832. },
  833. {
  834. label: '中国',
  835. value: 'China',
  836. key: 'China',
  837. children: [
  838. {
  839. label: '北京',
  840. value: 'Beijing',
  841. key: 'beijing',
  842. },
  843. {
  844. label: '上海',
  845. value: 'Shanghai',
  846. key: 'shanghai',
  847. },
  848. ],
  849. },
  850. {
  851. label: '北京',
  852. value: 'Beijing',
  853. key: 'beijing',
  854. },
  855. ],
  856. onChangeWithObject: true,
  857. });
  858. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  859. '亚洲 / 中国 / 北京'
  860. );
  861. });
  862. it('onClear and showClear', () => {
  863. const spyOnClear = sinon.spy(() => { });
  864. const cascader = render({
  865. defaultValue: ['Asia', 'China', 'Beijing'],
  866. showClear: true,
  867. onClear: spyOnClear,
  868. placeholder: "请选择所在地区"
  869. });
  870. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  871. '亚洲 / 中国 / 北京'
  872. );
  873. cascader.simulate('mouseEnter', {}).find(`.${BASE_CLASS_PREFIX}-cascader-clearbtn`).simulate('click');
  874. expect(spyOnClear.calledOnce).toBe(true);
  875. expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(
  876. '请选择所在地区'
  877. );
  878. cascader.unmount();
  879. });
  880. it('filterLeafOnly = false', () => {
  881. let cascader = render({
  882. filterTreeNode: true,
  883. defaultOpen: true,
  884. filterLeafOnly: false
  885. });
  886. // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  887. // selectBox.simulate('click');
  888. // await sleep();
  889. const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);
  890. let searchValue = '亚';
  891. let event = { target: { value: searchValue } };
  892. searchWrapper.find('input').simulate('change', event);
  893. // await sleep();
  894. let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`);
  895. expect(resList.length).toEqual(4);
  896. // debugger
  897. // expect(resList[0].textContent).toEqual('亚洲/中国/北京');
  898. // done();
  899. });
  900. it('showNext',()=>{
  901. // expand next menu by hover
  902. // 通过 hover 展开 Dropdown 的子菜单
  903. const cascaderWithHover = render({
  904. showNext: 'hover',
  905. });
  906. const selectBox = cascaderWithHover.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  907. selectBox.simulate('click');
  908. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1);
  909. cascaderWithHover
  910. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  911. .at(0)
  912. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  913. .at(0)
  914. .simulate('mouseEnter');
  915. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(2);
  916. cascaderWithHover.unmount();
  917. // expand next menu by click
  918. // 通过 click 展开 Dropdown 的子菜单
  919. const cascaderWithClick = render({
  920. showNext: 'click',
  921. });
  922. const selectBox2 = cascaderWithClick.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  923. selectBox2.simulate('click');
  924. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1);
  925. cascaderWithClick
  926. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  927. .at(0)
  928. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  929. .at(0)
  930. .simulate('mouseEnter');
  931. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1);
  932. cascaderWithClick
  933. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  934. .at(0)
  935. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  936. .at(0)
  937. .simulate('click');
  938. expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(2);
  939. cascaderWithClick.unmount();
  940. })
  941. it('disableStrictly', ()=>{
  942. // disable strictly
  943. const cascaderWithDisableStrictly = render({
  944. showNext: 'hover',
  945. treeData:treeDataWithDisabled,
  946. disableStrictly: true,
  947. multiple: true,
  948. });
  949. expect(cascaderWithDisableStrictly.state().checkedKeys.size).toEqual(0);
  950. expect(cascaderWithDisableStrictly.state().disabledKeys.size).toEqual(3);
  951. // open dropdown
  952. const selectBoxWithDisableStrictly = cascaderWithDisableStrictly.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  953. selectBoxWithDisableStrictly.simulate('click');
  954. // click checkbox
  955. cascaderWithDisableStrictly
  956. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  957. .at(0)
  958. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  959. .at(0)
  960. .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)
  961. .at(0)
  962. .find(`.${BASE_CLASS_PREFIX}-checkbox`)
  963. .at(0)
  964. .simulate('click');
  965. // check checkedKeys
  966. expect(cascaderWithDisableStrictly.state().checkedKeys.size).toEqual(1);
  967. cascaderWithDisableStrictly.unmount();
  968. // default disable
  969. const cascaderWithDisable = render({
  970. showNext: 'hover',
  971. treeData:treeDataWithDisabled,
  972. multiple: true,
  973. });
  974. expect(cascaderWithDisable.state().checkedKeys.size).toEqual(0);
  975. expect(cascaderWithDisable.state().disabledKeys.size).toEqual(0);
  976. // open dropdown
  977. const selectBoxWithDisable = cascaderWithDisable.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  978. selectBoxWithDisable.simulate('click');
  979. // click checkbox
  980. cascaderWithDisable
  981. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  982. .at(0)
  983. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  984. .at(0)
  985. .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)
  986. .at(0)
  987. .find(`.${BASE_CLASS_PREFIX}-checkbox`)
  988. .at(0)
  989. .simulate('click');
  990. // check checkedKeys
  991. expect(cascaderWithDisable.state().checkedKeys.size).toEqual(5);
  992. cascaderWithDisable.unmount();
  993. });
  994. it('multiple + onChangeWithObject', () => {
  995. const cascader = render({
  996. multiple: true,
  997. onChangeWithObject: true,
  998. defaultValue: [
  999. {
  1000. label: '北美洲',
  1001. value: 'North America',
  1002. key: 'North America',
  1003. children: [
  1004. {
  1005. label: '美国',
  1006. value: 'United States',
  1007. key: 'United States',
  1008. },
  1009. {
  1010. label: '加拿大',
  1011. value: 'Canada',
  1012. key: 'Canada',
  1013. },
  1014. ],
  1015. },
  1016. {
  1017. label: '美国',
  1018. value: 'United States',
  1019. key: 'United States',
  1020. }
  1021. ]
  1022. });
  1023. const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1024. expect(tags.length).toEqual(1);
  1025. expect(
  1026. tags
  1027. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1028. .getDOMNode()
  1029. .textContent
  1030. ).toEqual('美国');
  1031. });
  1032. it('multiple select enableLeafClick', () => {
  1033. const cascaderWithMultiple = render({
  1034. multiple: true,
  1035. enableLeafClick: true,
  1036. treeData: [
  1037. {
  1038. label: '北美洲',
  1039. value: 'North America',
  1040. key: 'North America',
  1041. children: [
  1042. {
  1043. label: '美国',
  1044. value: 'United States',
  1045. key: 'United States',
  1046. },
  1047. {
  1048. label: '加拿大',
  1049. value: 'Canada',
  1050. key: 'Canada',
  1051. },
  1052. ],
  1053. },
  1054. {
  1055. label: '南美洲',
  1056. value: 'Nanmeiguo',
  1057. key: 'Nanmeiguo',
  1058. }
  1059. ]
  1060. })
  1061. const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  1062. selectBox.simulate('click');
  1063. // click checkbox
  1064. cascaderWithMultiple
  1065. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  1066. .at(0)
  1067. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  1068. .at(1)
  1069. .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)
  1070. .at(0)
  1071. .find(`.${BASE_CLASS_PREFIX}-checkbox`)
  1072. .at(0)
  1073. .simulate('click');
  1074. expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
  1075. // click option cancel checked
  1076. cascaderWithMultiple
  1077. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  1078. .at(0)
  1079. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  1080. .at(1)
  1081. .simulate('click')
  1082. expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(0);
  1083. // click option select
  1084. cascaderWithMultiple
  1085. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  1086. .at(0)
  1087. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  1088. .at(0)
  1089. .simulate('click')
  1090. cascaderWithMultiple
  1091. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  1092. .at(1)
  1093. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  1094. .at(0)
  1095. .simulate('click')
  1096. expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
  1097. const states = cascaderWithMultiple.state()
  1098. cascaderWithMultiple.unmount();
  1099. })
  1100. it('multiple select disable enableLeafClick', () => {
  1101. const cascaderWithMultiple = render({
  1102. multiple: true,
  1103. treeData: [
  1104. {
  1105. label: '北美洲',
  1106. value: 'North America',
  1107. key: 'North America',
  1108. children: [
  1109. {
  1110. label: '美国',
  1111. value: 'United States',
  1112. key: 'United States',
  1113. },
  1114. {
  1115. label: '加拿大',
  1116. value: 'Canada',
  1117. key: 'Canada',
  1118. },
  1119. ],
  1120. },
  1121. {
  1122. label: '南美洲',
  1123. value: 'Nanmeiguo',
  1124. key: 'Nanmeiguo',
  1125. }
  1126. ]
  1127. })
  1128. const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);
  1129. selectBox.simulate('click');
  1130. // click checkbox
  1131. cascaderWithMultiple
  1132. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  1133. .at(0)
  1134. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  1135. .at(1)
  1136. .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)
  1137. .at(0)
  1138. .find(`.${BASE_CLASS_PREFIX}-checkbox`)
  1139. .at(0)
  1140. .simulate('click');
  1141. expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
  1142. // click option can't cancel checked
  1143. cascaderWithMultiple
  1144. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)
  1145. .at(0)
  1146. .find(`.${BASE_CLASS_PREFIX}-cascader-option`)
  1147. .at(1)
  1148. .simulate('click')
  1149. expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);
  1150. cascaderWithMultiple.unmount();
  1151. })
  1152. it('separator', () => {
  1153. const cascader = render({
  1154. filterTreeNode: true,
  1155. defaultValue: ['Asia', 'China', 'Beijing'],
  1156. separator: ' > ',
  1157. defaultOpen: true,
  1158. });
  1159. const span = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`);
  1160. expect(span.getDOMNode().textContent).toEqual('亚洲 > 中国 > 北京');
  1161. cascader.simulate('click');
  1162. const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`);
  1163. const event = { target: { value: '中国' } };
  1164. input.simulate('change', event);
  1165. expect(
  1166. cascader
  1167. .find(`.${BASE_CLASS_PREFIX}-cascader-option-list li`)
  1168. .at(0)
  1169. .getDOMNode()
  1170. .textContent
  1171. ).toEqual('亚洲 > 中国 > 北京');
  1172. cascader.unmount();
  1173. });
  1174. it('triggerRender', () => {
  1175. const spyTriggerRender = sinon.spy(() => <span>123</span>);
  1176. const cascaderAutoMerge = render({
  1177. multiple: true,
  1178. triggerRender: spyTriggerRender,
  1179. defaultValue: 'Asia'
  1180. });
  1181. cascaderAutoMerge.simulate('click');
  1182. const firstCall = spyTriggerRender.getCall(0);
  1183. const args = firstCall.args[0];
  1184. /* check arguments of triggerRender */
  1185. expect(args.value.size).toEqual(1);
  1186. expect(args.value).toEqual(new Set('0'));
  1187. cascaderAutoMerge.unmount();
  1188. const spyTriggerRender2 = sinon.spy(() => <span>123</span>);
  1189. const cascaderNoAutoMerge = render({
  1190. multiple: true,
  1191. triggerRender: spyTriggerRender2,
  1192. defaultValue: 'Asia',
  1193. autoMergeValue: false,
  1194. });
  1195. cascaderNoAutoMerge.simulate('click');
  1196. const firstCall2 = spyTriggerRender2.getCall(0);
  1197. const args2 = firstCall2.args[0];
  1198. /* check arguments of triggerRender */
  1199. expect(args2.value.size).toEqual(4);
  1200. expect(args2.value).toEqual(new Set(['0','0-0','0-0-1','0-0-0']));
  1201. cascaderNoAutoMerge.unmount();
  1202. });
  1203. it('autoMergeValue', () => {
  1204. const cascader = render({
  1205. multiple: true,
  1206. autoMergeValue: false,
  1207. defaultValue: 'Asia',
  1208. });
  1209. const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1210. expect(tags.length).toEqual(4);
  1211. cascader.unmount();
  1212. const cascaderAutoMerge = render({
  1213. multiple: true,
  1214. autoMergeValue: true,
  1215. defaultValue: 'Asia',
  1216. });
  1217. const tags2 = cascaderAutoMerge.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1218. expect(tags2.length).toEqual(1);
  1219. expect(
  1220. tags2
  1221. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1222. .getDOMNode()
  1223. .textContent
  1224. ).toEqual('亚洲');
  1225. cascaderAutoMerge.unmount();
  1226. });
  1227. it('leafOnly', () => {
  1228. /* autoMergeValue and leafOnly are both false */
  1229. const cascader = render({
  1230. multiple: true,
  1231. autoMergeValue: false,
  1232. leafOnly: false,
  1233. defaultValue: 'Asia',
  1234. });
  1235. const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1236. expect(tags.length).toEqual(4);
  1237. cascader.unmount();
  1238. /* autoMergeValue and leafOnly are both true */
  1239. const cascader2 = render({
  1240. multiple: true,
  1241. autoMergeValue: true,
  1242. leafOnly: true,
  1243. defaultValue: 'Asia',
  1244. });
  1245. const tags2 = cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1246. expect(tags2.length).toEqual(2);
  1247. cascader2.unmount();
  1248. /* autoMergeValue is false, leafOnly is true */
  1249. const cascader3 = render({
  1250. multiple: true,
  1251. autoMergeValue: false,
  1252. leafOnly: true,
  1253. defaultValue: 'Asia',
  1254. });
  1255. const tags3 = cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1256. expect(tags3.length).toEqual(2);
  1257. cascader3.unmount();
  1258. /* autoMergeValue is true, leafOnly is false */
  1259. const cascader4 = render({
  1260. multiple: true,
  1261. autoMergeValue: true,
  1262. leafOnly: false,
  1263. defaultValue: 'Asia',
  1264. });
  1265. const tags4 = cascader4.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1266. expect(tags4.length).toEqual(1);
  1267. expect(
  1268. tags4
  1269. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1270. .getDOMNode()
  1271. .textContent
  1272. ).toEqual('亚洲');
  1273. cascader4.unmount();
  1274. });
  1275. it('ref method', () => {
  1276. let r;
  1277. let props = {
  1278. ref: (ref) => { r = ref },
  1279. filter: true,
  1280. multiple: true,
  1281. };
  1282. let select = render(props);
  1283. r.open();
  1284. expect(select.state().isOpen).toEqual(true);
  1285. r.close();
  1286. expect(select.state().isOpen).toEqual(false);
  1287. });
  1288. });