Skip to content

Commit 66df731

Browse files
authored
fix: second round of bugfixes for v4 (#314)
* fix: handle require without assignment properly * fix: handle another require without assignment properly * fix: update rule levels on presets - remove prefer-user-event from presets - report no-debug as error on presets * docs: indicate prefer-user-event is not enabled in any preset Closes #313
1 parent fd81fc5 commit 66df731

File tree

5 files changed

+41
-17
lines changed

5 files changed

+41
-17
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ To enable this configuration use the `extends` property in your
147147
| [testing-library/prefer-explicit-assert](docs/rules/prefer-explicit-assert.md) | Suggest using explicit assertions rather than just `getBy*` queries | | |
148148
| [testing-library/prefer-find-by](docs/rules/prefer-find-by.md) | Suggest using `findBy*` methods instead of the `waitFor` + `getBy` queries | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] | ![fixable-badge][] |
149149
| [testing-library/prefer-presence-queries](docs/rules/prefer-presence-queries.md) | Enforce specific queries when checking element is present or not | | |
150-
| [testing-library/prefer-user-event](docs/rules/prefer-user-event.md) | Suggest using `userEvent` library instead of `fireEvent` for simulating user interaction | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] | |
150+
| [testing-library/prefer-user-event](docs/rules/prefer-user-event.md) | Suggest using `userEvent` library instead of `fireEvent` for simulating user interaction | | |
151151
| [testing-library/prefer-screen-queries](docs/rules/prefer-screen-queries.md) | Suggest using screen while using queries | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] | |
152152
| [testing-library/prefer-wait-for](docs/rules/prefer-wait-for.md) | Use `waitFor` instead of deprecated wait methods | | ![fixable-badge][] |
153153
| [testing-library/render-result-naming-convention](docs/rules/render-result-naming-convention.md) | Enforce a valid naming for return value from `render` | ![angular-badge][] ![react-badge][] ![vue-badge][] | |

lib/detect-testing-library-utils.ts

