From 5736ae386e473584c0b57578d074e1d8e5d8242b Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sun, 31 Dec 2023 17:13:49 +0100 Subject: [PATCH] chore: enforce errors are given messages (#14824) --- .eslintrc.cjs | 3 ++- .../__snapshots__/testFailingJasmine.test.ts.snap | 4 ++-- packages/expect/src/index.ts | 12 +++--------- packages/jest-circus/src/utils.ts | 1 + packages/jest-fake-timers/src/legacyFakeTimers.ts | 1 + packages/jest-fake-timers/src/modernFakeTimers.ts | 1 + packages/jest-jasmine2/src/jasmine/Spec.ts | 1 + packages/jest-jasmine2/src/jasmineAsyncInstall.ts | 2 ++ packages/jest-jasmine2/src/queueRunner.ts | 1 + packages/jest-runner/src/index.ts | 1 + packages/jest-snapshot/src/State.ts | 1 + 11 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e1cbe3dc283b..687f71342da9 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -220,6 +220,7 @@ module.exports = { 'no-unused-vars': 'off', 'sort-keys': 'off', 'unicorn/consistent-function-scoping': 'off', + 'unicorn/error-message': 'off', 'unicorn/no-await-expression-member': 'off', 'unicorn/no-static-only-class': 'off', 'unicorn/prefer-number-properties': 'off', @@ -373,6 +374,7 @@ module.exports = { rules: { 'import/no-extraneous-dependencies': 'off', 'unicorn/consistent-function-scoping': 'off', + 'unicorn/error-message': 'off', }, }, { @@ -696,7 +698,6 @@ module.exports = { 'unicorn/prefer-reflect-apply': 'off', // TODO: turn on at some point - 'unicorn/error-message': 'off', 'unicorn/prefer-string-replace-all': 'off', // enabling this is blocked by https://github.com/microsoft/rushstack/issues/2780 diff --git a/e2e/__tests__/__snapshots__/testFailingJasmine.test.ts.snap b/e2e/__tests__/__snapshots__/testFailingJasmine.test.ts.snap index ea0abef23944..bddc0de89505 100644 --- a/e2e/__tests__/__snapshots__/testFailingJasmine.test.ts.snap +++ b/e2e/__tests__/__snapshots__/testFailingJasmine.test.ts.snap @@ -46,7 +46,7 @@ FAIL __tests__/worksWithConcurrentMode.test.js 15 | }); 16 | - at Function.failing (../../packages/jest-jasmine2/build/index.js:307:17) + at Function.failing (../../packages/jest-jasmine2/build/index.js:311:17) at Suite.failing (__tests__/worksWithConcurrentMode.test.js:13:17) at Object.describe (__tests__/worksWithConcurrentMode.test.js:8:1) @@ -80,7 +80,7 @@ FAIL __tests__/worksWithConcurrentOnlyMode.test.js 15 | }); 16 | - at Function.failing (../../packages/jest-jasmine2/build/index.js:307:17) + at Function.failing (../../packages/jest-jasmine2/build/index.js:311:17) at Suite.failing (__tests__/worksWithConcurrentOnlyMode.test.js:13:22) at Object.describe (__tests__/worksWithConcurrentOnlyMode.test.js:8:1) diff --git a/packages/expect/src/index.ts b/packages/expect/src/index.ts index 33198b56645e..0979429e59c9 100644 --- a/packages/expect/src/index.ts +++ b/packages/expect/src/index.ts @@ -10,7 +10,7 @@ import {equals, iterableEquality, subsetEquality} from '@jest/expect-utils'; import * as matcherUtils from 'jest-matcher-utils'; -import {isPromise} from 'jest-util'; +import {ErrorWithStack, isPromise} from 'jest-util'; import { any, anything, @@ -428,10 +428,7 @@ const _validateResult = (result: any) => { }; function assertions(expected: number): void { - const error = new Error(); - if (Error.captureStackTrace) { - Error.captureStackTrace(error, assertions); - } + const error = new ErrorWithStack(undefined, assertions); setState({ expectedAssertionsNumber: expected, @@ -439,10 +436,7 @@ function assertions(expected: number): void { }); } function hasAssertions(...args: Array): void { - const error = new Error(); - if (Error.captureStackTrace) { - Error.captureStackTrace(error, hasAssertions); - } + const error = new ErrorWithStack(undefined, hasAssertions); matcherUtils.ensureNoExpected(args[0], '.hasAssertions'); setState({ diff --git a/packages/jest-circus/src/utils.ts b/packages/jest-circus/src/utils.ts index 4354a7aed31a..84aab232bde1 100644 --- a/packages/jest-circus/src/utils.ts +++ b/packages/jest-circus/src/utils.ts @@ -432,6 +432,7 @@ const _getError = ( asyncError = errors[1]; } else { error = errors; + // eslint-disable-next-line unicorn/error-message asyncError = new Error(); } diff --git a/packages/jest-fake-timers/src/legacyFakeTimers.ts b/packages/jest-fake-timers/src/legacyFakeTimers.ts index 455a7cd446b4..70b74bb8dd18 100644 --- a/packages/jest-fake-timers/src/legacyFakeTimers.ts +++ b/packages/jest-fake-timers/src/legacyFakeTimers.ts @@ -423,6 +423,7 @@ export default class FakeTimers { 'in this test file or enable fake timers for all tests by setting ' + "{'enableGlobally': true, 'legacyFakeTimers': true} in " + `Jest configuration file.\nStack Trace:\n${formatStackTrace( + // eslint-disable-next-line unicorn/error-message new Error().stack!, this._config, {noStackTrace: false}, diff --git a/packages/jest-fake-timers/src/modernFakeTimers.ts b/packages/jest-fake-timers/src/modernFakeTimers.ts index 1ba8b8f931d7..310cf4be6b85 100644 --- a/packages/jest-fake-timers/src/modernFakeTimers.ts +++ b/packages/jest-fake-timers/src/modernFakeTimers.ts @@ -182,6 +182,7 @@ export default class FakeTimers { 'with fake timers. Call `jest.useFakeTimers()` in this test file or enable ' + "fake timers for all tests by setting 'fakeTimers': {'enableGlobally': true} " + `in Jest configuration file.\nStack Trace:\n${formatStackTrace( + // eslint-disable-next-line unicorn/error-message new Error().stack!, this._config, {noStackTrace: false}, diff --git a/packages/jest-jasmine2/src/jasmine/Spec.ts b/packages/jest-jasmine2/src/jasmine/Spec.ts index 37774a44d059..6a188dd65c0f 100644 --- a/packages/jest-jasmine2/src/jasmine/Spec.ts +++ b/packages/jest-jasmine2/src/jasmine/Spec.ts @@ -131,6 +131,7 @@ export default class Spec { this.queueRunnerFactory = attrs.queueRunnerFactory || function () {}; this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + // eslint-disable-next-line unicorn/error-message this.initError = new Error(); this.initError.name = ''; diff --git a/packages/jest-jasmine2/src/jasmineAsyncInstall.ts b/packages/jest-jasmine2/src/jasmineAsyncInstall.ts index 828fcf1eb35d..c8bf0d8a1efd 100644 --- a/packages/jest-jasmine2/src/jasmineAsyncInstall.ts +++ b/packages/jest-jasmine2/src/jasmineAsyncInstall.ts @@ -63,6 +63,7 @@ function promisifyLifeCycleFunction( return originalFn.call(env, asyncJestLifecycleWithCallback, timeout); } + // eslint-disable-next-line unicorn/error-message const extraError = new Error(); // Without this line v8 stores references to all closures @@ -142,6 +143,7 @@ function promisifyIt( return originalFn.call(env, specName, asyncJestTestWithCallback, timeout); } + // eslint-disable-next-line unicorn/error-message const extraError = new Error(); // Without this line v8 stores references to all closures diff --git a/packages/jest-jasmine2/src/queueRunner.ts b/packages/jest-jasmine2/src/queueRunner.ts index f473adf4d90d..a444dc408350 100644 --- a/packages/jest-jasmine2/src/queueRunner.ts +++ b/packages/jest-jasmine2/src/queueRunner.ts @@ -39,6 +39,7 @@ export default function queueRunner(options: Options): PromiseLike & { onCancel(resolve); }); + // eslint-disable-next-line unicorn/error-message const mapper = ({fn, timeout, initError = new Error()}: QueueableFn) => { let promise = new Promise(resolve => { const next = function (...args: [Error]) { diff --git a/packages/jest-runner/src/index.ts b/packages/jest-runner/src/index.ts index 6b7f305ff07b..f55f2791f262 100644 --- a/packages/jest-runner/src/index.ts +++ b/packages/jest-runner/src/index.ts @@ -130,6 +130,7 @@ export default class TestRunner extends EmittingTestRunner { const runTestInWorker = (test: Test) => mutex(async () => { if (watcher.isInterrupted()) { + // eslint-disable-next-line unicorn/error-message throw new Error(); } diff --git a/packages/jest-snapshot/src/State.ts b/packages/jest-snapshot/src/State.ts index b58e5931edbf..3ecd8cef1dec 100644 --- a/packages/jest-snapshot/src/State.ts +++ b/packages/jest-snapshot/src/State.ts @@ -113,6 +113,7 @@ export default class SnapshotState { ): void { this._dirty = true; if (options.isInline) { + // eslint-disable-next-line unicorn/error-message const error = options.error || new Error(); const lines = getStackTraceLines( removeLinesBeforeExternalMatcherTrap(error.stack || ''),