Skip to content

Commit 4de813b

Browse files
committed
feat(events): Add dataTransfer event property option
1 parent 752ff66 commit 4de813b

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

src/__tests__/events.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,27 @@ test('assigning the files property on an input', () => {
282282
expect(node.files).toEqual([file])
283283
})
284284

285+
test('assigns dataTransfer properties', () => {
286+
const node = document.createElement('div')
287+
const spy = jest.fn()
288+
node.addEventListener('dragover', spy)
289+
fireEvent.dragOver(node, {dataTransfer: {dropEffect: 'move'}})
290+
expect(spy).toHaveBeenCalledTimes(1)
291+
expect(spy.mock.calls[0][0]).toHaveProperty('dataTransfer.dropEffect', 'move')
292+
})
293+
294+
test('assigning the files property on dataTransfer', () => {
295+
const node = document.createElement('div')
296+
const file = new document.defaultView.File(['(⌐□_□)'], 'chucknorris.png', {
297+
type: 'image/png',
298+
})
299+
const spy = jest.fn()
300+
node.addEventListener('drop', spy)
301+
fireEvent.drop(node, {dataTransfer: {files: [file]}})
302+
expect(spy).toHaveBeenCalledTimes(1)
303+
expect(spy.mock.calls[0][0]).toHaveProperty('dataTransfer.files', [file])
304+
})
305+
285306
test('fires events on Window', () => {
286307
const messageSpy = jest.fn()
287308
window.addEventListener('message', messageSpy)

src/events.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,28 @@ Object.keys(eventMap).forEach(key => {
4444
Object.assign(node, targetProperties)
4545
const window = getWindowFromNode(node)
4646
const EventConstructor = window[EventType] || window.Event
47+
let event
4748
/* istanbul ignore else */
4849
if (typeof EventConstructor === 'function') {
49-
return new EventConstructor(eventName, eventInit)
50+
event = new EventConstructor(eventName, eventInit)
5051
} else {
5152
// IE11 polyfill from https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
52-
const event = window.document.createEvent(EventType)
53+
event = window.document.createEvent(EventType)
5354
const {bubbles, cancelable, detail, ...otherInit} = eventInit
5455
event.initEvent(eventName, bubbles, cancelable, detail)
5556
Object.keys(otherInit).forEach(eventKey => {
5657
event[eventKey] = otherInit[eventKey]
5758
})
58-
return event
5959
}
60+
61+
// Approximate dataTransfer on the event object
62+
// jsdom does not support DataTransfer constructor
63+
// https://github.com/testing-library/react-testing-library/issues/339#issuecomment-526310225
64+
const {dataTransfer} = eventInit
65+
if (typeof dataTransfer === 'object') {
66+
Object.assign(event, {dataTransfer})
67+
}
68+
return event
6069
}
6170

6271
fireEvent[key] = (node, init) => fireEvent(node, createEvent[key](node, init))

0 commit comments

Comments
 (0)