cascader.test.js 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416
  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('search ref method', () => {
  1175. let r;
  1176. const cascader = render({
  1177. ref: (ref) => { r = ref },
  1178. filterTreeNode: true,
  1179. searchPosition: 'custom',
  1180. defaultOpen: true,
  1181. });
  1182. r.search('北京');
  1183. expect(cascader.state().inputValue).toEqual('北京');
  1184. expect(
  1185. document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`)[0]
  1186. .textContent
  1187. ).toEqual('北京');
  1188. cascader.unmount();
  1189. });
  1190. it('triggerRender', () => {
  1191. const spyTriggerRender = sinon.spy(() => <span>123</span>);
  1192. const cascaderAutoMerge = render({
  1193. multiple: true,
  1194. triggerRender: spyTriggerRender,
  1195. defaultValue: 'Asia'
  1196. });
  1197. cascaderAutoMerge.simulate('click');
  1198. const firstCall = spyTriggerRender.getCall(0);
  1199. const args = firstCall.args[0];
  1200. /* check arguments of triggerRender */
  1201. expect(args.value.size).toEqual(1);
  1202. expect(args.value).toEqual(new Set('0'));
  1203. cascaderAutoMerge.unmount();
  1204. const spyTriggerRender2 = sinon.spy(() => <span>123</span>);
  1205. const cascaderNoAutoMerge = render({
  1206. multiple: true,
  1207. triggerRender: spyTriggerRender2,
  1208. defaultValue: 'Asia',
  1209. autoMergeValue: false,
  1210. });
  1211. cascaderNoAutoMerge.simulate('click');
  1212. const firstCall2 = spyTriggerRender2.getCall(0);
  1213. const args2 = firstCall2.args[0];
  1214. /* check arguments of triggerRender */
  1215. expect(args2.value.size).toEqual(4);
  1216. expect(args2.value).toEqual(new Set(['0','0-0','0-0-1','0-0-0']));
  1217. cascaderNoAutoMerge.unmount();
  1218. });
  1219. it('autoMergeValue', () => {
  1220. const cascader = render({
  1221. multiple: true,
  1222. autoMergeValue: false,
  1223. defaultValue: 'Asia',
  1224. });
  1225. const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1226. expect(tags.length).toEqual(4);
  1227. cascader.unmount();
  1228. const cascaderAutoMerge = render({
  1229. multiple: true,
  1230. autoMergeValue: true,
  1231. defaultValue: 'Asia',
  1232. });
  1233. const tags2 = cascaderAutoMerge.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1234. expect(tags2.length).toEqual(1);
  1235. expect(
  1236. tags2
  1237. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1238. .getDOMNode()
  1239. .textContent
  1240. ).toEqual('亚洲');
  1241. cascaderAutoMerge.unmount();
  1242. });
  1243. it('leafOnly', () => {
  1244. /* autoMergeValue and leafOnly are both false */
  1245. const cascader = render({
  1246. multiple: true,
  1247. autoMergeValue: false,
  1248. leafOnly: false,
  1249. defaultValue: 'Asia',
  1250. });
  1251. const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1252. expect(tags.length).toEqual(4);
  1253. cascader.unmount();
  1254. /* autoMergeValue and leafOnly are both true */
  1255. const cascader2 = render({
  1256. multiple: true,
  1257. autoMergeValue: true,
  1258. leafOnly: true,
  1259. defaultValue: 'Asia',
  1260. });
  1261. const tags2 = cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1262. expect(tags2.length).toEqual(2);
  1263. cascader2.unmount();
  1264. /* autoMergeValue is false, leafOnly is true */
  1265. const cascader3 = render({
  1266. multiple: true,
  1267. autoMergeValue: false,
  1268. leafOnly: true,
  1269. defaultValue: 'Asia',
  1270. });
  1271. const tags3 = cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1272. expect(tags3.length).toEqual(2);
  1273. cascader3.unmount();
  1274. /* autoMergeValue is true, leafOnly is false */
  1275. const cascader4 = render({
  1276. multiple: true,
  1277. autoMergeValue: true,
  1278. leafOnly: false,
  1279. defaultValue: 'Asia',
  1280. });
  1281. const tags4 = cascader4.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)
  1282. expect(tags4.length).toEqual(1);
  1283. expect(
  1284. tags4
  1285. .find(`.${BASE_CLASS_PREFIX}-tag-content`)
  1286. .getDOMNode()
  1287. .textContent
  1288. ).toEqual('亚洲');
  1289. cascader4.unmount();
  1290. });
  1291. it('ref method', () => {
  1292. let r;
  1293. let props = {
  1294. ref: (ref) => { r = ref },
  1295. filter: true,
  1296. multiple: true,
  1297. };
  1298. let select = render(props);
  1299. r.open();
  1300. expect(select.state().isOpen).toEqual(true);
  1301. r.close();
  1302. expect(select.state().isOpen).toEqual(false);
  1303. });
  1304. it('autoMerge false & value []', () => {
  1305. const cascader = render({
  1306. multiple: true,
  1307. autoMergeValue: false,
  1308. value: [],
  1309. placeholder: "autoMergeValue 为 false"
  1310. });
  1311. const placeholder = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection-placeholder`)
  1312. expect(placeholder.getDOMNode().textContent).toEqual('autoMergeValue 为 false');
  1313. cascader.unmount();
  1314. })
  1315. it('value not in TreeData', () => {
  1316. const cascader = render({
  1317. multiple: true,
  1318. value: [ "value", "notIn", "treeData"],
  1319. placeholder: "value not in treeData, show placeholder",
  1320. autoMergeValue: false,
  1321. filterTreeNode: true,
  1322. });
  1323. const placeholder = cascader.find(`.${BASE_CLASS_PREFIX}-input`)
  1324. expect(placeholder.getDOMNode().placeholder).toEqual('value not in treeData, show placeholder');
  1325. cascader.unmount();
  1326. })
  1327. });