import Pagination from '../index'; import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants'; import { genAfterEach, genBeforeEach, sleep } from '../../_test_/utils'; const defaultPageSize = 10; // Pagination中第一层结构为LocaleConsumer,如果用shallow不好使 function getPagination(props) { return mount(, { attachTo: document.getElementById('container') }); } describe('Pagination', () => { // 主要验证渲染的pageItem数量,以及最后一页的页码 it('Pagination total & pageSize', () => { let maxItemCount = 9; const total30 = mount(); const total70 = mount(); const total200 = mount(); const size50 = mount(); function getPageChild(wrapper) { return wrapper.find('ul').children(); } expect(getPageChild(total30)).toHaveLength(5); expect(getPageChild(total70)).toHaveLength(maxItemCount); expect(getPageChild(total200)).toHaveLength(maxItemCount); expect(getPageChild(size50)).toHaveLength(Math.ceil(200/50)+2); }); it('Pagination with custom className & style', () => { const wrapper = mount(); expect(wrapper.exists('.test')).toEqual(true); // 此处写ul.test 是因为如果直接find (.test)会找到两个,第一个是react instance,第二个才是真正的dom组件 // 限定ul.test可以直接拿到真正的dom组件 expect(wrapper.find('ul.test')).toHaveStyle('color', 'red'); }); it('render mini pagination', () => { const wrapper = mount(); expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-page-small`)).toEqual(true); }); it('Pagination showTotal & showSizeChanger', () => { const wrapper = mount(); expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-page-total`)).toEqual(true); expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-page-switch`)).toEqual(true); }); it('Pagination with defaultCurrentPage', () => { const wrapper = mount(); expect(wrapper.state('currentPage')).toEqual(3); expect(wrapper.find('.semi-page').children().at(4).text()).toEqual('3') }); it('auto disabled prev/next btn when first/last page', () => { const firstPage = mount(); const lastPage = mount(); const onlyOnePage = mount(); let DISABLED_CLASS = `.${BASE_CLASS_PREFIX}-page-item-disabled`; expect(firstPage.find('ul').children().first().exists(DISABLED_CLASS)).toEqual(true); expect(firstPage.find('ul').children().last().exists(DISABLED_CLASS)).toEqual(false); expect(lastPage.find('ul').children().first().exists(DISABLED_CLASS)).toEqual(false); expect(lastPage.find('ul').children().last().exists(DISABLED_CLASS)).toEqual(true); expect(onlyOnePage.find('ul').children().first().exists(DISABLED_CLASS)).toEqual(true); expect(onlyOnePage.find('ul').children().last().exists(DISABLED_CLASS)).toEqual(true); }); it('hideOnSingePage', () => { let props = { total: 10, hideOnSingePage: true, }; const pag = getPagination(props); expect(pag.exists('.semi-age')).toEqual(false); }); it('nextText & prevText', () => { let props = { total: 200, nextText: 'next', prevText: 'prev', }; const pag = getPagination(props); expect(pag.find('.semi-page-next').text()).toEqual('next'); expect(pag.find('.semi-page-prev').text()).toEqual('prev'); }); it('showTotal & showSizeChanger', () => { let props = { total: 200, showTotal: true, showSizeChanger: true, }; const pag = getPagination(props); expect(pag.exists('.semi-page-total')).toEqual(true); expect(pag.find('.semi-page-total').text()).toEqual('共 20 页') expect(pag.exists('.semi-page-switch')).toEqual(true); }) it('dynamic change pageSize', () => { // let map = { // 10: 40, // 40: 100, // 100: 20, // 100: 10 // } let props = { total: 200, showSizeChanger: true, pageSize: 10 } const pag = getPagination(props); // pageSize 10 -> 40 pag.setProps({ pageSize: 40 }); pag.update(); expect(pag.state().pageSize).toEqual(40); expect(pag.find('.semi-select-selection-text').children(0).text()).toEqual('40 条/页'); expect(pag.find('.semi-page-item').children().length).toEqual((200/40) + 2); // pageSize 40 -> 100 pag.setProps({ pageSize: 100 }); pag.update(); expect(pag.state().pageSize).toEqual(100); expect(pag.find('.semi-select-selection-text').children(0).text()).toEqual('100 条/页'); expect(pag.find('.semi-page-item').children().length).toEqual((200/100) + 2); // pageSize 100 -> 20 pag.setProps({ pageSize: 20 }); pag.update(); expect(pag.state().pageSize).toEqual(20); expect(pag.find('.semi-select-selection-text').children(0).text()).toEqual('20 条/页'); // show ..., always 9 expect(pag.find('.semi-page-item').children().length).toEqual(9); }); it('onPageChange', () => { let tagetPage = 7; let onPageChange = value => { // debugger // console.log(value); }; let spyOnPageChange = sinon.spy(onPageChange); const pag = mount(); pag.find('li').at(7).simulate('click'); expect(spyOnPageChange.calledOnce).toBe(true); expect(spyOnPageChange.calledWithMatch(tagetPage)).toBe(true); }); // TODO select没有留出props控制是否自动打开,这块不太好测 it('pageSizeOpts', () => { let props = { pageSizeOpts: [10, 20, 30], showSizeChanger: true, }; const pag = getPagination(props); }); // it('popoverPosition & popoverZIndex', () => { // let props = { // popoverPosition: 'right', // popoverZIndex: 888, // total: 200, // }; // const pag = getPagination(props); // let rest = pag.find('.semi-page-item').children().at(5); // rest.simulate('mouseEnter'); // }); // TODO 不太好测,事件不好模拟触发 // it('onPageSizeChange', async () => { // let onPageSizeChange = value => {}; // let spyOnPageSizeChange = sinon.spy(onPageSizeChange); // let props = { // onPageSizeChange: spyOnPageSizeChange, // showSizeChanger: true, // total: 200, // } // const pag = getPagination(props); // const select = pag.find('.semi-select'); // select.simulate('click'); // // await sleep(200); // const optionList = document.querySelector('.semi-select-option-list'); // done(); // // pagination.find('li').at(7).simulate('click'); // // expect(spyOnPageChange.calledOnce).toBe(true); // // expect(spyOnPageChange.calledWithMatch(tagetPage)).toBe(true); // }); it('uncontrol mode - onChange', () => { let tagetPage = 20; let onChange = value => {}; let spyOnChange = sinon.spy(onChange); let props = { onChange: spyOnChange, total: 200, }; const pagination = getPagination(props); pagination.find('.semi-page-item').at(7).simulate('click'); expect(spyOnChange.calledWithMatch(tagetPage)).toBe(true); }); it('currentPage & onChange in controlled mode', () => { let onChange = value => {}; let spyOnChange = sinon.spy(onChange); let props = { currentPage: 3, total: 200, onChange: spyOnChange }; const pag = getPagination(props); pag.find('.semi-page-item').at(7).simulate('click'); expect(spyOnChange.calledWithMatch(20)).toBe(true); expect(pag.state().currentPage).toEqual(3); pag.setProps({ currentPage: 4 }); expect(pag.state().currentPage).toEqual(4); expect(pag.find('.semi-page-item-active').text()).toEqual("3"); }); it('showQuickJumper', () => { let spyOnChange = sinon.spy(() => {}); let props = { total: 200, onChange: spyOnChange, showQuickJumper: true, }; let quickJumpPage = 5; const pag = mount(); const jumper = pag.find('.semi-page .semi-page-quickjump-input-number.semi-input-number input'); jumper.simulate('focus'); jumper.simulate('change', { target: { value: quickJumpPage }}); jumper.simulate('blur'); expect(spyOnChange.calledWithMatch(quickJumpPage)).toBe(true); expect(pag.state().currentPage).toEqual(quickJumpPage); jumper.simulate('focus'); jumper.simulate('change', { target: { value: props.total / 10 + 1 }}); jumper.simulate('blur'); expect(pag.state().currentPage).toEqual(props.total / 10); jumper.simulate('focus'); jumper.simulate('change', { target: { value: NaN }}); jumper.simulate('keypress', { key: 'Enter' }); expect(pag.state().currentPage).toEqual(props.total / 10); jumper.simulate('focus'); jumper.simulate('change', { target: { value: -1 }}); jumper.simulate('keypress', { key: 'Enter' }); expect(pag.state().currentPage).toEqual(1); pag.unmount(); }); })