Skip to content

Commit b510bd4

Browse files
authored
Merge pull request #471 from testing-library/alpha
v5.0.0
2 parents 1fa31d9 + ffe5cfe commit b510bd4

40 files changed

+167
-119
lines changed

.github/workflows/pipeline.yml

+7-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
- name: Use Node
3030
uses: actions/setup-node@v2
3131
with:
32-
node-version: 14
32+
node-version: 16
3333

3434
- name: Install dependencies
3535
uses: bahmutov/npm-install@v1
@@ -51,8 +51,8 @@ jobs:
5151

5252
strategy:
5353
matrix:
54-
node: [10.12, 10, '12.0', 12, 14, 16]
55-
eslint: [7.5, 7]
54+
node: [12.22.0, 12, 14.17.0, 14, '16.0', 16]
55+
eslint: [7.5, 7, 8]
5656

5757
steps:
5858
- name: Cancel Previous Runs
@@ -72,7 +72,9 @@ jobs:
7272
useLockFile: false
7373

7474
- name: Install ESLint v${{ matrix.eslint }}
75-
run: npm install --no-save eslint@${{ matrix.eslint }}
75+
# force installation for now until we get ESLint and all plugins updated
76+
# in dev dependencies
77+
run: npm install --no-save --force eslint@${{ matrix.eslint }}
7678

7779
- name: Run tests
7880
run: npm run test:ci
@@ -96,7 +98,7 @@ jobs:
9698
- name: Use Node
9799
uses: actions/setup-node@v2
98100
with:
99-
node-version: 14
101+
node-version: 16
100102

101103
- name: Install dependencies
102104
uses: bahmutov/npm-install@v1

