From 5fa8025f985772b2b31558598f39462452c26d18 Mon Sep 17 00:00:00 2001 From: Zach Brogan Date: Wed, 12 Feb 2020 15:40:23 -0700 Subject: [PATCH 1/3] fix: make fireEvent mouseEnter/mouseLeave work with addEventListener (#577) --- src/pure.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pure.js b/src/pure.js index 1b1838bf..7cc495f5 100644 --- a/src/pure.js +++ b/src/pure.js @@ -128,8 +128,16 @@ 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) +} fireEvent.select = (node, init) => { // React tracks this event only on focused inputs From 11ae55b8b45908aac30f8322d09b6b5753db3926 Mon Sep 17 00:00:00 2001 From: Zach Brogan Date: Fri, 14 Feb 2020 11:08:33 -0700 Subject: [PATCH 2/3] Add tests for native events --- src/__tests__/events.js | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/__tests__/events.js b/src/__tests__/events.js index afe2193f..898d9cbe 100644 --- a/src/__tests__/events.js +++ b/src/__tests__/events.js @@ -128,6 +128,9 @@ const eventTypes = [ }, ] +// native select event isn't passing +const nonNativeEvents = {doubleClick: 'dblclick', select: true} + eventTypes.forEach(({type, events, elementType, init}) => { describe(`${type} Events`, () => { events.forEach(eventName => { @@ -153,6 +156,42 @@ eventTypes.forEach(({type, events, elementType, init}) => { }) }) +eventTypes.forEach(({type, events, elementType, init}) => { + describe(`Native ${type} Events`, () => { + events.forEach(eventName => { + let nativeEventName = eventName.toLowerCase() + if (nonNativeEvents[eventName]) { + if (nonNativeEvents[eventName] === true) { + return + } + nativeEventName = nonNativeEvents[eventName] + } + + 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 { From a40842df91c9065ad87df65fc8263429c54da5ec Mon Sep 17 00:00:00 2001 From: Zach Brogan Date: Fri, 21 Feb 2020 19:51:01 -0700 Subject: [PATCH 3/3] fix: make fireEvent select work with addEventListener. Improve organization of native events test. --- src/__tests__/events.js | 12 ++++-------- src/pure.js | 2 ++ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/__tests__/events.js b/src/__tests__/events.js index 898d9cbe..dc529344 100644 --- a/src/__tests__/events.js +++ b/src/__tests__/events.js @@ -128,9 +128,6 @@ const eventTypes = [ }, ] -// native select event isn't passing -const nonNativeEvents = {doubleClick: 'dblclick', select: true} - eventTypes.forEach(({type, events, elementType, init}) => { describe(`${type} Events`, () => { events.forEach(eventName => { @@ -160,11 +157,10 @@ eventTypes.forEach(({type, events, elementType, init}) => { describe(`Native ${type} Events`, () => { events.forEach(eventName => { let nativeEventName = eventName.toLowerCase() - if (nonNativeEvents[eventName]) { - if (nonNativeEvents[eventName] === true) { - return - } - nativeEventName = nonNativeEvents[eventName] + + // The doubleClick synthetic event maps to the dblclick native event + if (nativeEventName === 'doubleclick') { + nativeEventName = 'dblclick' } it(`triggers native ${nativeEventName}`, () => { diff --git a/src/pure.js b/src/pure.js index 7cc495f5..40588797 100644 --- a/src/pure.js +++ b/src/pure.js @@ -139,7 +139,9 @@ fireEvent.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()