import { Cascader, Icon } from '../../index'; import { clear } from 'jest-date-mock'; import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants'; const animationMs = 200; const sleep = (ms = animationMs) => new Promise((resolve, reject) => setTimeout(() => { resolve(ms); }, ms) ); const getPopupContainer = () => document.querySelector(`.${BASE_CLASS_PREFIX}-cascader`); const treeData = [ { label: '亚洲', value: 'Yazhou', key: 'yazhou', children: [ { label: '中国', value: 'Zhongguo', key: 'zhongguo', children: [ { label: '北京', value: 'Beijing', key: 'beijing', }, { label: '上海', value: 'Shanghai', key: 'shanghai', }, ], }, ], }, { label: '北美洲', value: 'Beimeizhou', key: 'beimeizhou', children: [ { label: '美国', value: 'Meiguo', key: 'meiguo', }, { label: '加拿大', value: 'Jianada', key: 'jianada', }, ], }, ]; const treeDataWithDisabled = [ { label: '亚洲', value: 'Yazhou', key: 'yazhou', children: [ { label: '中国', value: 'Zhongguo', key: 'zhongguo', disabled: true, children: [ { label: '北京', value: 'Beijing', key: 'beijing', }, { label: '上海', value: 'Shanghai', key: 'shanghai', }, ], }, { label: '韩国', value: 'Hanguo', key: 'hanguo', } ], } ]; let commonProps = { // Cascader use Popup Layer to show candidate option, // but all Popup Layer which extends from Tooltip (eg Popover, Dropdown) have animation and delay. // Turn off animation and delay during testing, to avoid wating (something like setTimeOut/balabala...) in the test code motion: false, mouseEnterDelay: 0, mouseLeaveDelay: 0, }; function render(props) { props = { treeData: treeData, ...commonProps, ...props }; return mount(, { attachTo: document.getElementById('container'), }); } describe('Cascader', () => { beforeEach(() => { // Avoid `attachTo: document.body` Warning // clear(); const div = document.createElement('div'); div.setAttribute('id', 'container'); document.body.appendChild(div); }); afterEach(() => { const div = document.getElementById('container'); if (div) { document.body.removeChild(div); } document.body.innerHTML = ''; }); it('className / style', () => { let props = { className: 'test', style: { height: 420 }, }; let cascader = render(props); expect(cascader.hasClass('test')).toEqual(true); expect(cascader.find('div.test')).toHaveStyle('height', 420); }); it('with placeholder', () => { const props = { placeholder: 'semi' }; const cascader = render(props); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection-placeholder`).instance().textContent).toEqual( 'semi' ); }); it('with validateStatus', () => { const props = {}; const cascader = render(props); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-error`)).toEqual(false); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-warning`)).toEqual(false); cascader.setProps({ validateStatus: `error` }); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-error`)).toEqual(true); cascader.setProps({ validateStatus: `warning` }); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-warning`)).toEqual(true); }); it('different size', () => { const props = {}; const cascader = render(props); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-large`)).toEqual(false); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-small`)).toEqual(false); cascader.setProps({ size: 'large' }); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-large`)).toEqual(true); cascader.setProps({ size: 'small' }); expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-small`)).toEqual(true); }); it('custom prefix / suffix / insetLabel', () => { let prefix =
prefix content
; let suffix =
suffix content
; let insetLabel = 'semi'; const props = { prefix: prefix, suffix: suffix, }; let cascader = render(props); expect(cascader.contains(prefix)).toEqual(true); expect(cascader.contains(suffix)).toEqual(true); cascader.unmount(); let cascader2 = render({ insetLabel: insetLabel }); expect(cascader2.contains(insetLabel)).toEqual(true); cascader2.unmount(); }); it('empty data / empty content', () => { let cascader = render({ treeData: [], defaultOpen: true, }); // await sleep(); let opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`); expect(opt.length).toEqual(1); expect(opt[0].className.includes(`${BASE_CLASS_PREFIX}-cascader-option-empty`)).toEqual(true); cascader.setProps({ emptyContent: 'test' }); cascader.update(); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0].textContent).toEqual('test'); // done(); }); it('dynamic treeData in multiple and uncontrolled mode', () => { const cascader = render({ defaultValue: 'Yazhou', multiple: true, }); const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`); expect(opt.length).toEqual(1); cascader.setProps({ treeData: treeDataWithDisabled }); cascader.update(); expect(opt.length).toEqual(1); }); it('dynamic treeData in multiple and controlled mode', () => { const cascader = render({ value: 'Yazhou', multiple: true, }); const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`); expect(opt.length).toEqual(1); cascader.setProps({ treeData: treeDataWithDisabled }); cascader.update(); expect(opt.length).toEqual(1); }); it('getPopupContainer', () => { let cascader = render({ getPopupContainer: getPopupContainer, defaultOpen: true, }); // await sleep(); let dom = document.querySelector(`.${BASE_CLASS_PREFIX}-cascader`); expect(dom.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(1); // done(); }); it('defaultOpen', () => { let cascader = render({ defaultOpen: true, }); // await sleep(); expect(cascader.state().isOpen).toEqual(true); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(1); // done(); }); it('custom dropdownClassNam/dropdownStyle/zIndex', () => { let props = { dropdownClassName: 'test', dropdownStyle: { color: 'red', }, defaultOpen: true, zIndex: 2000, }; let cascader = render(props); // await sleep(); const dropdown = document.querySelector(`.${BASE_CLASS_PREFIX}-cascader-popover`); expect(document.querySelector(`.${BASE_CLASS_PREFIX}-portal`).style.zIndex).toEqual('2000'); expect(dropdown.className.includes('test')).toEqual(true); expect(dropdown.style.color).toEqual('red'); // done(); }); it('defaultValue', () => { let cascader = render({ defaultValue: ['Yazhou', 'Zhongguo', 'Beijing'], defaultOpen: true, }); // await sleep(); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国 / 北京' ); let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); expect(lists.length).toEqual(3); let activeItems = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-active`); expect(activeItems.length).toEqual(2); expect(activeItems[0].textContent).toEqual('亚洲'); expect(activeItems[1].textContent).toEqual('中国'); let selectItem = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-select`); expect(selectItem.length).toEqual(1); expect(selectItem[0].textContent).toEqual('北京'); expect(selectItem[0].querySelectorAll(`.${BASE_CLASS_PREFIX}-icon`).length).toEqual(1); // done(); }); it('displayProp', () => { let cascader = render({ defaultValue: ['Yazhou', 'Zhongguo', 'Beijing'], displayProp: 'value', }); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( 'Yazhou / Zhongguo / Beijing' ); }); it('displayRender', () => { let spyOnRender = sinon.spy(() => {}); let cascader = render({ defaultValue: ['Yazhou', 'Zhongguo', 'Beijing'], displayRender: spyOnRender, }); expect(spyOnRender.calledWithMatch(['亚洲', '中国', '北京'])).toEqual(true); cascader.unmount(); let cusRender = render({ defaultValue: ['Yazhou', 'Zhongguo', 'Beijing'], displayRender: list => '已选择:' + list.join(' -> '), }); expect(cusRender.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '已选择:亚洲 -> 中国 -> 北京' ); }); it('disabled', () => { let cascader = render({ disabled: true, }); expect( document .querySelector(`.${BASE_CLASS_PREFIX}-cascader`) .className.includes(`${BASE_CLASS_PREFIX}-cascader-disabled`) ).toEqual(true); // cannot select let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); selectBox.simulate('click'); // await sleep(); expect(cascader.state().isOpen).toEqual(false); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(0); // done(); }); it('disabled + defaultValue', () => { const cascaderWithSingle = render({ treeData: treeDataWithDisabled, changeOnSelect: true, defaultValue:['Yazhou', 'Zhongguo'] }); expect( cascaderWithSingle .find(`.${BASE_CLASS_PREFIX}-cascader-selection span`) .at(0) .getDOMNode() .textContent ).toEqual('亚洲 / 中国'); cascaderWithSingle.unmount(); const cascaderWithSingleFilter = render({ treeData: treeDataWithDisabled, changeOnSelect: true, filterTreeNode: true, defaultValue:['Yazhou', 'Zhongguo'] }); expect( cascaderWithSingleFilter .find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper .${BASE_CLASS_PREFIX}-input`) .getDOMNode() .getAttribute('value') ).toEqual('亚洲 / 中国'); cascaderWithSingleFilter.unmount(); const cascaderWithSingleControlled = render({ treeData: treeDataWithDisabled, changeOnSelect: true, value: ['Yazhou', 'Zhongguo'], }); expect(cascaderWithSingleControlled.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual( '亚洲 / 中国' ); cascaderWithSingleControlled.unmount(); const cascaderWithMultiple = render({ treeData: treeDataWithDisabled, multiple: true, defaultValue:['Yazhou', 'Zhongguo'] }); expect( cascaderWithMultiple .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`) .at(0) .getDOMNode() .textContent ).toEqual('中国'); cascaderWithMultiple.unmount(); const cascaderWithMultipleFilter = render({ treeData: treeDataWithDisabled, multiple: true, filterTreeNode: true, defaultValue:['Yazhou', 'Zhongguo'] }); expect( cascaderWithMultipleFilter .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`) .at(0) .getDOMNode() .textContent ).toEqual('中国'); cascaderWithMultipleFilter.unmount(); const cascaderWithMultipleControlled = render({ treeData: treeDataWithDisabled, multiple: true, value:['Yazhou', 'Zhongguo'] }); expect( cascaderWithMultipleControlled .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`) .at(0) .getDOMNode() .textContent ).toEqual('中国'); cascaderWithMultipleControlled.unmount(); }); it('select item / onSelect / onChange', () => { let spyOnSelect = sinon.spy(() => {}); let spyOnChange = sinon.spy(() => {}); let cascader = render({ defaultOpen: true, onSelect: spyOnSelect, onChange: spyOnChange, }); // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); // selectBox.simulate('click'); // await sleep(); let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); expect(lists.length).toEqual(1); lists[0].querySelectorAll('li')[0].click(); lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); expect(lists.length).toEqual(2); expect(spyOnSelect.notCalled).toBe(true); expect(spyOnChange.notCalled).toBe(true); expect( lists[0] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`) ).toEqual(true); lists[1].querySelectorAll('li')[0].click(); lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); expect(lists.length).toEqual(3); expect(spyOnSelect.notCalled).toBe(true); expect(spyOnChange.notCalled).toBe(true); expect( lists[1] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`) ).toEqual(true); lists[2].querySelectorAll('li')[0].click(); expect(spyOnSelect.calledOnce).toBe(true); expect(spyOnChange.calledOnce).toBe(true); expect(spyOnSelect.calledWithMatch('Beijing')).toEqual(true); expect(spyOnChange.calledWithMatch(['Yazhou', 'Zhongguo', 'Beijing'])).toEqual(true); expect( lists[2] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .querySelectorAll(`.${BASE_CLASS_PREFIX}-icon-tick`).length ).toEqual(1); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国 / 北京' ); // done(); }); it('filterTreeNode = true shows input box', () => { let cascader = render({ filterTreeNode: true, searchPlaceholder: 'placeholder', }); let searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`); expect(searchWrapper.exists()).toEqual(true); expect( searchWrapper .find('input') .instance() .getAttribute('placeholder') ).toEqual('placeholder'); }); it('onSearch', () => { let onSearch = value => {}; let spyOnSearch = sinon.spy(onSearch); let cascader = render({ filterTreeNode: true, onSearch: spyOnSearch, }); const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`); let searchValue = '${BASE_CLASS_PREFIX}'; let event = { target: { value: searchValue } }; searchWrapper.find('input').simulate('change', event); expect(spyOnSearch.calledOnce).toBe(true); expect(spyOnSearch.calledWithMatch(searchValue)).toBe(true); }); it('onSelect + changeOnSelect', async () => { let spyOnSelect = sinon.spy(() => {}); let spyOnChange = sinon.spy(() => {}); let cascader = render({ defaultOpen: true, onSelect: spyOnSelect, onChange: spyOnChange, changeOnSelect: true, }); // await sleep(); let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); lists[0].querySelectorAll('li')[0].click(); expect(spyOnSelect.calledOnce).toBe(true); expect(spyOnChange.calledOnce).toBe(true); expect(spyOnSelect.calledWithMatch('Yazhou')).toEqual(true); expect(spyOnChange.calledWithMatch(['Yazhou'])).toEqual(true); expect( lists[0] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`) ).toEqual(true); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual('亚洲'); lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); lists[1].querySelectorAll('li')[0].click(); expect(spyOnSelect.calledWithMatch('Zhongguo')).toEqual(true); expect(spyOnChange.calledWithMatch(['Yazhou', 'Zhongguo'])).toEqual(true); expect( lists[0] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`) ).toEqual(true); expect( lists[1] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`) ).toEqual(true); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国' ); }); // display none not working properly it('filterTreeNode shows correct result', () => { let cascader = render({ filterTreeNode: true, defaultOpen: true, }); // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); // selectBox.simulate('click'); // await sleep(); const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`); let searchValue = '北'; let event = { target: { value: searchValue } }; searchWrapper.find('input').simulate('change', event); // await sleep(); let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`); expect(resList.length).toEqual(3); // debugger // expect(resList[0].textContent).toEqual('亚洲/中国/北京'); // done(); }); // display none not working properly it('filterTreeNode + treeNodeFilterProp', () => { let cascader = render({ filterTreeNode: true, treeNodeFilterProp: 'value', defaultOpen: true, }); // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); // selectBox.simulate('click'); // await sleep(); const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`); let searchValue = 'Bei'; let event = { target: { value: searchValue } }; searchWrapper.find('input').simulate('change', event); // await sleep(); let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`); expect(resList.length).toEqual(3); // debugger // expect(resList[0].textContent).toEqual('亚洲/中国/北京'); // done(); }); it('filterTreeNode + no result', () => { let cascader = render({ filterTreeNode: true, defaultOpen: true, emptyContent: 'test', }); // await sleep(); const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`); let searchValue = 'Bei'; let event = { target: { value: searchValue } }; searchWrapper.find('input').simulate('change', event); // await sleep(); let opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`); expect(opt.length).toEqual(1); expect(opt[0].className.includes(`${BASE_CLASS_PREFIX}-cascader-option-empty`)).toEqual(true); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0].textContent).toEqual('test'); // done(); }); it('filterTreeNode as a func', () => { let cascader = render({ filterTreeNode: (inputValue, cascaderNode) => cascaderNode === inputValue, defaultOpen: true, }); const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`); searchWrapper.find('input').simulate('change', { target: { value: '北' } }); // await sleep(); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`).length).toEqual(0); // done(); }); it('controlled: value shows correct', () => { let cascader = render({ value: ['Yazhou', 'Zhongguo', 'Beijing'], }); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国 / 北京' ); }); it('controlled: fire onChange and ui not update', () => { let spyOnChange = sinon.spy(() => {}); let cascader = render({ value: ['Yazhou', 'Zhongguo', 'Beijing'], defaultOpen: true, onChange: spyOnChange, changeOnSelect: true, }); // await sleep(); let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); lists[0].querySelectorAll('li')[0].click(); expect(spyOnChange.calledOnce).toBe(true); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国 / 北京' ); // done(); }); it('async load data', () => { const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => {} } }; const then = jest.fn(() => Promise.resolve()); const loadData = jest.fn(() => ({ then })); const data = { label: '亚洲', value: 'Asia', }; let cascader = render({ loadData, defaultOpen: true, treeData: [data], }); let topNodeAsia = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-option`).at(0); topNodeAsia.simulate('click', nativeEvent); expect(loadData).toHaveBeenCalledWith([data]); expect(then).toHaveBeenCalled(); }); it('select item + onChange + onChangeWithObject', () => { let spyOnChange = sinon.spy(() => {}); let cascader = render({ defaultOpen: true, onChange: spyOnChange, onChangeWithObject: true, }); // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); // selectBox.simulate('click'); // await sleep(); let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); lists[0].querySelectorAll('li')[0].click(); lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); lists[1].querySelectorAll('li')[0].click(); lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); lists[2].querySelectorAll('li')[0].click(); expect(spyOnChange.calledOnce).toBe(true); expect( spyOnChange.calledWithMatch([ { label: '亚洲', value: 'Yazhou', key: 'yazhou', children: [ { label: '中国', value: 'Zhongguo', key: 'zhongguo', children: [ { label: '北京', value: 'Beijing', key: 'beijing', }, { label: '上海', value: 'Shanghai', key: 'shanghai', }, ], }, ], }, { label: '中国', value: 'Zhongguo', key: 'zhongguo', children: [ { label: '北京', value: 'Beijing', key: 'beijing', }, { label: '上海', value: 'Shanghai', key: 'shanghai', }, ], }, { label: '北京', value: 'Beijing', key: 'beijing', }, ]) ).toEqual(true); expect( lists[2] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .querySelectorAll(`.${BASE_CLASS_PREFIX}-icon-tick`).length ).toEqual(1); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国 / 北京' ); // done(); }); it('select item + onChange + onChangeWithObject + changeOnSelect', () => { let spyOnChange = sinon.spy(() => {}); let cascader = render({ defaultOpen: true, onChange: spyOnChange, onChangeWithObject: true, changeOnSelect: true, }); let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`); lists[0].querySelectorAll('li')[0].click(); expect(spyOnChange.calledOnce).toBe(true); expect( spyOnChange.calledWithMatch([ { label: '亚洲', value: 'Yazhou', key: 'yazhou', children: [ { label: '中国', value: 'Zhongguo', key: 'zhongguo', children: [ { label: '北京', value: 'Beijing', key: 'beijing', }, { label: '上海', value: 'Shanghai', key: 'shanghai', }, ], }, ], }, ]) ).toEqual(true); expect( lists[0] .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0] .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`) ).toEqual(true); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual('亚洲'); }); it('controlled: value shows correct', () => { let cascader = render({ value: [ { label: '亚洲', value: 'Yazhou', key: 'yazhou', children: [ { label: '中国', value: 'Zhongguo', key: 'zhongguo', children: [ { label: '北京', value: 'Beijing', key: 'beijing', }, { label: '上海', value: 'Shanghai', key: 'shanghai', }, ], }, ], }, { label: '中国', value: 'Zhongguo', key: 'zhongguo', children: [ { label: '北京', value: 'Beijing', key: 'beijing', }, { label: '上海', value: 'Shanghai', key: 'shanghai', }, ], }, { label: '北京', value: 'Beijing', key: 'beijing', }, ], onChangeWithObject: true, }); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国 / 北京' ); }); it('onClear and showClear', () => { const spyOnClear = sinon.spy(() => { }); const cascader = render({ defaultValue: ['Yazhou', 'Zhongguo', 'Beijing'], showClear: true, onClear: spyOnClear, placeholder: "请选择所在地区" }); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '亚洲 / 中国 / 北京' ); cascader.simulate('mouseEnter', {}).find(`.${BASE_CLASS_PREFIX}-cascader-clearbtn`).simulate('click'); expect(spyOnClear.calledOnce).toBe(true); expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual( '请选择所在地区' ); cascader.unmount(); }); it('filterLeafOnly = false', () => { let cascader = render({ filterTreeNode: true, defaultOpen: true, filterLeafOnly: false }); // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); // selectBox.simulate('click'); // await sleep(); const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`); let searchValue = '亚'; let event = { target: { value: searchValue } }; searchWrapper.find('input').simulate('change', event); // await sleep(); let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`); expect(resList.length).toEqual(4); // debugger // expect(resList[0].textContent).toEqual('亚洲/中国/北京'); // done(); }); it('showNext',()=>{ // expand next menu by hover // 通过 hover 展开 Dropdown 的子菜单 const cascaderWithHover = render({ showNext: 'hover', }); const selectBox = cascaderWithHover.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); selectBox.simulate('click'); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1); cascaderWithHover .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(0) .simulate('mouseEnter'); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(2); cascaderWithHover.unmount(); // expand next menu by click // 通过 click 展开 Dropdown 的子菜单 const cascaderWithClick = render({ showNext: 'click', }); const selectBox2 = cascaderWithClick.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); selectBox2.simulate('click'); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1); cascaderWithClick .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(0) .simulate('mouseEnter'); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1); cascaderWithClick .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(0) .simulate('click'); expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(2); cascaderWithClick.unmount(); }) it('disableStrictly', ()=>{ // disable strictly const cascaderWithDisableStrictly = render({ showNext: 'hover', treeData:treeDataWithDisabled, disableStrictly: true, multiple: true, }); expect(cascaderWithDisableStrictly.state().checkedKeys.size).toEqual(0); expect(cascaderWithDisableStrictly.state().disabledKeys.size).toEqual(3); // open dropdown const selectBoxWithDisableStrictly = cascaderWithDisableStrictly.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); selectBoxWithDisableStrictly.simulate('click'); // click checkbox cascaderWithDisableStrictly .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`) .at(0) .find(`.${BASE_CLASS_PREFIX}-checkbox`) .at(0) .simulate('click'); // check checkedKeys expect(cascaderWithDisableStrictly.state().checkedKeys.size).toEqual(1); cascaderWithDisableStrictly.unmount(); // default disable const cascaderWithDisable = render({ showNext: 'hover', treeData:treeDataWithDisabled, multiple: true, }); expect(cascaderWithDisable.state().checkedKeys.size).toEqual(0); expect(cascaderWithDisable.state().disabledKeys.size).toEqual(0); // open dropdown const selectBoxWithDisable = cascaderWithDisable.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); selectBoxWithDisable.simulate('click'); // click checkbox cascaderWithDisable .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`) .at(0) .find(`.${BASE_CLASS_PREFIX}-checkbox`) .at(0) .simulate('click'); // check checkedKeys expect(cascaderWithDisable.state().checkedKeys.size).toEqual(5); cascaderWithDisable.unmount(); }); it('multiple + onChangeWithObject', () => { const cascader = render({ multiple: true, onChangeWithObject: true, defaultValue: [ { label: '北美洲', value: 'Beimeizhou', key: 'beimeizhou', children: [ { label: '美国', value: 'Meiguo', key: 'meiguo', }, { label: '加拿大', value: 'Jianada', key: 'jianada', }, ], }, { label: '美国', value: 'Meiguo', key: 'meiguo', } ] }); const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`) expect(tags.length).toEqual(1); expect( tags .find(`.${BASE_CLASS_PREFIX}-tag-content`) .getDOMNode() .textContent ).toEqual('美国'); }); it('multiple select enableLeafClick', () => { const cascaderWithMultiple = render({ multiple: true, enableLeafClick: true, treeData: [ { label: '北美洲', value: 'Beimeizhou', key: 'beimeizhou', children: [ { label: '美国', value: 'Meiguo', key: 'meiguo', }, { label: '加拿大', value: 'Jianada', key: 'jianada', }, ], }, { label: '南美洲', value: 'Nanmeiguo', key: 'Nanmeiguo', } ] }) const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); selectBox.simulate('click'); // click checkbox cascaderWithMultiple .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(1) .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`) .at(0) .find(`.${BASE_CLASS_PREFIX}-checkbox`) .at(0) .simulate('click'); expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1); // click option cancel checked cascaderWithMultiple .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(1) .simulate('click') expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(0); // click option select cascaderWithMultiple .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(0) .simulate('click') cascaderWithMultiple .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(1) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(0) .simulate('click') expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1); const states = cascaderWithMultiple.state() cascaderWithMultiple.unmount(); }) it('multiple select disable enableLeafClick', () => { const cascaderWithMultiple = render({ multiple: true, treeData: [ { label: '北美洲', value: 'Beimeizhou', key: 'beimeizhou', children: [ { label: '美国', value: 'Meiguo', key: 'meiguo', }, { label: '加拿大', value: 'Jianada', key: 'jianada', }, ], }, { label: '南美洲', value: 'Nanmeiguo', key: 'Nanmeiguo', } ] }) const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0); selectBox.simulate('click'); // click checkbox cascaderWithMultiple .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(1) .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`) .at(0) .find(`.${BASE_CLASS_PREFIX}-checkbox`) .at(0) .simulate('click'); expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1); // click option can't cancel checked cascaderWithMultiple .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`) .at(0) .find(`.${BASE_CLASS_PREFIX}-cascader-option`) .at(1) .simulate('click') expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1); cascaderWithMultiple.unmount(); }) it('separator', () => { const cascader = render({ filterTreeNode: true, defaultValue: ['Yazhou', 'Zhongguo', 'Beijing'], separator: ' > ', defaultOpen: true, }); const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`); expect(input.props().placeholder).toEqual('亚洲 > 中国 > 北京'); const event = { target: { value: '中国' } }; input.simulate('change', event); expect( cascader .find(`.${BASE_CLASS_PREFIX}-cascader-option-list li`) .at(0) .getDOMNode() .textContent ).toEqual('亚洲 > 中国 > 北京'); cascader.unmount(); }); it('triggerRender', () => { const spyTriggerRender = sinon.spy(() => 123); const cascaderAutoMerge = render({ multiple: true, triggerRender: spyTriggerRender, defaultValue: 'Yazhou' }); cascaderAutoMerge.simulate('click'); const firstCall = spyTriggerRender.getCall(0); const args = firstCall.args[0]; /* check arguments of triggerRender */ expect(args.value.size).toEqual(1); expect(args.value).toEqual(new Set('0')); cascaderAutoMerge.unmount(); const spyTriggerRender2 = sinon.spy(() => 123); const cascaderNoAutoMerge = render({ multiple: true, triggerRender: spyTriggerRender2, defaultValue: 'Yazhou', autoMergeValue: false, }); cascaderNoAutoMerge.simulate('click'); const firstCall2 = spyTriggerRender2.getCall(0); const args2 = firstCall2.args[0]; /* check arguments of triggerRender */ expect(args2.value.size).toEqual(4); expect(args2.value).toEqual(new Set(['0','0-0','0-0-1','0-0-0'])); cascaderNoAutoMerge.unmount(); }); it('autoMergeValue', () => { const cascader = render({ multiple: true, autoMergeValue: false, defaultValue: 'Yazhou', }); const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`) expect(tags.length).toEqual(4); cascader.unmount(); const cascaderAutoMerge = render({ multiple: true, autoMergeValue: true, defaultValue: 'Yazhou', }); const tags2 = cascaderAutoMerge.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`) expect(tags2.length).toEqual(1); expect( tags2 .find(`.${BASE_CLASS_PREFIX}-tag-content`) .getDOMNode() .textContent ).toEqual('亚洲'); cascaderAutoMerge.unmount(); }); it('leafOnly', () => { /* autoMergeValue and leafOnly are both false */ const cascader = render({ multiple: true, autoMergeValue: false, leafOnly: false, defaultValue: 'Yazhou', }); const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`) expect(tags.length).toEqual(4); cascader.unmount(); /* autoMergeValue and leafOnly are both true */ const cascader2 = render({ multiple: true, autoMergeValue: true, leafOnly: true, defaultValue: 'Yazhou', }); const tags2 = cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`) expect(tags2.length).toEqual(2); cascader2.unmount(); /* autoMergeValue is false, leafOnly is true */ const cascader3 = render({ multiple: true, autoMergeValue: false, leafOnly: true, defaultValue: 'Yazhou', }); const tags3 = cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`) expect(tags3.length).toEqual(2); cascader3.unmount(); /* autoMergeValue is true, leafOnly is false */ const cascader4 = render({ multiple: true, autoMergeValue: true, leafOnly: false, defaultValue: 'Yazhou', }); const tags4 = cascader4.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`) expect(tags4.length).toEqual(1); expect( tags4 .find(`.${BASE_CLASS_PREFIX}-tag-content`) .getDOMNode() .textContent ).toEqual('亚洲'); cascader4.unmount(); }); });