+22-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
isImportSpecifier,
1818
isLiteral,
1919
isMemberExpression,
20+
isObjectPattern,
2021
isProperty,
2122
} from './node-utils';
2223
import {
@@ -582,16 +583,22 @@ export function detectTestingLibraryUtils<
582583
// it could be "import * as rtl from 'baz'"
583584
return node.specifiers.find((n) => isImportNamespaceSpecifier(n));
584585
} else {
585-
const requireNode = node.parent as TSESTree.VariableDeclarator;
586+
if (!ASTUtils.isVariableDeclarator(node.parent)) {
587+
return undefined;
588+
}
589+
const requireNode = node.parent;
586590

587591
if (ASTUtils.isIdentifier(requireNode.id)) {
588592
// this is const rtl = require('foo')
589593
return requireNode.id;
590594
}
591595

592596
// this should be const { something } = require('foo')
593-
const destructuring = requireNode.id as TSESTree.ObjectPattern;
594-
const property = destructuring.properties.find(
597+
if (!isObjectPattern(requireNode.id)) {
598+
return undefined;
599+
}
600+
601+
const property = requireNode.id.properties.find(
595602
(n) =>
596603
isProperty(n) &&
597604
ASTUtils.isIdentifier(n.key) &&
@@ -618,8 +625,18 @@ export function detectTestingLibraryUtils<
618625
return userEventIdentifier.local;
619626
}
620627
} else {
621-
const requireNode = importedUserEventLibraryNode.parent as TSESTree.VariableDeclarator;
622-
return requireNode.id as TSESTree.Identifier;
628+
if (
629+
!ASTUtils.isVariableDeclarator(importedUserEventLibraryNode.parent)
630+
) {
631+
return null;
632+
}
633+
634+
const requireNode = importedUserEventLibraryNode.parent;
635+
if (!ASTUtils.isIdentifier(requireNode.id)) {
636+
return null;
637+
}
638+
639+
return requireNode.id;
623640
}
624641

625642
return null;

lib/index.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,12 @@ const domRules = {
5858
'testing-library/no-wait-for-empty-callback': 'error',
5959
'testing-library/prefer-find-by': 'error',
6060
'testing-library/prefer-screen-queries': 'error',
61-
'testing-library/prefer-user-event': 'warn',
6261
};
6362

6463
const angularRules = {
6564
...domRules,
6665
'testing-library/no-container': 'error',
67-
'testing-library/no-debug': 'warn',
66+
'testing-library/no-debug': 'error',
6867
'testing-library/no-dom-import': ['error', 'angular'],
6968
'testing-library/no-node-access': 'error',
7069
'testing-library/render-result-naming-convention': 'error',
@@ -73,7 +72,7 @@ const angularRules = {
7372
const reactRules = {
7473
...domRules,
7574
'testing-library/no-container': 'error',
76-
'testing-library/no-debug': 'warn',
75+
'testing-library/no-debug': 'error',
7776
'testing-library/no-dom-import': ['error', 'react'],
7877
'testing-library/no-node-access': 'error',
7978
'testing-library/render-result-naming-convention': 'error',
@@ -83,7 +82,7 @@ const vueRules = {
8382
...domRules,
8483
'testing-library/await-fire-event': 'error',
8584
'testing-library/no-container': 'error',
86-
'testing-library/no-debug': 'warn',
85+
'testing-library/no-debug': 'error',
8786
'testing-library/no-dom-import': ['error', 'vue'],
8887
'testing-library/no-node-access': 'error',
8988
'testing-library/render-result-naming-convention': 'error',

tests/__snapshots__/index.test.ts.snap

+3-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Object {
1010
"testing-library/await-async-utils": "error",
1111
"testing-library/no-await-sync-query": "error",
1212
"testing-library/no-container": "error",
13-
"testing-library/no-debug": "warn",
13+
"testing-library/no-debug": "error",
1414
"testing-library/no-dom-import": Array [
1515
"error",
1616
"angular",
@@ -20,7 +20,6 @@ Object {
2020
"testing-library/no-wait-for-empty-callback": "error",
2121
"testing-library/prefer-find-by": "error",
2222
"testing-library/prefer-screen-queries": "error",
23-
"testing-library/prefer-user-event": "warn",
2423
"testing-library/render-result-naming-convention": "error",
2524
},
2625
}
@@ -39,7 +38,6 @@ Object {
3938
"testing-library/no-wait-for-empty-callback": "error",
4039
"testing-library/prefer-find-by": "error",
4140
"testing-library/prefer-screen-queries": "error",
42-
"testing-library/prefer-user-event": "warn",
4341
},
4442
}
4543
`;
@@ -54,7 +52,7 @@ Object {
5452
"testing-library/await-async-utils": "error",
5553
"testing-library/no-await-sync-query": "error",
5654
"testing-library/no-container": "error",
57-
"testing-library/no-debug": "warn",
55+
"testing-library/no-debug": "error",
5856
"testing-library/no-dom-import": Array [
5957
"error",
6058
"react",
@@ -64,7 +62,6 @@ Object {
6462
"testing-library/no-wait-for-empty-callback": "error",
6563
"testing-library/prefer-find-by": "error",
6664
"testing-library/prefer-screen-queries": "error",
67-
"testing-library/prefer-user-event": "warn",
6865
"testing-library/render-result-naming-convention": "error",
6966
},
7067
}
@@ -81,7 +78,7 @@ Object {
8178
"testing-library/await-fire-event": "error",
8279
"testing-library/no-await-sync-query": "error",
8380
"testing-library/no-container": "error",
84-
"testing-library/no-debug": "warn",
81+
"testing-library/no-debug": "error",
8582
"testing-library/no-dom-import": Array [
8683
"error",
8784
"vue",
@@ -91,7 +88,6 @@ Object {
9188
"testing-library/no-wait-for-empty-callback": "error",
9289
"testing-library/prefer-find-by": "error",
9390
"testing-library/prefer-screen-queries": "error",
94-
"testing-library/prefer-user-event": "warn",
9591
"testing-library/render-result-naming-convention": "error",
9692
},
9793
}

tests/create-testing-library-rule.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,18 @@ ruleTester.run(RULE_NAME, rule, {
311311
// Weird edge cases
312312
`(window as any).__THING = false;`,
313313
`thing.method.lastCall.args[0]();`,
314+
315+
`// edge case when setting jest-dom up in jest config file - using require
316+
require('@testing-library/jest-dom')
317+
318+
foo()
319+
`,
320+
321+
`// edge case when setting jest-dom up in jest config file - using import
322+
import '@testing-library/jest-dom'
323+
324+
foo()
325+
`,
314326
],
315327
invalid: [
316328
// Test Cases for Imports

0 commit comments

Comments
 (0)