diff --git a/src/__tests__/events.js b/src/__tests__/events.js index afe2193f..dc529344 100644 --- a/src/__tests__/events.js +++ b/src/__tests__/events.js @@ -153,6 +153,41 @@ eventTypes.forEach(({type, events, elementType, init}) => { }) }) +eventTypes.forEach(({type, events, elementType, init}) => { + describe(`Native ${type} Events`, () => { + events.forEach(eventName => { + let nativeEventName = eventName.toLowerCase() + + // The doubleClick synthetic event maps to the dblclick native event + if (nativeEventName === 'doubleclick') { + nativeEventName = 'dblclick' + } + + it(`triggers native ${nativeEventName}`, () => { + const ref = React.createRef() + const spy = jest.fn() + const Element = elementType + + const NativeEventElement = () => { + React.useEffect(() => { + const element = ref.current + element.addEventListener(nativeEventName, spy) + return () => { + element.removeEventListener(nativeEventName, spy) + } + }) + return + } + + render() + + fireEvent[eventName](ref.current, init) + expect(spy).toHaveBeenCalledTimes(1) + }) + }) + }) +}) + test('onChange works', () => { const handleChange = jest.fn() const { diff --git a/src/pure.js b/src/pure.js index 1b1838bf..40588797 100644 --- a/src/pure.js +++ b/src/pure.js @@ -128,10 +128,20 @@ Object.keys(dtlFireEvent).forEach(key => { // React event system tracks native mouseOver/mouseOut events for // running onMouseEnter/onMouseLeave handlers // @link https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/events/EnterLeaveEventPlugin.js#L24-L31 -fireEvent.mouseEnter = fireEvent.mouseOver -fireEvent.mouseLeave = fireEvent.mouseOut +const mouseEnter = fireEvent.mouseEnter +const mouseLeave = fireEvent.mouseLeave +fireEvent.mouseEnter = (...args) => { + mouseEnter(...args) + return fireEvent.mouseOver(...args) +} +fireEvent.mouseLeave = (...args) => { + mouseLeave(...args) + return fireEvent.mouseOut(...args) +} +const select = fireEvent.select fireEvent.select = (node, init) => { + select(node, init) // React tracks this event only on focused inputs node.focus()