import { Breadcrumb } from '../../index'; import { IconHome, IconArticle } from '@douyinfe/semi-icons'; function getBr(props = {}) { let children if (props.children) { children = props.children.map(childProp => ) } else { children = [ semi, design, byde ] } return mount({children}, { attachTo: document.getElementById('container') }); } describe('Breadcrumb', () => { beforeEach(() => { 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('custom className & style', () => { let props = { className: 'test', style: { color: 'red', }, }; const wrapper = getBr(props); expect(wrapper.hasClass('test')).toEqual(true); expect(wrapper.find('nav.test')).toHaveStyle('color', 'red'); }); it('compact = false', () => { let props = { compact: false, }; let br = getBr(props); expect(br.exists('.semi-breadcrumb-wrapper-loose')).toEqual(true); expect(br.exists('.semi-breadcrumb-wrapper-compact')).toEqual(false); br.unmount(); let br2 = getBr(); expect(br2.exists('.semi-breadcrumb-wrapper-compact')).toEqual(true); expect(br2.exists('.semi-breadcrumb-wrapper-loose')).toEqual(false); }); it('separator', () => { let props = { separator: '>' }; let br = getBr(props); expect(br.find('.semi-breadcrumb-separator').children().at(0).text()).toEqual('>') expect(br.find('.semi-breadcrumb-separator').children().at(1).text()).toEqual('>') }); it('maxItemCount', () => { let props = { maxItemCount: 3, children: [ { children: 'semi' }, { children: 'design' }, { children: 'powered' }, { children: 'by' }, { children: 'douyin' }, ] }; let br = getBr(props); expect(br.find('.semi-breadcrumb-wrapper').children().length).toEqual(4); // semi/.../by/douyin expect(br.find('.semi-breadcrumb-item-wrap .semi-typography').children().at(0).text()).toEqual('semi'); expect(br.exists('.semi-breadcrumb-collapse .semi-icon-more')).toEqual(true); expect(br.find('.semi-breadcrumb-item-wrap .semi-typography').children().at(1).text()).toEqual('by'); expect(br.find('.semi-breadcrumb-item-wrap .semi-typography').children().at(2).text()).toEqual('douyin'); }); it('Item icon/href/noLink/separator', () => { let href = 'https://semi.design' let props = { children: [ { icon: , separator: '???', children: 'semi' }, { icon: , children: 'design', href }, { children: 'system', href: null }, ] }; let br = getBr(props); expect(br.exists('.semi-icon-home')).toEqual(true); expect(br.exists('.semi-icon-article')).toEqual(true); expect(br.find('.semi-breadcrumb-item-wrap a').getDOMNode().getAttribute("href")).toEqual(href); // when setting separator in item props, will not wrap in .semi-breadcrumb-separator expect(br.find('.semi-breadcrumb-item-wrap').at(0).children().at(1).text()).toEqual('???') expect(br.find('.semi-breadcrumb-separator').children().at(0).text()).toEqual('/') }); it('onClick & item.onClick', () => { let spyClick = sinon.spy((item, e) => { }); let spyItemClick = sinon.spy((item, e) => { }); let props = { onClick: spyClick, children: [ { onClick: spyItemClick, children: 'semi' }, { children: 'design' }, ] }; let br = getBr(props); br.find('.semi-breadcrumb-item-wrap').children().at(0).simulate('click', {}); expect(spyItemClick.calledOnce).toEqual(true); expect(spyClick.calledOnce).toEqual(true); let firstCall = spyClick.getCall(0); let firstArgs = firstCall.args; expect(firstArgs[0]).toEqual({ name: 'semi' }); expect(firstArgs[1].constructor.name === 'SyntheticEvent').toEqual(true); expect(firstArgs.length === 2).toEqual(true); let itemCall = spyItemClick.getCall(0); let itemArgs = itemCall.args; expect(itemArgs[0]).toEqual({ name: 'semi' }); expect(itemArgs[1].constructor.name === 'SyntheticEvent').toEqual(true); expect(itemArgs.length === 2).toEqual(true); }); it('routes', () => { // object routes & string routes hybrid const objRoutes = [ { path: '/', href: '/', icon: }, { path: '/breadcrumb', href: '/components/breadcrumb', name: 'breadcrumb', icon: }, 'string only' ]; let props = { routes: objRoutes } let br = getBr(props); let fisrtItem = br.find('.semi-breadcrumb-item-wrap').at(0); let secondItem = br.find('.semi-breadcrumb-item-wrap').at(1); let thirdItem = br.find('.semi-breadcrumb-item-wrap').at(2); expect(fisrtItem.exists('.semi-icon-home')).toEqual(true); expect(secondItem.exists('.semi-icon-article')).toEqual(true); expect(fisrtItem.find('.semi-breadcrumb-item-wrap a').getDOMNode().getAttribute("href")).toEqual('/'); expect(secondItem.find('.semi-breadcrumb-item-wrap a').getDOMNode().getAttribute("href")).toEqual('/components/breadcrumb'); expect(secondItem.find('.semi-breadcrumb-item-wrap .semi-typography').text()).toEqual('breadcrumb'); expect(thirdItem.find('.semi-breadcrumb-item-wrap .semi-typography').text()).toEqual('string only'); }); it('renderItem', () => { const objRoutes = [ { path: 'path', href: 'href', name: 'test', icon: , } ]; let props = { routes: objRoutes, renderItem: (route) => ( <>
{route.path}
{route.href}
{route.name}
) } let br = getBr(props); let item = br.find('.semi-breadcrumb-item-title'); expect(item.find('.path').text()).toEqual('path'); expect(item.find('.href').text()).toEqual('href'); expect(item.find('.name').text()).toEqual('test'); }); // it('renderMore + moreType', () => { // let props = { // maxItemCount: 3, // children: [ // { children: 'semi' }, // { children: 'design' }, // { children: 'powered' }, // { children: 'by' }, // { children: 'douyin' }, // ], // renderMore: (restItem) =>
rest
// }; // let br = getBr(props); // expect(br.find('.semi-breadcrumb-collapse')).toEqual(true); // }); // it('autoCollapse', () => { // }); // not easy to test tooltip in jest unit test, ignore // it('showTooltip', () => { // }); });