CONTRIBUTING.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ If you ever need to update a snapshot, you can run `npm run test:update`
4444
4545
Based on [ESLint's Rule Naming Conventions](https://eslint.org/docs/developer-guide/working-with-rules#rule-naming-conventions), you must follow these rules:
4646
47-
- If your rule is disallowing something, prefix it with `no-` such as `no-debug`
47+
- If your rule is disallowing something, prefix it with `no-` such as `no-debugging-utils`
4848
for disallowing `debug()`.
4949
- If your rule is suggesting to prefer a way of doing something, among other ways, you can **optionally** prefix it with
5050
`prefer-`. For example, `prefer-screen-queries` suggests to use `screen.getByText()` from imported `screen` rather
@@ -57,11 +57,11 @@ Based on [ESLint's Rule Naming Conventions](https://eslint.org/docs/developer-gu
5757
## Adding new rules
5858
5959
In the [same way as ESLint](https://eslint.org/docs/developer-guide/working-with-rules),
60-
each rule has three files named with its identifier (e.g. `no-debug`):
60+
each rule has three files named with its identifier (e.g. `no-debugging-utils`):
6161
62-
- in the `lib/rules` directory: a source file (e.g. `no-debug.ts`)
63-
- in the `tests/lib/rules` directory: a test file (e.g. `no-debug.ts`)
64-
- in the `docs/rules` directory: a Markdown documentation file (e.g. `no-debug.md`)
62+
- in the `lib/rules` directory: a source file (e.g. `no-debugging-utils.ts`)
63+
- in the `tests/lib/rules` directory: a test file (e.g. `no-debugging-utils.ts`)
64+
- in the `docs/rules` directory: a Markdown documentation file (e.g. `no-debugging-utils.md`)
6565
6666
Additionally, you need to do a couple of extra things:
6767

README.md

+10-9
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ $ yarn add --dev eslint-plugin-testing-library
5050
You can find detailed guides for migrating `eslint-plugin-testing-library` in the [migration guide docs](docs/migration-guides):
5151

5252
- [Migrate guide for v4](docs/migration-guides/v4.md)
53+
- [Migrate guide for v5](docs/migration-guides/v5.md)
5354

5455
## Usage
5556

@@ -68,7 +69,7 @@ Then configure the rules you want to use within `rules` property of your `.eslin
6869
"rules": {
6970
"testing-library/await-async-query": "error",
7071
"testing-library/no-await-sync-query": "error",
71-
"testing-library/no-debug": "warn",
72+
"testing-library/no-debugging-utils": "warn",
7273
"testing-library/no-dom-import": "off"
7374
}
7475
}
@@ -195,21 +196,21 @@ To enable this configuration use the `extends` property in your
195196
| [`testing-library/no-await-sync-events`](./docs/rules/no-await-sync-events.md) | Disallow unnecessary `await` for sync events | | |
196197
| [`testing-library/no-await-sync-query`](./docs/rules/no-await-sync-query.md) | Disallow unnecessary `await` for sync queries | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
197198
| [`testing-library/no-container`](./docs/rules/no-container.md) | Disallow the use of `container` methods | | ![angular-badge][] ![react-badge][] ![vue-badge][] |
198-
| [`testing-library/no-debug`](./docs/rules/no-debug.md) | Disallow the use of debugging utilities like `debug` | | ![angular-badge][] ![react-badge][] ![vue-badge][] |
199+
| [`testing-library/no-debugging-utils`](./docs/rules/no-debugging-utils.md) | Disallow the use of debugging utilities like `debug` | | ![angular-badge][] ![react-badge][] ![vue-badge][] |
199200
| [`testing-library/no-dom-import`](./docs/rules/no-dom-import.md) | Disallow importing from DOM Testing Library | 🔧 | ![angular-badge][] ![react-badge][] ![vue-badge][] |
200201
| [`testing-library/no-manual-cleanup`](./docs/rules/no-manual-cleanup.md) | Disallow the use of `cleanup` | | |
201202
| [`testing-library/no-node-access`](./docs/rules/no-node-access.md) | Disallow direct Node access | | ![angular-badge][] ![react-badge][] ![vue-badge][] |
202203
| [`testing-library/no-promise-in-fire-event`](./docs/rules/no-promise-in-fire-event.md) | Disallow the use of promises passed to a `fireEvent` method | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
203-
| [`testing-library/no-render-in-setup`](./docs/rules/no-render-in-setup.md) | Disallow the use of `render` in testing frameworks setup functions | | |
204-
| [`testing-library/no-unnecessary-act`](./docs/rules/no-unnecessary-act.md) | Disallow wrapping Testing Library utils or empty callbacks in `act` | | |
204+
| [`testing-library/no-render-in-setup`](./docs/rules/no-render-in-setup.md) | Disallow the use of `render` in testing frameworks setup functions | | ![angular-badge][] ![react-badge][] ![vue-badge][] |
205+
| [`testing-library/no-unnecessary-act`](./docs/rules/no-unnecessary-act.md) | Disallow wrapping Testing Library utils or empty callbacks in `act` | | ![react-badge][] |
205206
| [`testing-library/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][] |
206-
| [`testing-library/no-wait-for-multiple-assertions`](./docs/rules/no-wait-for-multiple-assertions.md) | Disallow the use of multiple `expect` calls inside `waitFor` | | |
207-
| [`testing-library/no-wait-for-side-effects`](./docs/rules/no-wait-for-side-effects.md) | Disallow the use of side effects in `waitFor` | | |
208-
| [`testing-library/no-wait-for-snapshot`](./docs/rules/no-wait-for-snapshot.md) | Ensures no snapshot is generated inside of a `waitFor` call | | |
207+
| [`testing-library/no-wait-for-multiple-assertions`](./docs/rules/no-wait-for-multiple-assertions.md) | Disallow the use of multiple `expect` calls inside `waitFor` | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
208+
| [`testing-library/no-wait-for-side-effects`](./docs/rules/no-wait-for-side-effects.md) | Disallow the use of side effects in `waitFor` | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
209+
| [`testing-library/no-wait-for-snapshot`](./docs/rules/no-wait-for-snapshot.md) | Ensures no snapshot is generated inside of a `waitFor` call | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
209210
| [`testing-library/prefer-explicit-assert`](./docs/rules/prefer-explicit-assert.md) | Suggest using explicit assertions rather than standalone queries | | |
210211
| [`testing-library/prefer-find-by`](./docs/rules/prefer-find-by.md) | Suggest using `find(All)By*` query instead of `waitFor` + `get(All)By*` to wait for elements | 🔧 | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
211-
| [`testing-library/prefer-presence-queries`](./docs/rules/prefer-presence-queries.md) | Ensure appropriate `get*`/`query*` queries are used with their respective matchers | | |
212-
| [`testing-library/prefer-query-by-disappearance`](./docs/rules/prefer-query-by-disappearance.md) | Suggest using `queryBy*` queries when waiting for disappearance | | |
212+
| [`testing-library/prefer-presence-queries`](./docs/rules/prefer-presence-queries.md) | Ensure appropriate `get*`/`query*` queries are used with their respective matchers | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
213+
| [`testing-library/prefer-query-by-disappearance`](./docs/rules/prefer-query-by-disappearance.md) | Suggest using `queryBy*` queries when waiting for disappearance | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
213214
| [`testing-library/prefer-screen-queries`](./docs/rules/prefer-screen-queries.md) | Suggest using `screen` while querying | | ![dom-badge][] ![angular-badge][] ![react-badge][] ![vue-badge][] |
214215
| [`testing-library/prefer-user-event`](./docs/rules/prefer-user-event.md) | Suggest using `userEvent` over `fireEvent` for simulating user interactions | | |
215216
| [`testing-library/prefer-wait-for`](./docs/rules/prefer-wait-for.md) | Use `waitFor` instead of deprecated wait methods | 🔧 | |

docs/migration-guides/v5.md

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Guide: migrating to v5
2+
3+
Assuming you are already in v4, migrating to v5 will be easy. If you are not in v4 yet, we recommend you to follow [the proper guide to migrate to it](docs/migration-guides/v4.md).
4+
5+
## Overview
6+
7+
- Support for ESLint v8
8+
- Drop support for Node v10. Required node version is now `^12.22.0 || ^14.17.0 || >=16.0.0`. Node v10 was EOL'd in April 2021, and ESLint v8 dropped support for it too.
9+
- Update dependencies
10+
- `no-debug` is now called `no-debugging-utils`
11+
- `no-render-in-setup` is now enabled by default in the Angular, React & Vue configs
12+
- `no-unnecessary-act`'s `isStrict` option is now `true` by default
13+
- `no-unnecessary-act` is now enabled by default in the React config
14+
- `no-wait-for-multiple-assertions` is now enabled by default in all configs
15+
- `no-wait-for-side-effects` is now enabled by default in all configs
16+
- `no-wait-for-snapshot` is now enabled by default in all configs
17+
- `prefer-presence-queries` is now enabled by default in all configs
18+
- `prefer-query-by-disappearance` is now enabled by default in all configs
19+
20+
## Steps to upgrade
21+
22+
- `eslint-plugin-testing-library` supports both ESLint v7 and v8, so you are fine with either version
23+
- Making sure you are using a compatible Node version (`^12.22.0 || ^14.17.0 || >=16.0.0`), and update it if it's not the case
24+
- Renaming `testing-library/no-debug` to `testing-library/no-debugging-utils` if you were referencing it manually somewhere
25+
- Being aware of new rules enabled in Shared Configs which can lead to new reported errors

docs/rules/no-debug.md renamed to docs/rules/no-debugging-utils.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Disallow the use of debugging utilities like `debug` (`testing-library/no-debug`)
1+
# Disallow the use of debugging utilities (`testing-library/no-debugging-utils`)
22

33
Just like `console.log` statements pollutes the browser's output, debug statements also pollutes the tests if one of your teammates forgot to remove it. `debug` statements should be used when you actually want to debug your tests but should not be pushed to the codebase.
44

@@ -41,7 +41,7 @@ You can control which debugging utils are checked for with the `utilsToCheckFor`
4141

4242
```json
4343
{
44-
"testing-library/no-debug": [
44+
"testing-library/no-debugging-utils": [
4545
"error",
4646
{
4747
"utilsToCheckFor": {

lib/configs/angular.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,18 @@ export = {
99
'testing-library/await-async-utils': 'error',
1010
'testing-library/no-await-sync-query': 'error',
1111
'testing-library/no-container': 'error',
12-
'testing-library/no-debug': 'error',
12+
'testing-library/no-debugging-utils': 'error',
1313
'testing-library/no-dom-import': ['error', 'angular'],
1414
'testing-library/no-node-access': 'error',
1515
'testing-library/no-promise-in-fire-event': 'error',
16+
'testing-library/no-render-in-setup': 'error',
1617
'testing-library/no-wait-for-empty-callback': 'error',
18+
'testing-library/no-wait-for-multiple-assertions': 'error',
19+
'testing-library/no-wait-for-side-effects': 'error',
20+
'testing-library/no-wait-for-snapshot': 'error',
1721
'testing-library/prefer-find-by': 'error',
22+
'testing-library/prefer-presence-queries': 'error',
23+
'testing-library/prefer-query-by-disappearance': 'error',
1824
'testing-library/prefer-screen-queries': 'error',
1925
'testing-library/render-result-naming-convention': 'error',
2026
},

lib/configs/dom.ts

+5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ export = {
1010
'testing-library/no-await-sync-query': 'error',
1111
'testing-library/no-promise-in-fire-event': 'error',
1212
'testing-library/no-wait-for-empty-callback': 'error',
13+
'testing-library/no-wait-for-multiple-assertions': 'error',
14+
'testing-library/no-wait-for-side-effects': 'error',
15+
'testing-library/no-wait-for-snapshot': 'error',
1316
'testing-library/prefer-find-by': 'error',
17+
'testing-library/prefer-presence-queries': 'error',
18+
'testing-library/prefer-query-by-disappearance': 'error',
1419
'testing-library/prefer-screen-queries': 'error',
1520
},
1621
};

lib/configs/react.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,19 @@ export = {
99
'testing-library/await-async-utils': 'error',
1010
'testing-library/no-await-sync-query': 'error',
1111
'testing-library/no-container': 'error',
12-
'testing-library/no-debug': 'error',
12+
'testing-library/no-debugging-utils': 'error',
1313
'testing-library/no-dom-import': ['error', 'react'],
1414
'testing-library/no-node-access': 'error',
1515
'testing-library/no-promise-in-fire-event': 'error',
16+
'testing-library/no-render-in-setup': 'error',
17+
'testing-library/no-unnecessary-act': 'error',
1618
'testing-library/no-wait-for-empty-callback': 'error',
19+
'testing-library/no-wait-for-multiple-assertions': 'error',
20+
'testing-library/no-wait-for-side-effects': 'error',
21+
'testing-library/no-wait-for-snapshot': 'error',
1722
'testing-library/prefer-find-by': 'error',
23+
'testing-library/prefer-presence-queries': 'error',
24+
'testing-library/prefer-query-by-disappearance': 'error',
1825
'testing-library/prefer-screen-queries': 'error',
1926
'testing-library/render-result-naming-convention': 'error',
2027
},

lib/configs/vue.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ export = {
1010
'testing-library/await-fire-event': 'error',
1111
'testing-library/no-await-sync-query': 'error',
1212
'testing-library/no-container': 'error',
13-
'testing-library/no-debug': 'error',
13+
'testing-library/no-debugging-utils': 'error',
1414
'testing-library/no-dom-import': ['error', 'vue'],
1515
'testing-library/no-node-access': 'error',
1616
'testing-library/no-promise-in-fire-event': 'error',
17+
'testing-library/no-render-in-setup': 'error',
1718
'testing-library/no-wait-for-empty-callback': 'error',
19+
'testing-library/no-wait-for-multiple-assertions': 'error',
20+
'testing-library/no-wait-for-side-effects': 'error',
21+
'testing-library/no-wait-for-snapshot': 'error',
1822
'testing-library/prefer-find-by': 'error',
23+
'testing-library/prefer-presence-queries': 'error',
24+
'testing-library/prefer-query-by-disappearance': 'error',
1925
'testing-library/prefer-screen-queries': 'error',
2026
'testing-library/render-result-naming-convention': 'error',
2127
},

lib/rules/await-async-query.ts

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
2020
type: 'problem',
2121
docs: {
2222
description: 'Enforce promises from async queries to be handled',
23-
category: 'Best Practices',
2423
recommendedConfig: {
2524
dom: 'error',
2625
angular: 'error',

lib/rules/await-async-utils.ts

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
1919
type: 'problem',
2020
docs: {
2121
description: 'Enforce promises from async utils to be awaited properly',
22-
category: 'Best Practices',
2322
recommendedConfig: {
2423
dom: 'error',
2524
angular: 'error',

lib/rules/await-fire-event.ts

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
1919
type: 'problem',
2020
docs: {
2121
description: 'Enforce promises from `fireEvent` methods to be handled',
22-
category: 'Best Practices',
2322
recommendedConfig: {
2423
dom: false,
2524
angular: false,

lib/rules/consistent-data-testid.ts

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
1818
type: 'suggestion',
1919
docs: {
2020
description: 'Ensures consistent usage of `data-testid`',
21-
category: 'Best Practices',
2221
recommendedConfig: {
2322
dom: false,
2423
angular: false,

lib/rules/no-await-sync-events.ts

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
2121
type: 'problem',
2222
docs: {
2323
description: 'Disallow unnecessary `await` for sync events',
24-
category: 'Best Practices',
2524
recommendedConfig: {
2625
dom: false,
2726
angular: false,

lib/rules/no-await-sync-query.ts

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
1313
type: 'problem',
1414
docs: {
1515
description: 'Disallow unnecessary `await` for sync queries',
16-
category: 'Best Practices',
1716
recommendedConfig: {
1817
dom: 'error',
1918
angular: 'error',

lib/rules/no-container.ts

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
2020
type: 'problem',
2121
docs: {
2222
description: 'Disallow the use of `container` methods',
23-
category: 'Best Practices',
2423
recommendedConfig: {
2524
dom: false,
2625
angular: 'error',

lib/rules/no-debug.ts renamed to lib/rules/no-debugging-utils.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type DebugUtilsToCheckFor = Partial<
2121
Record<typeof DEBUG_UTILS[number], boolean>
2222
>;
2323

24-
export const RULE_NAME = 'no-debug';
24+
export const RULE_NAME = 'no-debugging-utils';
2525
export type MessageIds = 'noDebug';
2626
type Options = [{ utilsToCheckFor?: DebugUtilsToCheckFor }];
2727

@@ -31,7 +31,6 @@ export default createTestingLibraryRule<Options, MessageIds>({
3131
type: 'problem',
3232
docs: {
3333
description: 'Disallow the use of debugging utilities like `debug`',
34-
category: 'Best Practices',
3534
recommendedConfig: {
3635
dom: false,
3736
angular: 'error',

0 commit comments

Comments
 (0)