Skip to content

Commit cd4f554

Browse files
committed
feat(config): add new eventWrapper config for wrapping fireEvent
This is intended for supporting `act` in React, but should be useful for other frameworks (I think it could help with triggering change detection for angular for example). Ref: testing-library/user-event#188, testing-library/user-event#255, https://github.com/testing-library/user-event/issues/277
1 parent 9c0bff6 commit cd4f554

File tree

4 files changed

+49
-11
lines changed

4 files changed

+49
-11
lines changed

src/__tests__/event-wrapper.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import {configure, fireEvent} from '..'
2+
3+
let originalConfig
4+
5+
beforeEach(() => {
6+
configure(oldConfig => {
7+
originalConfig = oldConfig
8+
return null
9+
})
10+
})
11+
12+
afterEach(() => {
13+
jest.clearAllMocks()
14+
configure(originalConfig)
15+
})
16+
17+
test('fireEvent calls the eventWrapper', () => {
18+
const mockEventWrapper = jest.fn()
19+
configure(() => {
20+
return {eventWrapper: mockEventWrapper}
21+
})
22+
const el = document.createElement('div')
23+
fireEvent.click(el)
24+
expect(mockEventWrapper).toHaveBeenCalledWith(expect.any(Function))
25+
expect(mockEventWrapper).toHaveBeenCalledTimes(1)
26+
})
27+
28+
test('fireEvent has a default eventWrapper', () => {
29+
const el = document.createElement('div')
30+
expect(() => fireEvent.click(el)).not.toThrow()
31+
})

src/config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ let config = {
1414
// react-testing-library to use. For that reason, this feature will remain
1515
// undocumented.
1616
asyncWrapper: cb => cb(),
17+
eventWrapper: cb => cb(),
1718
// default value for the `hidden` option in `ByRole` queries
1819
defaultHidden: false,
1920
// showOriginalStackTrace flag to show the full error stack traces for async errors

src/events.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1+
import {getConfig} from './config'
12
import {getWindowFromNode} from './helpers'
23
import {eventMap, eventAliasMap} from './event-map'
34

45
function fireEvent(element, event) {
5-
if (!event) {
6-
throw new Error(`Unable to fire an event - please provide an event object.`)
7-
}
8-
if (!element) {
9-
throw new Error(
10-
`Unable to fire a "${event.type}" event - please provide a DOM element.`,
11-
)
12-
}
13-
return element.dispatchEvent(event)
6+
return getConfig().eventWrapper(() => {
7+
if (!event) {
8+
throw new Error(
9+
`Unable to fire an event - please provide an event object.`,
10+
)
11+
}
12+
if (!element) {
13+
throw new Error(
14+
`Unable to fire a "${event.type}" event - please provide a DOM element.`,
15+
)
16+
}
17+
return element.dispatchEvent(event)
18+
})
1419
}
1520

1621
const createEvent = {}
@@ -64,11 +69,11 @@ Object.keys(eventMap).forEach(key => {
6469
/* istanbul ignore if */
6570
if (typeof window.DataTransfer === 'function') {
6671
Object.defineProperty(event, 'dataTransfer', {
67-
value: Object.assign(new window.DataTransfer(), dataTransfer)
72+
value: Object.assign(new window.DataTransfer(), dataTransfer),
6873
})
6974
} else {
7075
Object.defineProperty(event, 'dataTransfer', {
71-
value: dataTransfer
76+
value: dataTransfer,
7277
})
7378
}
7479
}

types/config.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export interface Config {
22
testIdAttribute: string;
33
asyncWrapper(cb: (...args: any[]) => any): Promise<any>;
4+
eventWrapper(cb: (...args: any[]) => any): void;
45
asyncUtilTimeout: number;
56
defaultHidden: boolean;
67
throwSuggestions: boolean;

0 commit comments

Comments
 (0)