diff --git a/CHANGELOG.md b/CHANGELOG.md index f4f5bbe26c2b..f6337283a5b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - `[jest-circus]` Update message printed on test timeout ([#13830](https://github.com/facebook/jest/pull/13830)) - `[jest-circus]` Avoid creating the word "testfalse" when `takesDoneCallback` is `false` in the message printed on test timeout AND updated timeouts test ([#13954](https://github.com/facebook/jest/pull/13954)) - `[@jest/test-result]` Allow `TestResultsProcessor` type to return a Promise ([#13950](https://github.com/facebook/jest/pull/13950)) +- `[jest-runtime]` Support coverage with v8 for scripts loaded with `vm.runInContext` ([#13962](https://github.com/facebook/jest/pull/13962)) ### Chore & Maintenance diff --git a/e2e/__tests__/__snapshots__/coverageProviderV8.test.ts.snap b/e2e/__tests__/__snapshots__/coverageProviderV8.test.ts.snap index f24e97dce582..102d755384bb 100644 --- a/e2e/__tests__/__snapshots__/coverageProviderV8.test.ts.snap +++ b/e2e/__tests__/__snapshots__/coverageProviderV8.test.ts.snap @@ -105,3 +105,12 @@ All files | 59.37 | 33.33 | 33.33 | 59.37 | uncovered.js | 0 | 0 | 0 | 0 | 1-8 --------------|---------|----------|---------|---------|-------------------" `; + +exports[`vm script coverage generator 1`] = ` +"-------------|---------|----------|---------|---------|------------------- +File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s +-------------|---------|----------|---------|---------|------------------- +All files | 88.88 | 100 | 66.66 | 88.88 | + vmscript.js | 88.88 | 100 | 66.66 | 88.88 | 20-22 +-------------|---------|----------|---------|---------|-------------------" +`; diff --git a/e2e/__tests__/coverageProviderV8.test.ts b/e2e/__tests__/coverageProviderV8.test.ts index b282b5182f9e..2928bf91c6a4 100644 --- a/e2e/__tests__/coverageProviderV8.test.ts +++ b/e2e/__tests__/coverageProviderV8.test.ts @@ -106,3 +106,15 @@ test('prints correct coverage report, if a TS module is transpiled by custom tra expect(exitCode).toBe(0); expect(stdout).toMatchSnapshot(); }); + +test('vm script coverage generator', () => { + const dir = path.resolve(__dirname, '../vmscript-coverage'); + const {stdout, exitCode} = runJest( + dir, + ['--coverage', '--coverage-provider', 'v8'], + {stripAnsi: true}, + ); + + expect(exitCode).toBe(0); + expect(stdout).toMatchSnapshot(); +}); diff --git a/e2e/coverage-provider-v8/no-sourcemap/package.json b/e2e/coverage-provider-v8/no-sourcemap/package.json index e63e40a94614..f247a2268da8 100644 --- a/e2e/coverage-provider-v8/no-sourcemap/package.json +++ b/e2e/coverage-provider-v8/no-sourcemap/package.json @@ -6,6 +6,9 @@ "transform": { "\\.[jt]sx?$": "babel-jest", "\\.css$": "/cssTransform.js" - } + }, + "coveragePathIgnorePatterns": [ + "cssTransform\\.js" + ] } } diff --git a/e2e/vmscript-coverage/__tests__/extract-coverage.test.js b/e2e/vmscript-coverage/__tests__/extract-coverage.test.js new file mode 100644 index 000000000000..29fad304fa07 --- /dev/null +++ b/e2e/vmscript-coverage/__tests__/extract-coverage.test.js @@ -0,0 +1,42 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +const fs = require('fs'); +const path = require('path'); +const vm = require('vm'); +const filePath = path.resolve(__dirname, '../package/vmscript.js'); + +test('extract coverage', () => { + const content = fs.readFileSync(filePath, {encoding: 'utf8'}); + + const case1 = vm.runInNewContext( + content, + { + inputObject: { + number: 0, + }, + }, + { + filename: filePath, + }, + ); + + const case2 = vm.runInNewContext( + content, + { + inputObject: { + number: 7, + }, + }, + { + filename: filePath, + }, + ); + + expect(case1).toBe(false); + expect(case2).toBe(true); +}); diff --git a/e2e/vmscript-coverage/package.json b/e2e/vmscript-coverage/package.json new file mode 100644 index 000000000000..4a3ea998ce9d --- /dev/null +++ b/e2e/vmscript-coverage/package.json @@ -0,0 +1,9 @@ +{ + "jest": { + "rootDir": "./", + "testEnvironment": "node", + "collectCoverageFrom": [ + "package/**/*.js" + ] + } +} diff --git a/e2e/vmscript-coverage/package/vmscript.js b/e2e/vmscript-coverage/package/vmscript.js new file mode 100644 index 000000000000..57b3370ff98d --- /dev/null +++ b/e2e/vmscript-coverage/package/vmscript.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +function addOne(inputNumber) { + return ++inputNumber; +} + +function isEven(inputNumber) { + if (inputNumber % 2 === 0) { + return true; + } else { + return false; + } +} + +function notCovered() { + return 'not covered'; +} + +/* global inputObject */ +if (inputObject.number / 1 === inputObject.number) { + isEven(addOne(inputObject.number)); +} diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index b638e2927577..55c6933e996a 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -1267,7 +1267,6 @@ export default class Runtime { res => // TODO: will this work on windows? It might be better if `shouldInstrument` deals with it anyways res.url.startsWith(this._config.rootDir) && - this._v8CoverageSources!.has(res.url) && shouldInstrument(res.url, this._coverageOptions, this._config), ) .map(result => {