Skip to content

Commit a5034cc

Browse files
committed
refactor(prefer-presence-queries): use presence/absence helpers
1 parent 1c01e1d commit a5034cc

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
@@ -135,12 +135,19 @@ export function detectTestingLibraryUtils<
135135
},
136136

137137
/**
138-
* Determines whether a given node is sync query.
138+
* Determines whether a given node is sync query or not.
139139
*/
140140
isSyncQuery(node) {
141141
return this.isGetByQuery(node) || this.isQueryByQuery(node);
142142
},
143143

144+
/**
145+
* Determines whether a given MemberExpression node is a presence assert
146+
*
147+
* Presence asserts could have shape of:
148+
* - expect(element).toBeInTheDocument()
149+
* - expect(element).not.toBeNull()
150+
*/
144151
isPresenceAssert(node) {
145152
const { matcher, isNegated } = getAssertNodeInfo(node);
146153

@@ -153,6 +160,13 @@ export function detectTestingLibraryUtils<
153160
: PRESENCE_MATCHERS.includes(matcher);
154161
},
155162

163+
/**
164+
* Determines whether a given MemberExpression node is an absence assert
165+
*
166+
* Absence asserts could have shape of:
167+
* - expect(element).toBeNull()
168+
* - expect(element).not.toBeInTheDocument()
169+
*/
156170
isAbsenceAssert(node) {
157171
const { matcher, isNegated } = getAssertNodeInfo(node);
158172

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)