99
1010'use strict' ;
1111
12- var SyntheticEvent ;
1312var React ;
1413var ReactDOM ;
1514var ReactTestUtils ;
@@ -18,63 +17,122 @@ describe('SyntheticEvent', () => {
1817 var createEvent ;
1918
2019 beforeEach ( ( ) => {
21- // TODO: can we express this test with only public API?
22- SyntheticEvent = require ( 'SyntheticEvent' ) ;
2320 React = require ( 'react' ) ;
2421 ReactDOM = require ( 'react-dom' ) ;
2522 ReactTestUtils = require ( 'react-dom/test-utils' ) ;
26-
27- createEvent = function ( nativeEvent ) {
28- var target = require ( 'getEventTarget' ) ( nativeEvent ) ;
29- return SyntheticEvent . getPooled ( { } , '' , nativeEvent , target ) ;
23+ createEvent = ( eventType , nativeEvent ) => {
24+ const defaultNativeEvent = {
25+ bubbles : true ,
26+ cancelable : true ,
27+ ...nativeEvent ,
28+ } ;
29+ var event = new Event ( [ eventType , defaultNativeEvent ] ) ;
30+ event . initEvent (
31+ eventType ,
32+ defaultNativeEvent . bubbles ,
33+ defaultNativeEvent . cancelabl ,
34+ ) ;
35+ return event ;
3036 } ;
3137 } ) ;
3238
3339 it ( 'should normalize `target` from the nativeEvent' , ( ) => {
34- var target = document . createElement ( 'div' ) ;
35- var syntheticEvent = createEvent ( { srcElement : target } ) ;
40+ var click = jest . fn ( ) ;
41+ var container = document . createElement ( 'div' ) ;
42+
43+ var onClick = e => click ( e . target ) ;
44+
45+ var instance = ReactDOM . render ( < div onClick = { onClick } /> , container ) ;
3646
37- expect ( syntheticEvent . target ) . toBe ( target ) ;
38- expect ( syntheticEvent . type ) . toBe ( undefined ) ;
47+ document . body . appendChild ( container ) ;
48+
49+ var event = createEvent ( 'click' , { srcElement : instance } ) ;
50+ var elem = ReactDOM . findDOMNode ( instance ) ;
51+ elem . dispatchEvent ( event ) ;
52+ expect ( click ) . toBeCalledWith ( elem ) ;
53+ document . body . removeChild ( container ) ;
3954 } ) ;
4055
4156 it ( 'should be able to `preventDefault`' , ( ) => {
42- var nativeEvent = { } ;
43- var syntheticEvent = createEvent ( nativeEvent ) ;
57+ var click = jest . fn ( ) ;
58+ var container = document . createElement ( 'div' ) ;
4459
45- expect ( syntheticEvent . isDefaultPrevented ( ) ) . toBe ( false ) ;
46- syntheticEvent . preventDefault ( ) ;
47- expect ( syntheticEvent . isDefaultPrevented ( ) ) . toBe ( true ) ;
60+ var onClick = e => {
61+ click ( e . isDefaultPrevented ( ) ) ;
62+ e . preventDefault ( ) ;
63+ click ( e . isDefaultPrevented ( ) ) ;
64+ } ;
4865
49- expect ( syntheticEvent . defaultPrevented ) . toBe ( true ) ;
66+ var instance = ReactDOM . render ( < div onClick = { onClick } /> , container ) ;
5067
51- expect ( nativeEvent . returnValue ) . toBe ( false ) ;
68+ document . body . appendChild ( container ) ;
69+
70+ var event = createEvent ( 'click' , { srcElement : instance } ) ;
71+ var elem = ReactDOM . findDOMNode ( instance ) ;
72+ elem . dispatchEvent ( event ) ;
73+ expect ( click . mock . calls [ 0 ] [ 0 ] ) . toBe ( false ) ;
74+ expect ( click . mock . calls [ 1 ] [ 0 ] ) . toBe ( true ) ;
75+ document . body . removeChild ( container ) ;
5276 } ) ;
5377
5478 it ( 'should be prevented if nativeEvent is prevented' , ( ) => {
55- expect ( createEvent ( { defaultPrevented : true } ) . isDefaultPrevented ( ) ) . toBe (
56- true ,
57- ) ;
58- expect ( createEvent ( { returnValue : false } ) . isDefaultPrevented ( ) ) . toBe ( true ) ;
79+ var click = jest . fn ( ) ;
80+ var container = document . createElement ( 'div' ) ;
81+
82+ var onClick = e => click ( e . isDefaultPrevented ( ) ) ;
83+
84+ var instance = ReactDOM . render ( < div onClick = { onClick } /> , container ) ;
85+
86+ var elem = ReactDOM . findDOMNode ( instance ) ;
87+ ReactTestUtils . SimulateNative . click ( elem , { defaultPrevented : true } ) ;
88+ ReactTestUtils . SimulateNative . click ( elem , { returnValue : false } ) ;
89+
90+ expect ( click . mock . calls [ 0 ] [ 0 ] ) . toBe ( true ) ;
91+ expect ( click . mock . calls [ 1 ] [ 0 ] ) . toBe ( true ) ;
5992 } ) ;
6093
6194 it ( 'should be able to `stopPropagation`' , ( ) => {
62- var nativeEvent = { } ;
63- var syntheticEvent = createEvent ( nativeEvent ) ;
95+ var click = jest . fn ( ) ;
96+ var container = document . createElement ( 'div' ) ;
6497
65- expect ( syntheticEvent . isPropagationStopped ( ) ) . toBe ( false ) ;
66- syntheticEvent . stopPropagation ( ) ;
67- expect ( syntheticEvent . isPropagationStopped ( ) ) . toBe ( true ) ;
98+ var onClick = e => {
99+ click ( e . isPropagationStopped ( ) ) ;
100+ e . stopPropagation ( ) ;
101+ click ( e . isPropagationStopped ( ) ) ;
102+ } ;
103+
104+ var instance = ReactDOM . render ( < div onClick = { onClick } /> , container ) ;
68105
69- expect ( nativeEvent . cancelBubble ) . toBe ( true ) ;
106+ document . body . appendChild ( container ) ;
107+
108+ var event = createEvent ( 'click' , { srcElement : instance } ) ;
109+ var elem = ReactDOM . findDOMNode ( instance ) ;
110+ elem . dispatchEvent ( event ) ;
111+ expect ( click . mock . calls [ 0 ] [ 0 ] ) . toBe ( false ) ;
112+ expect ( click . mock . calls [ 1 ] [ 0 ] ) . toBe ( true ) ;
113+ document . body . removeChild ( container ) ;
70114 } ) ;
71115
72116 it ( 'should be able to `persist`' , ( ) => {
73- var syntheticEvent = createEvent ( { } ) ;
117+ var click = jest . fn ( ) ;
118+ var container = document . createElement ( 'div' ) ;
119+
120+ var onClick = e => {
121+ click ( e . isPersistent ( ) ) ;
122+ e . persist ( ) ;
123+ click ( e . isPersistent ( ) ) ;
124+ } ;
125+
126+ var instance = ReactDOM . render ( < div onClick = { onClick } /> , container ) ;
127+
128+ document . body . appendChild ( container ) ;
74129
75- expect ( syntheticEvent . isPersistent ( ) ) . toBe ( false ) ;
76- syntheticEvent . persist ( ) ;
77- expect ( syntheticEvent . isPersistent ( ) ) . toBe ( true ) ;
130+ var event = createEvent ( 'click' , { srcElement : instance } ) ;
131+ var elem = ReactDOM . findDOMNode ( instance ) ;
132+ elem . dispatchEvent ( event ) ;
133+ expect ( click . mock . calls [ 0 ] [ 0 ] ) . toBe ( false ) ;
134+ expect ( click . mock . calls [ 1 ] [ 0 ] ) . toBe ( true ) ;
135+ document . body . removeChild ( container ) ;
78136 } ) ;
79137
80138 it ( 'should be nullified if the synthetic event has called destructor and log warnings' , ( ) => {
@@ -143,9 +201,9 @@ describe('SyntheticEvent', () => {
143201 ) ;
144202 } ) ;
145203
146- // TODO: reenable this test. We are currently silencing these warnings when
147- // using TestUtils.Simulate to avoid spurious warnings that result from the
148- // way we simulate events.
204+ /* TODO: reenable this test. We are currently silencing these warnings when
205+ using TestUtils.Simulate to avoid spurious warnings that result from the
206+ way we simulate events. */
149207 xit (
150208 'should properly log warnings when events simulated with rendered components' ,
151209 ( ) => {
0 commit comments