import React from 'react'; import { mount } from 'enzyme'; import { spyElementPrototypes } from 'rc-util/lib/test/domHook'; import { sleep } from '../utils'; // eslint-disable-next-line jest/no-export export default function focusTest(Component, refFocus = false) { describe('focus and blur', () => { let domSpy; let focused = false; let blurred = false; beforeAll(() => { if (refFocus) { domSpy = spyElementPrototypes(HTMLElement, { focus() { focused = true; }, blur() { blurred = true; }, }); } }); let container; beforeEach(() => { container = document.createElement('div'); document.body.appendChild(container); focused = false; blurred = false; }); afterAll(() => { if (domSpy) { domSpy.mockRestore(); } }); afterEach(() => { document.body.removeChild(container); }); if (refFocus) { it('Ref: focus() and onFocus', () => { const onFocus = jest.fn(); const ref = React.createRef(); const wrapper = mount(
, ); ref.current.focus(); expect(focused).toBeTruthy(); wrapper .find('input') .first() .simulate('focus'); expect(onFocus).toHaveBeenCalled(); }); it('Ref: blur() and onBlur', () => { const onBlur = jest.fn(); const ref = React.createRef(); const wrapper = mount(
, ); ref.current.blur(); expect(blurred).toBeTruthy(); wrapper .find('input') .first() .simulate('blur'); expect(onBlur).toHaveBeenCalled(); }); it('Ref: autoFocus', () => { const onFocus = jest.fn(); const wrapper = mount(); expect(focused).toBeTruthy(); wrapper .find('input') .first() .simulate('focus'); expect(onFocus).toHaveBeenCalled(); }); } else { it('focus() and onFocus', () => { const handleFocus = jest.fn(); const wrapper = mount(, { attachTo: container }); wrapper.instance().focus(); expect(handleFocus).toHaveBeenCalled(); }); it('blur() and onBlur', async () => { jest.useRealTimers(); const handleBlur = jest.fn(); const wrapper = mount(, { attachTo: container }); wrapper.instance().focus(); await sleep(0); wrapper.instance().blur(); await sleep(0); expect(handleBlur).toHaveBeenCalled(); }); it('autoFocus', () => { const handleFocus = jest.fn(); mount(, { attachTo: container }); expect(handleFocus).toHaveBeenCalled(); }); } }); }