import React, { useState } from 'react'; import { mount, render } from 'enzyme'; import Layout from '..'; import Icon from '../../icon'; import Menu from '../../menu'; import mountTest from '../../../tests/shared/mountTest'; import rtlTest from '../../../tests/shared/rtlTest'; const { Sider, Content, Footer, Header } = Layout; describe('Layout', () => { mountTest(Layout); mountTest(Content); mountTest(Sider); mountTest(() => ( )); rtlTest(Layout); rtlTest(Content); rtlTest(Sider); it('detect the sider as children', () => { const wrapper = mount( Sider Content , ); expect(wrapper.find('.ant-layout').hasClass('ant-layout-has-sider')).toBe(true); wrapper.unmount(); }); it('umount from multiple siders', async () => { const App = () => { const [hide1, setHide1] = useState(false); const [hide2, setHide2] = useState(false); return ( {hide1 ? null : Sider} {hide2 ? null : Sider} ); }; const wrapper = mount(); expect(wrapper.find('.ant-layout').hasClass('ant-layout-has-sider')).toBe(true); wrapper.find('button').at(0).simulate('click'); expect(wrapper.find('.ant-layout').hasClass('ant-layout-has-sider')).toBe(true); wrapper.find('button').at(1).simulate('click'); expect(wrapper.find('.ant-layout').hasClass('ant-layout-has-sider')).toBe(false); }); it('detect the sider inside the children', async () => { const wrapper = mount(
Sider
Content
, ); expect(wrapper.find('.ant-layout').hasClass('ant-layout-has-sider')).toBe(true); }); it('detect ant-layout-sider-has-trigger class in sider when ant-layout-sider-trigger div tag exists', async () => { const wrapper = mount(
Sider
Content
, ); expect(wrapper.find('.ant-layout-sider').hasClass('ant-layout-sider-has-trigger')).toBe(true); }); it('should have 50% width of sidebar', async () => { const wrapper = mount(
Sider
Content
, ); expect(wrapper.find('.ant-layout-sider').at(0).prop('style').width).toBe('50%'); expect(wrapper.find('.ant-layout-sider').at(0).prop('style').flex).toBe('0 0 50%'); }); describe('zeroWidth', () => { it('detect ant-layout-sider-zero-width class in sider when its width is 0%', async () => { const wrapper = mount(
Sider
Content
, ); expect(wrapper.find('.ant-layout-sider').hasClass('ant-layout-sider-zero-width')).toBe(true); }); describe('should collapsible', () => { it('uncontrolled', () => { const onCollapse = jest.fn(); const wrapper = mount( Sider Content , ); onCollapse.mockReset(); wrapper.find('.ant-layout-sider-zero-width-trigger').simulate('click'); expect(onCollapse).toHaveBeenCalledTimes(1); }); it('controlled', () => { const Demo = () => { const [collapsed, setCollapsed] = React.useState(true); return ( Sider Content ); }; const wrapper = mount(); expect(wrapper.find(Sider).prop('collapsed')).toBeTruthy(); wrapper.find('.ant-layout-sider-zero-width-trigger').simulate('click'); expect(wrapper.find(Sider).prop('collapsed')).toBeFalsy(); }); }); }); it('detect ant-layout-sider-dark as default theme', async () => { const wrapper = mount(Sider); expect(wrapper.find('.ant-layout-sider').hasClass('ant-layout-sider-dark')).toBe(true); }); it('detect ant-layout-sider-light when set light theme', async () => { const wrapper = mount(Sider); expect(wrapper.find('.ant-layout-sider').hasClass('ant-layout-sider-light')).toBe(true); }); it('renders string width correctly', () => { const wrapper = render(Sider); expect(wrapper).toMatchSnapshot(); }); it('should be controlled by collapsed', () => { const wrapper = mount(Sider); expect(wrapper.render()).toMatchSnapshot(); wrapper.setProps({ collapsed: true }); wrapper.update(); expect(wrapper.render()).toMatchSnapshot(); }); it('should not add ant-layout-has-sider when `hasSider` is `false`', () => { const wrapper = mount( Sider , ); expect(wrapper.find('.ant-layout').hasClass('ant-layout-has-sider')).toBe(false); }); it('render correct with Tooltip', () => { jest.useFakeTimers(); const wrapper = mount( Light , ); wrapper.find('.ant-menu-item').hostNodes().simulate('mouseenter'); jest.runAllTimers(); wrapper.update(); expect(wrapper.find('.ant-tooltip-inner').length).toBeFalsy(); wrapper.find('.ant-menu-item').hostNodes().simulate('mouseout'); jest.runAllTimers(); wrapper.update(); wrapper.setProps({ collapsed: true }); wrapper.find('.ant-menu-item').hostNodes().simulate('mouseenter'); jest.runAllTimers(); wrapper.update(); expect(wrapper.find('.ant-tooltip-inner').length).toBeTruthy(); jest.useRealTimers(); }); }); describe('Sider', () => { const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); afterEach(() => { errorSpy.mockReset(); }); afterAll(() => { errorSpy.mockRestore(); }); it('should trigger onBreakpoint', async () => { const onBreakpoint = jest.fn(); mount( Sider , ); expect(onBreakpoint).toHaveBeenCalledWith(true); }); it('should warning if use `inlineCollapsed` with menu', () => { mount( , ); expect(errorSpy).toHaveBeenCalledWith( 'Warning: [antd: Menu] `inlineCollapsed` not control Menu under Sider. Should set `collapsed` on Sider instead.', ); }); it('zeroWidthTriggerStyle should work', () => { const wrapper = mount( nav 1 , ); expect(wrapper.find('.ant-layout-sider-zero-width-trigger').props().style).toEqual({ background: '#F96', }); }); it('should be able to customize zero width trigger by trigger prop', () => { const wrapper = mount( }> nav 1 , ); expect(wrapper.find('.ant-layout-sider-zero-width-trigger').find('.my-trigger').length).toBe(1); }); ['Layout', 'Header', 'Footer', 'Sider'].forEach(tag => { const ComponentMap = { Layout, Header, Footer, Sider }; it(`should get ${tag} element from ref`, () => { const ref = React.createRef(); const onSelect = jest.fn(); const Component = ComponentMap[tag]; mount( {tag} , ); expect(ref.current instanceof HTMLElement).toBe(true); }); }); });