Skip to content

Commit 7c150a8

Browse files
smaniottogaearon
authored andcommitted
Refactor SyntheticClipboardEvent tests to only use the public API (#11365)
* Refactor SyntheticClipboardEvent tests to only use the public API * Replace local document creation by document body reset on each test case execution * Set up and tear down container separately * Tweak test assertion logic for clarity * Remove simulate abstraction and create events directly * Ensure the test covers IE8 behavior * Verify that persistence works
1 parent 365c2db commit 7c150a8

File tree

1 file changed

+172
-27
lines changed

1 file changed

+172
-27
lines changed

packages/react-dom/src/events/__tests__/SyntheticClipboardEvent-test.js

Lines changed: 172 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,68 +9,213 @@
99

1010
'use strict';
1111

12-
var SyntheticClipboardEvent;
12+
var React;
13+
var ReactDOM;
1314

1415
describe('SyntheticClipboardEvent', () => {
15-
var createEvent;
16+
var simulateEvent;
17+
var container;
1618

1719
beforeEach(() => {
18-
// TODO: can we express this test with only public API?
19-
SyntheticClipboardEvent = require('../SyntheticClipboardEvent').default;
20-
createEvent = function(nativeEvent) {
21-
var target = require('../getEventTarget').default(nativeEvent);
22-
return SyntheticClipboardEvent.getPooled({}, '', nativeEvent, target);
23-
};
20+
React = require('react');
21+
ReactDOM = require('react-dom');
22+
23+
container = document.createElement('div');
24+
document.body.appendChild(container);
25+
});
26+
27+
afterEach(() => {
28+
document.body.removeChild(container);
29+
container = null;
2430
});
2531

2632
describe('ClipboardEvent interface', () => {
2733
describe('clipboardData', () => {
2834
describe('when event has clipboardData', () => {
2935
it("returns event's clipboardData", () => {
30-
// Mock clipboardData since native implementation doesn't have a constructor
36+
var expectedCount = 0;
37+
38+
// Mock clipboardData since jsdom implementation doesn't have a constructor
3139
var clipboardData = {
3240
dropEffect: null,
3341
effectAllowed: null,
3442
files: null,
3543
items: null,
3644
types: null,
3745
};
38-
var clipboardEvent = createEvent({clipboardData: clipboardData});
46+
var eventHandler = event => {
47+
expect(event.clipboardData).toBe(clipboardData);
48+
expectedCount++;
49+
};
50+
var div = ReactDOM.render(
51+
<div
52+
onCopy={eventHandler}
53+
onCut={eventHandler}
54+
onPaste={eventHandler}
55+
/>,
56+
container,
57+
);
58+
59+
var event;
60+
event = document.createEvent('Event');
61+
event.initEvent('copy', true, true);
62+
event.clipboardData = clipboardData;
63+
div.dispatchEvent(event);
64+
65+
event = document.createEvent('Event');
66+
event.initEvent('cut', true, true);
67+
event.clipboardData = clipboardData;
68+
div.dispatchEvent(event);
3969

40-
expect(clipboardEvent.clipboardData).toBe(clipboardData);
70+
event = document.createEvent('Event');
71+
event.initEvent('paste', true, true);
72+
event.clipboardData = clipboardData;
73+
div.dispatchEvent(event);
74+
75+
expect(expectedCount).toBe(3);
4176
});
4277
});
4378
});
4479
});
4580

4681
describe('EventInterface', () => {
4782
it('normalizes properties from the Event interface', () => {
48-
var target = document.createElement('div');
49-
var syntheticEvent = createEvent({srcElement: target});
83+
var expectedCount = 0;
84+
var div;
85+
86+
var eventHandler = type => event => {
87+
expect(event.target).toBe(div);
88+
expect(event.type).toBe(type);
89+
expectedCount++;
90+
};
91+
92+
div = ReactDOM.render(
93+
<div
94+
onCopy={eventHandler('copy')}
95+
onCut={eventHandler('cut')}
96+
onPaste={eventHandler('paste')}
97+
/>,
98+
container,
99+
);
100+
101+
var event;
102+
event = document.createEvent('Event');
103+
event.initEvent('copy', true, true);
104+
// Emulate IE8
105+
Object.defineProperty(event, 'target', {
106+
get() {},
107+
});
108+
Object.defineProperty(event, 'srcElement', {
109+
get() {
110+
return div;
111+
},
112+
});
113+
div.dispatchEvent(event);
114+
115+
event = document.createEvent('Event');
116+
event.initEvent('cut', true, true);
117+
// Emulate IE8
118+
Object.defineProperty(event, 'target', {
119+
get() {},
120+
});
121+
Object.defineProperty(event, 'srcElement', {
122+
get() {
123+
return div;
124+
},
125+
});
126+
div.dispatchEvent(event);
50127

51-
expect(syntheticEvent.target).toBe(target);
52-
expect(syntheticEvent.type).toBe(undefined);
128+
event = document.createEvent('Event');
129+
event.initEvent('paste', true, true);
130+
// Emulate IE8
131+
Object.defineProperty(event, 'target', {
132+
get() {},
133+
});
134+
Object.defineProperty(event, 'srcElement', {
135+
get() {
136+
return div;
137+
},
138+
});
139+
div.dispatchEvent(event);
140+
141+
expect(expectedCount).toBe(3);
53142
});
54143

55144
it('is able to `preventDefault` and `stopPropagation`', () => {
56-
var nativeEvent = {};
57-
var syntheticEvent = createEvent(nativeEvent);
145+
var expectedCount = 0;
146+
147+
var eventHandler = event => {
148+
expect(event.isDefaultPrevented()).toBe(false);
149+
event.preventDefault();
150+
expect(event.isDefaultPrevented()).toBe(true);
151+
expect(event.isPropagationStopped()).toBe(false);
152+
event.stopPropagation();
153+
expect(event.isPropagationStopped()).toBe(true);
154+
expectedCount++;
155+
};
156+
157+
var div = ReactDOM.render(
158+
<div
159+
onCopy={eventHandler}
160+
onCut={eventHandler}
161+
onPaste={eventHandler}
162+
/>,
163+
container,
164+
);
58165

59-
expect(syntheticEvent.isDefaultPrevented()).toBe(false);
60-
syntheticEvent.preventDefault();
61-
expect(syntheticEvent.isDefaultPrevented()).toBe(true);
166+
var event;
167+
event = document.createEvent('Event');
168+
event.initEvent('copy', true, true);
169+
div.dispatchEvent(event);
62170

63-
expect(syntheticEvent.isPropagationStopped()).toBe(false);
64-
syntheticEvent.stopPropagation();
65-
expect(syntheticEvent.isPropagationStopped()).toBe(true);
171+
event = document.createEvent('Event');
172+
event.initEvent('cut', true, true);
173+
div.dispatchEvent(event);
174+
175+
event = document.createEvent('Event');
176+
event.initEvent('paste', true, true);
177+
div.dispatchEvent(event);
178+
179+
expect(expectedCount).toBe(3);
66180
});
67181

68182
it('is able to `persist`', () => {
69-
var syntheticEvent = createEvent({});
183+
var expectedCount = 0;
184+
185+
const persistentEvents = [];
186+
var eventHandler = event => {
187+
expect(event.isPersistent()).toBe(false);
188+
event.persist();
189+
expect(event.isPersistent()).toBe(true);
190+
persistentEvents.push(event);
191+
};
192+
193+
var div = ReactDOM.render(
194+
<div
195+
onCopy={eventHandler}
196+
onCut={eventHandler}
197+
onPaste={eventHandler}
198+
/>,
199+
container,
200+
);
201+
202+
var event;
203+
event = document.createEvent('Event');
204+
event.initEvent('copy', true, true);
205+
div.dispatchEvent(event);
206+
207+
event = document.createEvent('Event');
208+
event.initEvent('cut', true, true);
209+
div.dispatchEvent(event);
210+
211+
event = document.createEvent('Event');
212+
event.initEvent('paste', true, true);
213+
div.dispatchEvent(event);
70214

71-
expect(syntheticEvent.isPersistent()).toBe(false);
72-
syntheticEvent.persist();
73-
expect(syntheticEvent.isPersistent()).toBe(true);
215+
expect(persistentEvents.length).toBe(3);
216+
expect(persistentEvents[0].type).toBe('copy');
217+
expect(persistentEvents[1].type).toBe('cut');
218+
expect(persistentEvents[2].type).toBe('paste');
74219
});
75220
});
76221
});

0 commit comments

Comments
 (0)