import React from 'react'; import { CloseOutlined } from '@ant-design/icons'; import type { SelectProps } from '..'; import Select from '..'; import { resetWarned } from '../../_util/warning'; import focusTest from '../../../tests/shared/focusTest'; import mountTest from '../../../tests/shared/mountTest'; import rtlTest from '../../../tests/shared/rtlTest'; import { act, fireEvent, render } from '../../../tests/utils'; const { Option } = Select; describe('Select', () => { focusTest(Select, { refFocus: true }); mountTest(Select); rtlTest(Select); function toggleOpen(container: ReturnType['container']): void { fireEvent.mouseDown(container.querySelector('.ant-select-selector')!); act(() => { jest.runAllTimers(); }); } beforeEach(() => { jest.useFakeTimers(); }); afterEach(() => { jest.useRealTimers(); }); it('should have default notFoundContent', () => { const { container } = render(); toggleOpen(container); expect(container.querySelectorAll('.ant-empty').length).toBe(0); }); it('should not have default notFoundContent when mode is combobox', () => { const { container } = render( , ); toggleOpen(container); expect(container.querySelector('.ant-select-item-option')).toBeFalsy(); expect(container.querySelector('.ant-select-item-empty')).toHaveTextContent('not at all'); }); it('should be controlled by open prop', () => { const onDropdownVisibleChange = jest.fn(); const TestComponent: React.FC = () => { const [open, setOpen] = React.useState(false); const handleChange: SelectProps['onDropdownVisibleChange'] = (value) => { onDropdownVisibleChange(value); setOpen(value); }; return ( ); }; const { container } = render(); expect(container.querySelector('.ant-select-dropdown')).toBeFalsy(); toggleOpen(container); expect(container.querySelectorAll('.ant-select-dropdown').length).toBe(1); expect(onDropdownVisibleChange).toHaveBeenLastCalledWith(true); }); it('should show search icon when showSearch and open', () => { jest.useFakeTimers(); const { container } = render( , ); expect(container.querySelectorAll('.anticon-down').length).toBe(1); expect(container.querySelectorAll('.anticon-search').length).toBe(0); toggleOpen(container); expect(container.querySelectorAll('.anticon-down').length).toBe(0); expect(container.querySelectorAll('.anticon-search').length).toBe(1); }); describe('Select Custom Icons', () => { it('should support customized icons', () => { const { rerender, asFragment } = render( , ); rerender( , ); act(() => { jest.runAllTimers(); }); expect(asFragment().firstChild).toMatchSnapshot(); }); }); describe('Deprecated', () => { it('should ignore mode="combobox"', () => { const { asFragment } = render( , ); expect(asFragment().firstChild).toMatchSnapshot(); }); it('dropdownClassName', () => { resetWarned(); const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); const { container } = render(); expect(errSpy).toHaveBeenCalledWith( 'Warning: [antd: Select] `dropdownMatchSelectWidth` is deprecated. Please use `popupMatchSelectWidth` instead.', ); errSpy.mockRestore(); }); it('deprecate showArrow', () => { resetWarned(); const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); const { container } = render(); expect(errSpy).toHaveBeenCalledWith( expect.stringContaining('Warning: [antd: Select] `bordered` is deprecated'), ); expect(container.querySelector('.ant-select-borderless')).toBeTruthy(); errSpy.mockRestore(); }); it('Select maxCount warning', () => { resetWarned(); const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); render(