📝 Disallow unnecessary await for sync events.
💼 This rule is enabled in the following configs:
angular,
dom,
react.
Ensure that sync events are not awaited unnecessarily.
Methods for simulating events in Testing Library ecosystem -fireEvent and userEvent prior to v14 -
do NOT return any Promise, with an exception of
userEvent.type and userEvent.keyboard, which delays the promise resolve only if delay
option is specified.
Some examples of simulating events not returning any Promise are:
fireEvent.clickfireEvent.selectuserEvent.tab(prior touser-eventv14)userEvent.hover(prior touser-eventv14)
This rule aims to prevent users from waiting for those function calls.
⚠️ fire-eventmethods are async only on following Testing Library packages:
@testing-library/vue(supported by this plugin)@testing-library/svelte(not supported yet by this plugin)@marko/testing-library(supported by this plugin)
Examples of incorrect code for this rule:
const foo = async () => {
// ...
await fireEvent.click(button);
// ...
};
const bar = async () => {
// ...
// userEvent prior to v14
await userEvent.tab();
// ...
};
const baz = async () => {
// ...
// userEvent prior to v14
await userEvent.type(textInput, 'abc');
await userEvent.keyboard('abc');
// ...
};Examples of correct code for this rule:
const foo = () => {
// ...
fireEvent.click(button);
// ...
};
const bar = () => {
// ...
userEvent.tab();
// ...
};
const baz = async () => {
// await userEvent.type only with delay option
await userEvent.type(textInput, 'abc', { delay: 1000 });
userEvent.type(textInput, '123');
// same for userEvent.keyboard
await userEvent.keyboard(textInput, 'abc', { delay: 1000 });
userEvent.keyboard('123');
// ...
};
const qux = async () => {
// userEvent v14
await userEvent.tab();
await userEvent.click(button);
await userEvent.type(textInput, 'abc');
await userEvent.keyboard('abc');
// ...
};This rule provides the following options:
eventModules: array of strings. Defines which event module should be linted for sync event methods. The possibilities are:"fire-event"and"user-event". Defaults to["fire-event"].
module.exports = {
rules: {
'testing-library/no-await-sync-events': [
'error',
{ eventModules: ['fire-event', 'user-event'] },
],
},
};"fire-event"option: should be disabled only for those Testing Library packages where fire-event methods are async."user-event"option: should be disabled only if using v14 or greater.
There is another rule await-async-events, which is for awaiting async events for user-event v14 or fire-event only in Testing Library packages with async methods. Please do not confuse with this rule.