# Disallow the use of side effects in `waitFor` (`testing-library/no-wait-for-side-effects`)
💼 This rule is enabled in the following configs: `angular`, `dom`, `marko`, `react`, `svelte`, `vue`.
## Rule Details
This rule aims to avoid the usage of side effects actions (`fireEvent`, `userEvent` or `render`) inside `waitFor`.
Since `waitFor` is intended for things that have a non-deterministic amount of time between the action you performed and the assertion passing,
the callback can be called (or checked for errors) a non-deterministic number of times and frequency.
This will make your side-effect run multiple times.
Example of **incorrect** code for this rule:
```js
await waitFor(() => {
fireEvent.keyDown(input, { key: 'ArrowDown' });
expect(b).toEqual('b');
});
// or
await waitFor(function() {
fireEvent.keyDown(input, { key: 'ArrowDown' });
expect(b).toEqual('b');
});
// or
await waitFor(() => {
userEvent.click(button);
expect(b).toEqual('b');
});
// or
await waitFor(function() {
userEvent.click(button);
expect(b).toEqual('b');
});
// or
await waitFor(() => {
render()
expect(b).toEqual('b');
});
// or
await waitFor(function() {
render()
expect(b).toEqual('b');
});
};
```
Examples of **correct** code for this rule:
```js
fireEvent.keyDown(input, { key: 'ArrowDown' });
await waitFor(() => {
expect(b).toEqual('b');
});
// or
fireEvent.keyDown(input, { key: 'ArrowDown' });
await waitFor(function() {
expect(b).toEqual('b');
});
// or
userEvent.click(button);
await waitFor(() => {
expect(b).toEqual('b');
});
// or
userEvent.click(button);
await waitFor(function() {
expect(b).toEqual('b');
});
// or
userEvent.click(button);
waitFor(function() {
expect(b).toEqual('b');
}).then(() => {
// Outside of waitFor, e.g. inside a .then() side effects are allowed
fireEvent.click(button);
});
// or
render()
await waitFor(() => {
expect(b).toEqual('b');
});
// or
render()
await waitFor(function() {
expect(b).toEqual('b');
});
};
```
## Further Reading
- [about `waitFor`](https://testing-library.com/docs/dom-testing-library/api-async#waitfor)
- [about `userEvent`](https://github.com/testing-library/user-event)
- [about `fireEvent`](https://testing-library.com/docs/dom-testing-library/api-events)
- [inspiration for this rule](https://kentcdodds.com/blog/common-mistakes-with-react-testing-library#performing-side-effects-in-waitfor)