Skip to content

Commit 9386773

Browse files
authored
refactor(no-wait-for-multiple-assertions): migrate to v4 (#301)
* test: improve errors location asserts * refactor: use new rule creator * refactor: improve error reported location * refactor: use new helpers for detection * test: add more cases * feat: detect properly if fireEvent and userEvent should be reported * test: add cases for increasing coverage up to 100% * refactor: rename rule for consistency * docs: remove duplicated no-wait-for-snapshot row * refactor: rename rule * test: improve errors location asserts * refactor: use new rule creator * refactor: use new helpers for detection * refactor: improve error reported location * test: add more cases
1 parent 15fd7c4 commit 9386773

7 files changed

+274
-186
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,11 @@ To enable this configuration use the `extends` property in your
137137
| [no-debug](docs/rules/no-debug.md) | Disallow the use of `debug` | ![angular-badge][] ![react-badge][] ![vue-badge][] | |
138138
| [no-dom-import](docs/rules/no-dom-import.md) | Disallow importing from DOM Testing Library | ![angular-badge][] ![react-badge][] ![vue-badge][] | ![fixable-badge][] |
139139
| [no-manual-cleanup](docs/rules/no-manual-cleanup.md) | Disallow the use of `cleanup` | | |
140-
| [no-multiple-assertions-wait-for](docs/rules/no-multiple-assertions-wait-for.md) | Disallow the use of multiple expect inside `waitFor` | | |
141140
| [no-node-access](docs/rules/no-node-access.md) | Disallow direct Node access | ![angular-badge][] ![react-badge][] ![vue-badge][] | |
142141
| [no-promise-in-fire-event](docs/rules/no-promise-in-fire-event.md) | Disallow the use of promises passed to a `fireEvent` method | | |
143142
| [no-render-in-setup](docs/rules/no-render-in-setup.md) | Disallow the use of `render` in setup functions | | |
144143
| [no-wait-for-empty-callback](docs/rules/no-wait-for-empty-callback.md) | Disallow empty callbacks for `waitFor` and `waitForElementToBeRemoved` | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] | |
144+
| [no-wait-for-multiple-assertions](docs/rules/no-wait-for-multiple-assertions.md) | Disallow the use of multiple expect inside `waitFor` | | |
145145
| [no-wait-for-side-effects](docs/rules/no-wait-for-side-effects.md) | Disallow the use of side effects inside `waitFor` | | |
146146
| [no-wait-for-snapshot](docs/rules/no-wait-for-snapshot.md) | Ensures no snapshot is generated inside of a `waitFor` call | | |
147147
| [prefer-explicit-assert](docs/rules/prefer-explicit-assert.md) | Suggest using explicit assertions rather than just `getBy*` queries | | |

docs/rules/no-multiple-assertions-wait-for.md renamed to docs/rules/no-wait-for-multiple-assertions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Multiple assertions inside `waitFor` are not preferred (no-multiple-assertions-wait-for)
1+
# Multiple assertions inside `waitFor` are not preferred (no-wait-for-multiple-assertions)
22

33
## Rule Details
44

lib/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import preferPresenceQueries from './rules/prefer-presence-queries';
1818
import preferScreenQueries from './rules/prefer-screen-queries';
1919
import preferUserEvent from './rules/prefer-user-event';
2020
import preferWaitFor from './rules/prefer-wait-for';
21-
import noMultipleAssertionsWaitFor from './rules/no-multiple-assertions-wait-for';
21+
import noWaitForMultipleAssertions from './rules/no-wait-for-multiple-assertions';
2222
import preferFindBy from './rules/prefer-find-by';
2323
import noWaitForSideEffects from './rules/no-wait-for-side-effects';
2424
import renderResultNamingConvention from './rules/render-result-naming-convention';
@@ -34,11 +34,11 @@ const rules = {
3434
'no-debug': noDebug,
3535
'no-dom-import': noDomImport,
3636
'no-manual-cleanup': noManualCleanup,
37-
'no-multiple-assertions-wait-for': noMultipleAssertionsWaitFor,
3837
'no-node-access': noNodeAccess,
3938
'no-promise-in-fire-event': noPromiseInFireEvent,
4039
'no-render-in-setup': noRenderInSetup,
4140
'no-wait-for-empty-callback': noWaitForEmptyCallback,
41+
'no-wait-for-multiple-assertions': noWaitForMultipleAssertions,
4242
'no-wait-for-side-effects': noWaitForSideEffects,
4343
'no-wait-for-snapshot': noWaitForSnapshot,
4444
'prefer-explicit-assert': preferExplicitAssert,

lib/rules/no-multiple-assertions-wait-for.ts

Lines changed: 0 additions & 69 deletions
This file was deleted.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { TSESTree } from '@typescript-eslint/experimental-utils';
2+
import { getPropertyIdentifierNode } from '../node-utils';
3+
import { createTestingLibraryRule } from '../create-testing-library-rule';
4+
5+
export const RULE_NAME = 'no-wait-for-multiple-assertions';
6+
export type MessageIds = 'noWaitForMultipleAssertion';
7+
type Options = [];
8+
9+
export default createTestingLibraryRule<Options, MessageIds>({
10+
name: RULE_NAME,
11+
meta: {
12+
type: 'suggestion',
13+
docs: {
14+
description: "It's preferred to avoid multiple assertions in `waitFor`",
15+
category: 'Best Practices',
16+
recommended: false,
17+
},
18+
messages: {
19+
noWaitForMultipleAssertion:
20+
'Avoid using multiple assertions within `waitFor` callback',
21+
},
22+
fixable: null,
23+
schema: [],
24+
},
25+
defaultOptions: [],
26+
create: function (context, _, helpers) {
27+
function totalExpect(body: Array<TSESTree.Node>): Array<TSESTree.Node> {
28+
return body.filter((node: TSESTree.ExpressionStatement) => {
29+
const expressionIdentifier = getPropertyIdentifierNode(node);
30+
31+
if (!expressionIdentifier) {
32+
return false;
33+
}
34+
35+
return expressionIdentifier.name === 'expect';
36+
});
37+
}
38+
39+
function reportMultipleAssertion(node: TSESTree.BlockStatement) {
40+
const callExpressionNode = node.parent.parent as TSESTree.CallExpression;
41+
const callExpressionIdentifier = getPropertyIdentifierNode(
42+
callExpressionNode
43+
);
44+
45+
if (!helpers.isAsyncUtil(callExpressionIdentifier, ['waitFor'])) {
46+
return;
47+
}
48+
49+
if (totalExpect(node.body).length <= 1) {
50+
return;
51+
}
52+
53+
context.report({
54+
node: callExpressionNode,
55+
messageId: 'noWaitForMultipleAssertion',
56+
});
57+
}
58+
59+
return {
60+
'CallExpression > ArrowFunctionExpression > BlockStatement': reportMultipleAssertion,
61+
'CallExpression > FunctionExpression > BlockStatement': reportMultipleAssertion,
62+
};
63+
},
64+
});

tests/lib/rules/no-multiple-assertions-wait-for.test.ts

Lines changed: 0 additions & 113 deletions
This file was deleted.

0 commit comments

Comments
 (0)