Skip to content

Commit 2d75bc9

Browse files
committed
refactor(prefer-presence-queries): use presence/absence helpers
1 parent f8b2b1f commit 2d75bc9

File tree

2 files changed

+27
-33
lines changed

2 files changed

+27
-33
lines changed

lib/detect-testing-library-utils.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,19 @@ export function detectTestingLibraryUtils<
128128
},
129129

130130
/**
131-
* Determines whether a given node is sync query.
131+
* Determines whether a given node is sync query or not.
132132
*/
133133
isSyncQuery(node) {
134134
return this.isGetByQuery(node) || this.isQueryByQuery(node);
135135
},
136136

137+
/**
138+
* Determines whether a given MemberExpression node is a presence assert
139+
*
140+
* Presence asserts could have shape of:
141+
* - expect(element).toBeInTheDocument()
142+
* - expect(element).not.toBeNull()
143+
*/
137144
isPresenceAssert(node) {
138145
const { matcher, isNegated } = getAssertNodeInfo(node);
139146

@@ -146,6 +153,13 @@ export function detectTestingLibraryUtils<
146153
: PRESENCE_MATCHERS.includes(matcher);
147154
},
148155

156+
/**
157+
* Determines whether a given MemberExpression node is an absence assert
158+
*
159+
* Absence asserts could have shape of:
160+
* - expect(element).toBeNull()
161+
* - expect(element).not.toBeInTheDocument()
162+
*/
149163
isAbsenceAssert(node) {
150164
const { matcher, isNegated } = getAssertNodeInfo(node);
151165

lib/rules/prefer-presence-queries.ts

+12-32
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { ASTUtils, TSESTree } from '@typescript-eslint/experimental-utils';
2-
import { ABSENCE_MATCHERS, PRESENCE_MATCHERS } from '../utils';
1+
import { TSESTree } from '@typescript-eslint/experimental-utils';
32
import { findClosestCallNode, isMemberExpression } from '../node-utils';
43
import { createTestingLibraryRule } from '../create-testing-library-rule';
54

@@ -37,46 +36,27 @@ export default createTestingLibraryRule<Options, MessageIds>({
3736
return;
3837
}
3938

39+
// Sync queries (getBy and queryBy) are corresponding ones used
40+
// to check presence or absence. If none found, stop the rule.
4041
if (!helpers.isSyncQuery(node)) {
4142
return;
4243
}
4344

4445
const isPresenceQuery = helpers.isGetByQuery(node);
4546
const expectStatement = expectCallNode.parent;
46-
let matcher =
47-
ASTUtils.isIdentifier(expectStatement.property) &&
48-
expectStatement.property.name;
49-
let isNegatedMatcher = false;
47+
const isPresenceAssert = helpers.isPresenceAssert(expectStatement);
48+
const isAbsenceAssert = helpers.isAbsenceAssert(expectStatement);
5049

51-
if (
52-
matcher === 'not' &&
53-
isMemberExpression(expectStatement.parent) &&
54-
ASTUtils.isIdentifier(expectStatement.parent.property)
55-
) {
56-
isNegatedMatcher = true;
57-
matcher = expectStatement.parent.property.name;
50+
if (!isPresenceAssert && !isAbsenceAssert) {
51+
return;
5852
}
5953

60-
const validMatchers = isPresenceQuery
61-
? PRESENCE_MATCHERS
62-
: ABSENCE_MATCHERS;
63-
64-
const invalidMatchers = isPresenceQuery
65-
? ABSENCE_MATCHERS
66-
: PRESENCE_MATCHERS;
67-
68-
const messageId = isPresenceQuery
69-
? 'wrongAbsenceQuery'
70-
: 'wrongPresenceQuery';
54+
if (isPresenceAssert && !isPresenceQuery) {
55+
return context.report({ node, messageId: 'wrongPresenceQuery' });
56+
}
7157

72-
if (
73-
(!isNegatedMatcher && invalidMatchers.includes(matcher)) ||
74-
(isNegatedMatcher && validMatchers.includes(matcher))
75-
) {
76-
context.report({
77-
node,
78-
messageId,
79-
});
58+
if (isAbsenceAssert && isPresenceQuery) {
59+
return context.report({ node, messageId: 'wrongAbsenceQuery' });
8060
}
8161
},
8262
};

0 commit comments

Comments
 (0)