diff --git a/lib/rules/no-wait-for-side-effects.ts b/lib/rules/no-wait-for-side-effects.ts index 24ace87f..a6673409 100644 --- a/lib/rules/no-wait-for-side-effects.ts +++ b/lib/rules/no-wait-for-side-effects.ts @@ -120,6 +120,40 @@ export default createTestingLibraryRule({ return node.expressions.some(isRenderInAssignmentExpression); } + /** + * Checks if there are side effects in variable declarations. + * + * For example, these variable declarations have side effects: + * const a = userEvent.doubleClick(button); + * const b = fireEvent.click(button); + * const wrapper = render(); + * + * @param node + * @returns {Boolean} Boolean indicating if variable declarataion has side effects + */ + function isSideEffectInVariableDeclaration( + node: TSESTree.VariableDeclaration + ): boolean { + return node.declarations.some((declaration) => { + if (isCallExpression(declaration.init)) { + const test = getPropertyIdentifierNode(declaration.init); + + if (!test) { + return false; + } + + return ( + helpers.isFireEventUtil(test) || + helpers.isUserEventUtil(test) || + helpers.isRenderUtil(test) + ); + } + return false; + }); + + return false; + } + function getSideEffectNodes( body: TSESTree.Node[] ): TSESTree.ExpressionStatement[] { @@ -135,6 +169,13 @@ export default createTestingLibraryRule({ return true; } + if ( + isVariableDeclaration(node) && + isSideEffectInVariableDeclaration(node) + ) { + return true; + } + const expressionIdentifier = getPropertyIdentifierNode(node); if (!expressionIdentifier) { diff --git a/tests/lib/rules/no-wait-for-side-effects.test.ts b/tests/lib/rules/no-wait-for-side-effects.test.ts index 38d05047..869dfb2b 100644 --- a/tests/lib/rules/no-wait-for-side-effects.test.ts +++ b/tests/lib/rules/no-wait-for-side-effects.test.ts @@ -795,5 +795,25 @@ ruleTester.run(RULE_NAME, rule, { { line: 12, column: 13, messageId: 'noSideEffectsWaitFor' }, ], }, + // side effects (userEvent, fireEvent or render) in variable declarations + ...SUPPORTED_TESTING_FRAMEWORKS.flatMap((testingFramework) => [ + { + // Issue #368, https://github.com/testing-library/eslint-plugin-testing-library/issues/368 + code: ` + import { waitFor } from '${testingFramework}'; + import userEvent from '@testing-library/user-event' + await waitFor(() => { + const a = userEvent.click(button); + const b = fireEvent.click(button); + const wrapper = render(); + }) + `, + errors: [ + { line: 5, column: 11, messageId: 'noSideEffectsWaitFor' }, + { line: 6, column: 11, messageId: 'noSideEffectsWaitFor' }, + { line: 7, column: 11, messageId: 'noSideEffectsWaitFor' }, + ], + } as const, + ]), ], });