Skip to content

Commit 31f476b

Browse files
Esemesekthymikee
authored andcommitted
feat: support multiple params in event handlers (#203)
1 parent db485a4 commit 31f476b

File tree

5 files changed

+33
-16
lines changed

5 files changed

+33
-16
lines changed

docs/API.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ Get the rendered component JSON representation, e.g. for snapshot testing.
118118
## `fireEvent`
119119

120120
```ts
121-
fireEvent(element: ReactTestInstance, eventName: string, data?: *): void
121+
fireEvent(element: ReactTestInstance, eventName: string, ...data: Array<any>): void
122122
```
123123

124124
Fires native-like event with data.
@@ -161,7 +161,7 @@ fireEvent(getByPlaceholder('my placeholder'), 'blur');
161161
## `fireEvent[eventName]`
162162

163163
```ts
164-
fireEvent[eventName](element: ReactTestInstance, data?: *): void
164+
fireEvent[eventName](element: ReactTestInstance, ...data: Array<any>): void
165165
```
166166

167167
Convenience methods for common events like: `press`, `changeText`, `scroll`.
@@ -187,7 +187,7 @@ const { getByTestId } = render(
187187
fireEvent.press(getByTestId('button'));
188188
```
189189

190-
### `fireEvent.changeText: (element: ReactTestInstance, data?: *) => void`
190+
### `fireEvent.changeText: (element: ReactTestInstance, ...data: Array<any>) => void`
191191

192192
Invokes `changeText` event handler on the element or parent element in the tree.
193193

@@ -207,7 +207,7 @@ const { getByTestId } = render(
207207
fireEvent.changeText(getByTestId('text-input'), CHANGE_TEXT);
208208
```
209209

210-
### `fireEvent.scroll: (element: ReactTestInstance, data?: *) => void`
210+
### `fireEvent.scroll: (element: ReactTestInstance, ...data: Array<any>) => void`
211211

212212
Invokes `scroll` event handler on the element or parent element in the tree.
213213

src/__tests__/fireEvent.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,15 @@ test('custom component with custom event name', () => {
148148

149149
expect(handlePress).toHaveBeenCalled();
150150
});
151+
152+
test('event with multiple handler parameters', () => {
153+
const handlePress = jest.fn();
154+
155+
const { getByTestId } = render(
156+
<CustomEventComponentWithCustomName handlePress={handlePress} />
157+
);
158+
159+
fireEvent(getByTestId('my-custom-button'), 'handlePress', 'param1', 'param2');
160+
161+
expect(handlePress).toHaveBeenCalledWith('param1', 'param2');
162+
});

src/fireEvent.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ const findEventHandler = (
2929
const invokeEvent = (
3030
element: ReactTestInstance,
3131
eventName: string,
32-
data?: any,
33-
callsite?: any
32+
callsite?: any,
33+
...data: Array<any>
3434
) => {
3535
const handler = findEventHandler(element, eventName, callsite);
3636

@@ -41,7 +41,7 @@ const invokeEvent = (
4141
let returnValue;
4242

4343
act(() => {
44-
returnValue = handler(data);
44+
returnValue = handler(...data);
4545
});
4646

4747
return returnValue;
@@ -51,13 +51,17 @@ const toEventHandlerName = (eventName: string) =>
5151
`on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;
5252

5353
const pressHandler = (element: ReactTestInstance) =>
54-
invokeEvent(element, 'press', undefined, pressHandler);
55-
const changeTextHandler = (element: ReactTestInstance, data?: *) =>
56-
invokeEvent(element, 'changeText', data, changeTextHandler);
57-
const scrollHandler = (element: ReactTestInstance, data?: *) =>
58-
invokeEvent(element, 'scroll', data, scrollHandler);
54+
invokeEvent(element, 'press', pressHandler);
55+
const changeTextHandler = (element: ReactTestInstance, ...data: Array<any>) =>
56+
invokeEvent(element, 'changeText', changeTextHandler, ...data);
57+
const scrollHandler = (element: ReactTestInstance, ...data: Array<any>) =>
58+
invokeEvent(element, 'scroll', scrollHandler, ...data);
5959

60-
const fireEvent = invokeEvent;
60+
const fireEvent = (
61+
element: ReactTestInstance,
62+
eventName: string,
63+
...data: Array<any>
64+
) => invokeEvent(element, eventName, fireEvent, ...data);
6165

6266
fireEvent.press = pressHandler;
6367
fireEvent.changeText = changeTextHandler;

typings/__tests__/index.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ tree.unmount();
174174
// fireEvent API tests
175175
fireEvent(getByNameString, 'press');
176176
fireEvent(getByNameString, 'press', 'data');
177+
fireEvent(getByNameString, 'press', 'param1', 'param2');
177178
fireEvent.press(getByNameString);
178179
fireEvent.changeText(getByNameString, 'string');
179180
fireEvent.scroll(getByNameString, 'eventData');

typings/index.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,13 @@ export interface RenderAPI extends GetByAPI, QueryByAPI, A11yAPI {
9797
export type FireEventFunction = (
9898
element: ReactTestInstance,
9999
eventName: string,
100-
data?: any
100+
...data: Array<any>
101101
) => any;
102102

103103
export type FireEventAPI = FireEventFunction & {
104104
press: (element: ReactTestInstance) => any;
105-
changeText: (element: ReactTestInstance, data?: any) => any;
106-
scroll: (element: ReactTestInstance, data?: any) => any;
105+
changeText: (element: ReactTestInstance, ...data: Array<any>) => any;
106+
scroll: (element: ReactTestInstance, ...data: Array<any>) => any;
107107
};
108108

109109
export type WaitForElementFunction = <T = any>(

0 commit comments

Comments
 (0)