From 4abb87dcbaa03416660fd7c8846d4633403fdc20 Mon Sep 17 00:00:00 2001 From: Nicolas Gallagher Date: Tue, 2 Apr 2019 17:35:49 -0700 Subject: [PATCH] Add test for async event dispatching Verified that a variant of this test fails as follows when the `context.withAsyncDispatching` function is excluded (i.e., reproduces the issue). Expected value to equal: ["press", "longpress", "longpresschange"] Received: ["press", "longpress", "longpress", "longpresschange"] --- .../DOMEventResponderSystem-test.internal.js | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js b/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js index b8ef52edf08e9..367e55ed28d4d 100644 --- a/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js +++ b/packages/react-dom/src/events/__tests__/DOMEventResponderSystem-test.internal.js @@ -256,4 +256,67 @@ describe('DOMEventResponderSystem', () => { expect(eventLog).toEqual(['magic event fired', 'magicclick']); }); + + it('async event dispatching works', () => { + let eventLog = []; + const buttonRef = React.createRef(); + + const LongPressEventComponent = createReactEventComponent( + ['click'], + (context, props) => { + const pressEvent = { + listener: props.onPress, + target: context.eventTarget, + type: 'press', + }; + context.dispatchEvent(pressEvent, {discrete: true}); + + setTimeout( + () => + context.withAsyncDispatching(() => { + if (props.onLongPress) { + const longPressEvent = { + listener: props.onLongPress, + target: context.eventTarget, + type: 'longpress', + }; + context.dispatchEvent(longPressEvent, {discrete: true}); + } + + if (props.onLongPressChange) { + const longPressChangeEvent = { + listener: props.onLongPressChange, + target: context.eventTarget, + type: 'longpresschange', + }; + context.dispatchEvent(longPressChangeEvent, {discrete: true}); + } + }), + 500, + ); + }, + ); + + function log(msg) { + eventLog.push(msg); + } + + const Test = () => ( + log('press')} + onLongPress={() => log('longpress')} + onLongPressChange={() => log('longpresschange')}> + + + ); + + ReactDOM.render(, container); + + // Clicking the button should trigger the event responder handleEvent() + let buttonElement = buttonRef.current; + dispatchClickEvent(buttonElement); + jest.runAllTimers(); + + expect(eventLog).toEqual(['press', 'longpress', 'longpresschange']); + }); });