Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add jest lint rules #29760

Merged
merged 1 commit into from
Jun 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 39 additions & 6 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const WARNING = 1;
const ERROR = 2;

module.exports = {
extends: ['prettier'],
extends: ['prettier', 'plugin:jest/recommended'],

// Stop ESLint from looking for a configuration file in parent folders
root: true,
Expand Down Expand Up @@ -376,16 +376,49 @@ module.exports = {
files: ['**/__tests__/*.js'],
rules: {
// https://github.com/jest-community/eslint-plugin-jest
'jest/no-focused-tests': ERROR,
'jest/valid-expect': ERROR,
'jest/valid-expect-in-promise': ERROR,
// Meh, who cares.
'jest/consistent-test-it': OFF,
// Meh, we have a lot of these, who cares.
'jest/no-alias-methods': OFF,
// We do conditions based on feature flags.
'jest/no-conditional-expect': OFF,
// We have our own assertion helpers.
'jest/expect-expect': OFF,
// Lame rule that fires in itRender helpers or in render methods.
'jest/no-standalone-expect': OFF,
},
},
{
// disable no focused tests for test setup helper files even if they are inside __tests__ directory
files: ['**/setupTests.js'],
// Rules specific to test setup helper files.
files: [
'**/setupTests.js',
'**/setupEnv.js',
'**/jest/TestFlags.js',
'**/dom-event-testing-library/testHelpers.js',
'**/utils/ReactDOMServerIntegrationTestUtils.js',
'**/babel/transform-react-version-pragma.js',
'**/babel/transform-test-gate-pragma.js',
],
rules: {
// Some helpers intentionally focus tests.
'jest/no-focused-tests': OFF,
// Test fn helpers don't use static text names.
'jest/valid-title': OFF,
// We have our own assertion helpers.
'jest/expect-expect': OFF,
// Some helpers intentionally disable tests.
'jest/no-disabled-tests': OFF,
// Helpers export text function helpers.
'jest/no-export': OFF,
// The examples in comments trigger false errors.
'jest/no-commented-out-tests': OFF,
},
},
{
files: ['**/jest/TestFlags.js'],
rules: {
// The examples in comments trigger false errors.
'jest/no-commented-out-tests': OFF,
},
},
{
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
"eslint-plugin-babel": "^5.3.0",
"eslint-plugin-eslint-plugin": "^3.5.3",
"eslint-plugin-ft-flow": "^2.0.3",
"eslint-plugin-jest": "^22.15.0",
"eslint-plugin-jest": "28.4.0",
"eslint-plugin-no-for-of-loops": "^1.0.0",
"eslint-plugin-no-function-declare-after-return": "^1.0.0",
"eslint-plugin-react": "^6.7.1",
Expand Down
30 changes: 15 additions & 15 deletions packages/dom-event-testing-library/__tests__/index-test.internal.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ describe('createEventTarget', () => {
resetActivePointers();
});

test('returns expected API', () => {
it('returns expected API', () => {
const target = createEventTarget(node);
expect(target.node).toEqual(node);
expect(Object.keys(target)).toMatchInlineSnapshot(`
Expand Down Expand Up @@ -77,15 +77,15 @@ describe('createEventTarget', () => {
*/

describe('.blur()', () => {
test('default', () => {
it('default', () => {
const target = createEventTarget(node);
node.addEventListener('blur', e => {
expect(e.relatedTarget).toMatchInlineSnapshot(`null`);
});
target.blur();
});

test('custom payload', () => {
it('custom payload', () => {
const target = createEventTarget(node);
node.addEventListener('blur', e => {
expect(e.relatedTarget).toMatchInlineSnapshot(`null`);
Expand All @@ -95,7 +95,7 @@ describe('createEventTarget', () => {
});

describe('.click()', () => {
test('default', () => {
it('default', () => {
const target = createEventTarget(node);
node.addEventListener('click', e => {
expect(e.altKey).toEqual(false);
Expand All @@ -122,7 +122,7 @@ describe('createEventTarget', () => {
target.click();
});

test('custom payload', () => {
it('custom payload', () => {
const target = createEventTarget(node);
node.addEventListener('click', e => {
expect(e.altKey).toEqual(true);
Expand Down Expand Up @@ -162,15 +162,15 @@ describe('createEventTarget', () => {
});

describe('.focus()', () => {
test('default', () => {
it('default', () => {
const target = createEventTarget(node);
node.addEventListener('focus', e => {
expect(e.relatedTarget).toMatchInlineSnapshot(`null`);
});
target.blur();
});

test('custom payload', () => {
it('custom payload', () => {
const target = createEventTarget(node);
node.addEventListener('focus', e => {
expect(e.relatedTarget).toMatchInlineSnapshot(`null`);
Expand All @@ -180,7 +180,7 @@ describe('createEventTarget', () => {
});

describe('.keydown()', () => {
test('default', () => {
it('default', () => {
const target = createEventTarget(node);
node.addEventListener('keydown', e => {
expect(e.altKey).toEqual(false);
Expand All @@ -195,7 +195,7 @@ describe('createEventTarget', () => {
target.keydown();
});

test('custom payload', () => {
it('custom payload', () => {
const target = createEventTarget(node);
node.addEventListener('keydown', e => {
expect(e.altKey).toEqual(true);
Expand All @@ -217,7 +217,7 @@ describe('createEventTarget', () => {
});

describe('.keyup()', () => {
test('default', () => {
it('default', () => {
const target = createEventTarget(node);
node.addEventListener('keyup', e => {
expect(e.altKey).toEqual(false);
Expand All @@ -232,7 +232,7 @@ describe('createEventTarget', () => {
target.keydown();
});

test('custom payload', () => {
it('custom payload', () => {
const target = createEventTarget(node);
node.addEventListener('keyup', e => {
expect(e.altKey).toEqual(true);
Expand All @@ -254,7 +254,7 @@ describe('createEventTarget', () => {
});

describe('.scroll()', () => {
test('default', () => {
it('default', () => {
const target = createEventTarget(node);
node.addEventListener('scroll', e => {
expect(e.type).toEqual('scroll');
Expand All @@ -264,7 +264,7 @@ describe('createEventTarget', () => {
});

describe('.virtualclick()', () => {
test('default', () => {
it('default', () => {
const target = createEventTarget(node);
node.addEventListener('click', e => {
expect(e.altKey).toEqual(false);
Expand All @@ -291,7 +291,7 @@ describe('createEventTarget', () => {
target.virtualclick();
});

test('custom payload', () => {
it('custom payload', () => {
const target = createEventTarget(node);
node.addEventListener('click', e => {
// expect most of the custom payload to be ignored
Expand Down Expand Up @@ -334,7 +334,7 @@ describe('createEventTarget', () => {
* Other APIs
*/

test('.setBoundingClientRect()', () => {
it('.setBoundingClientRect()', () => {
const target = createEventTarget(node);
expect(node.getBoundingClientRect()).toMatchInlineSnapshot(`
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const {
} = require('../ReactInternalTestUtils');

describe('ReactInternalTestUtils', () => {
test('waitFor', async () => {
it('waitFor', async () => {
const Yield = ({id}) => {
Scheduler.log(id);
return id;
Expand All @@ -61,7 +61,7 @@ describe('ReactInternalTestUtils', () => {
expect(root).toMatchRenderedOutput(<div>foobarbaz</div>);
});

test('waitForAll', async () => {
it('waitForAll', async () => {
const Yield = ({id}) => {
Scheduler.log(id);
return id;
Expand All @@ -82,7 +82,7 @@ describe('ReactInternalTestUtils', () => {
expect(root).toMatchRenderedOutput(<div>foobarbaz</div>);
});

test('waitForThrow', async () => {
it('waitForThrow', async () => {
const Yield = ({id}) => {
Scheduler.log(id);
return id;
Expand Down Expand Up @@ -117,7 +117,7 @@ describe('ReactInternalTestUtils', () => {
]);
});

test('waitForPaint', async () => {
it('waitForPaint', async () => {
function App({prop}) {
const deferred = useDeferredValue(prop);
const text = `Urgent: ${prop}, Deferred: ${deferred}`;
Expand All @@ -143,7 +143,7 @@ describe('ReactInternalTestUtils', () => {
expect(root).toMatchRenderedOutput('Urgent: B, Deferred: B');
});

test('assertLog', async () => {
it('assertLog', async () => {
const Yield = ({id}) => {
Scheduler.log(id);
React.useEffect(() => {
Expand Down Expand Up @@ -732,7 +732,7 @@ describe('ReactInternalTestUtils console assertions', () => {
await waitForAll(['foo', 'bar', 'baz']);
});

test('should fail if waitForThrow is called before asserting', async () => {
it('should fail if waitForThrow is called before asserting', async () => {
const Yield = ({id}) => {
Scheduler.log(id);
return id;
Expand Down Expand Up @@ -774,7 +774,7 @@ describe('ReactInternalTestUtils console assertions', () => {
await waitForAll(['A', 'B', 'A', 'B']);
});

test('should fail if waitForPaint is called before asserting', async () => {
it('should fail if waitForPaint is called before asserting', async () => {
function App({prop}) {
const deferred = useDeferredValue(prop);
const text = `Urgent: ${prop}, Deferred: ${deferred}`;
Expand Down Expand Up @@ -1664,7 +1664,7 @@ describe('ReactInternalTestUtils console assertions', () => {
await waitForAll(['foo', 'bar', 'baz']);
});

test('should fail if waitForThrow is called before asserting', async () => {
it('should fail if waitForThrow is called before asserting', async () => {
const Yield = ({id}) => {
Scheduler.log(id);
return id;
Expand Down Expand Up @@ -1706,7 +1706,7 @@ describe('ReactInternalTestUtils console assertions', () => {
await waitForAll(['A', 'B', 'A', 'B']);
});

test('should fail if waitForPaint is called before asserting', async () => {
it('should fail if waitForPaint is called before asserting', async () => {
function App({prop}) {
const deferred = useDeferredValue(prop);
const text = `Urgent: ${prop}, Deferred: ${deferred}`;
Expand Down Expand Up @@ -2640,7 +2640,7 @@ describe('ReactInternalTestUtils console assertions', () => {
await waitForAll(['foo', 'bar', 'baz']);
});

test('should fail if waitForThrow is called before asserting', async () => {
it('should fail if waitForThrow is called before asserting', async () => {
const Yield = ({id}) => {
Scheduler.log(id);
return id;
Expand Down Expand Up @@ -2682,7 +2682,7 @@ describe('ReactInternalTestUtils console assertions', () => {
await waitForAll(['A', 'B', 'A', 'B']);
});

test('should fail if waitForPaint is called before asserting', async () => {
it('should fail if waitForPaint is called before asserting', async () => {
function App({prop}) {
const deferred = useDeferredValue(prop);
const text = `Urgent: ${prop}, Deferred: ${deferred}`;
Expand Down
1 change: 1 addition & 0 deletions packages/react-devtools-inline/__tests__/__e2e__/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const config = require('../../playwright.config');
const {test} = require('@playwright/test');

function runOnlyForReactRange(range) {
// eslint-disable-next-line jest/no-disabled-tests
test.skip(
!semver.satisfies(config.use.react_version, range),
`This test requires a React version of ${range} to run. ` +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,8 @@ describe('Timeline profiler', () => {
// TODO(hoxyq): investigate why running this test with React 18 fails
// @reactVersion <= 18.2
// @reactVersion >= 18.0
xit('should mark sync render with suspense that resolves', async () => {
// eslint-disable-next-line jest/no-disabled-tests
it.skip('should mark sync render with suspense that resolves', async () => {
const fakeSuspensePromise = Promise.resolve(true);
function Example() {
throw fakeSuspensePromise;
Expand Down Expand Up @@ -186,7 +187,8 @@ describe('Timeline profiler', () => {
// TODO(hoxyq): investigate why running this test with React 18 fails
// @reactVersion <= 18.2
// @reactVersion >= 18.0
xit('should mark sync render with suspense that rejects', async () => {
// eslint-disable-next-line jest/no-disabled-tests
it.skip('should mark sync render with suspense that rejects', async () => {
const fakeSuspensePromise = Promise.reject(new Error('error'));
function Example() {
throw fakeSuspensePromise;
Expand Down Expand Up @@ -1528,7 +1530,7 @@ describe('Timeline profiler', () => {
`);
});

it('should mark concurrent render without suspends or state updates', () => {
it('should mark concurrent render without suspends with state updates', () => {
let updaterFn;

function Example() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @flow
*/

// test() is part of Jest's serializer API
// `test` is part of Jest's serializer API
export function test(maybeDehydratedValue) {
const {meta} = require('react-devtools-shared/src/hydration');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ function serializeHook(hook) {
};
}

// test() is part of Jest's serializer API
// `test` is part of Jest's serializer API
export function test(maybeHook) {
if (maybeHook === null || typeof maybeHook !== 'object') {
return false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// test() is part of Jest's serializer API
// `test` is part of Jest's serializer API
export function test(maybeInspectedElement) {
if (
maybeInspectedElement === null ||
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const MAX_DECIMAL_PLACES = 3;

// test() is part of Jest's serializer API
// `test` is part of Jest's serializer API
export function test(maybeNumber) {
return (
typeof maybeNumber === 'number' &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import hasOwnProperty from 'shared/hasOwnProperty';

const FILTERED_VERSION_STRING = '<filtered-version>';

// test() is part of Jest's serializer API
// `test` is part of Jest's serializer API
export function test(maybeProfile) {
if (
maybeProfile != null &&
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {printStore} from 'react-devtools-shared/src/devtools/utils';

// test() is part of Jest's serializer API
// `test` is part of Jest's serializer API
export function test(maybeStore) {
// It's important to lazy-require the Store rather than imported at the head of the module.
// Because we reset modules between tests, different Store implementations will be used for each test.
Expand Down
Loading