diff --git a/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js b/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js index c539ee7f4..93ca3fbae 100644 --- a/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js +++ b/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js @@ -148,7 +148,7 @@ class ReactFifteenFourAdapter extends EnzymeAdapter { return instance ? instanceToTree(instance._reactInternalInstance).rendered : null; }, simulateEvent(node, event, mock) { - const mappedEvent = mapNativeEventNames(event); + const mappedEvent = mapNativeEventNames(event, { animation: true }); const eventFn = TestUtils.Simulate[mappedEvent]; if (!eventFn) { throw new TypeError(`ReactWrapper::simulate() event '${event}' does not exist`); diff --git a/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js b/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js index 5195c93fc..73b709497 100644 --- a/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js +++ b/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js @@ -148,7 +148,7 @@ class ReactFifteenAdapter extends EnzymeAdapter { return instance ? instanceToTree(instance._reactInternalInstance).rendered : null; }, simulateEvent(node, event, mock) { - const mappedEvent = mapNativeEventNames(event); + const mappedEvent = mapNativeEventNames(event, { animation: true }); const eventFn = TestUtils.Simulate[mappedEvent]; if (!eventFn) { throw new TypeError(`ReactWrapper::simulate() event '${event}' does not exist`); diff --git a/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js b/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js index aa6581c04..68ba2c1d6 100644 --- a/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js +++ b/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js @@ -205,7 +205,7 @@ class ReactSixteenAdapter extends EnzymeAdapter { return instance ? toTree(instance._reactInternalFiber).rendered : null; }, simulateEvent(node, event, mock) { - const mappedEvent = mapNativeEventNames(event); + const mappedEvent = mapNativeEventNames(event, { animation: true }); const eventFn = TestUtils.Simulate[mappedEvent]; if (!eventFn) { throw new TypeError(`ReactWrapper::simulate() event '${event}' does not exist`); diff --git a/packages/enzyme-adapter-utils/src/Utils.js b/packages/enzyme-adapter-utils/src/Utils.js index 1f40ca0f6..491e9fcc5 100644 --- a/packages/enzyme-adapter-utils/src/Utils.js +++ b/packages/enzyme-adapter-utils/src/Utils.js @@ -3,7 +3,9 @@ import createRenderWrapper from './createRenderWrapper'; export { createMountWrapper, createRenderWrapper }; -export function mapNativeEventNames(event) { +export function mapNativeEventNames(event, { + animation = false, // should be true for React 15+ +} = {}) { const nativeToReactEventMap = { compositionend: 'compositionEnd', compositionstart: 'compositionStart', @@ -42,6 +44,11 @@ export function mapNativeEventNames(event) { mouseenter: 'mouseEnter', mouseleave: 'mouseLeave', transitionend: 'transitionEnd', + ...(animation && { + animationstart: 'animationStart', + animationiteration: 'animationIteration', + animationend: 'animationEnd', + }), }; return nativeToReactEventMap[event] || event; diff --git a/packages/enzyme-test-suite/test/Utils-spec.jsx b/packages/enzyme-test-suite/test/Utils-spec.jsx index 66552b7ce..c49465b5d 100644 --- a/packages/enzyme-test-suite/test/Utils-spec.jsx +++ b/packages/enzyme-test-suite/test/Utils-spec.jsx @@ -467,6 +467,18 @@ describe('Utils', () => { expect(result).to.equal('dragEnter'); }); }); + + describe('conditionally supported events', () => { + it('ignores unsupported events', () => { + const result = mapNativeEventNames('animationiteration'); + expect(result).to.equal('animationiteration'); + }); + + it('transforms events when supported', () => { + const result = mapNativeEventNames('animationiteration', { animation: true }); + expect(result).to.equal('animationIteration'); + }); + }); }); describe('displayNameOfNode', () => {