From 17f6c83b08c78ac9915c217bd2770cc423f16caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zacharias=20Bj=C3=B6rngren?= Date: Thu, 16 Jan 2020 15:38:21 +0100 Subject: [PATCH] jest-reporters: Use global coverage thresholds as high watermarks (#9416) --- CHANGELOG.md | 1 + .../src/__tests__/coverage_reporter.test.js | 1 + .../src/__tests__/get_watermarks.test.ts | 44 +++++++++++++++++++ .../jest-reporters/src/coverage_reporter.ts | 3 ++ packages/jest-reporters/src/get_watermarks.ts | 36 +++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 packages/jest-reporters/src/__tests__/get_watermarks.test.ts create mode 100644 packages/jest-reporters/src/get_watermarks.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a386a795440..67dfabea13cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ - `[jest-get-type]` Add `BigInt` support. ([#8382](https://github.com/facebook/jest/pull/8382)) - `[jest-matcher-utils]` Add `BigInt` support to `ensureNumbers` `ensureActualIsNumber`, `ensureExpectedIsNumber` ([#8382](https://github.com/facebook/jest/pull/8382)) - `[jest-reporters]` Export utils for path formatting ([#9162](https://github.com/facebook/jest/pull/9162)) +- `[jest-reporters]` Provides global coverage thresholds as watermarks for istanbul ([#9416](https://github.com/facebook/jest/pull/9416)) - `[jest-runner]` Warn if a worker had to be force exited ([#8206](https://github.com/facebook/jest/pull/8206)) - `[jest-runtime]` [**BREAKING**] Do not export `ScriptTransformer` - it can be imported from `@jest/transform` instead ([#9256](https://github.com/facebook/jest/pull/9256)) - `[jest-runtime]` Use `JestEnvironment.compileFunction` if available to avoid the module wrapper ([#9252](https://github.com/facebook/jest/pull/9252)) diff --git a/packages/jest-reporters/src/__tests__/coverage_reporter.test.js b/packages/jest-reporters/src/__tests__/coverage_reporter.test.js index 3fc1c78686e4..7e00c3f9c476 100644 --- a/packages/jest-reporters/src/__tests__/coverage_reporter.test.js +++ b/packages/jest-reporters/src/__tests__/coverage_reporter.test.js @@ -8,6 +8,7 @@ jest .mock('istanbul-lib-source-maps') .mock('istanbul-lib-report', () => ({ + ...jest.requireActual('istanbul-lib-report'), createContext: jest.fn(), summarizers: {pkg: jest.fn(() => ({visit: jest.fn()}))}, })) diff --git a/packages/jest-reporters/src/__tests__/get_watermarks.test.ts b/packages/jest-reporters/src/__tests__/get_watermarks.test.ts new file mode 100644 index 000000000000..2b47c5159e09 --- /dev/null +++ b/packages/jest-reporters/src/__tests__/get_watermarks.test.ts @@ -0,0 +1,44 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import getWatermarks from '../get_watermarks'; +import {makeGlobalConfig} from '../../../../TestUtils'; + +describe('getWatermarks', () => { + test(`that watermarks use thresholds as upper target`, () => { + const watermarks = getWatermarks( + makeGlobalConfig({ + coverageThreshold: { + global: { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, + }), + ); + + expect(watermarks).toEqual({ + branches: [expect.any(Number), 100], + functions: [expect.any(Number), 100], + lines: [expect.any(Number), 100], + statements: [expect.any(Number), 100], + }); + }); + + test(`that watermarks are created always created`, () => { + const watermarks = getWatermarks(makeGlobalConfig()); + + expect(watermarks).toEqual({ + branches: [expect.any(Number), expect.any(Number)], + functions: [expect.any(Number), expect.any(Number)], + lines: [expect.any(Number), expect.any(Number)], + statements: [expect.any(Number), expect.any(Number)], + }); + }); +}); diff --git a/packages/jest-reporters/src/coverage_reporter.ts b/packages/jest-reporters/src/coverage_reporter.ts index 39025a4e5e51..09ce73f3f39f 100644 --- a/packages/jest-reporters/src/coverage_reporter.ts +++ b/packages/jest-reporters/src/coverage_reporter.ts @@ -27,6 +27,7 @@ import {RawSourceMap} from 'source-map'; import {TransformResult} from '@jest/transform'; import BaseReporter from './base_reporter'; import {Context, CoverageReporterOptions, CoverageWorker, Test} from './types'; +import getWatermarks from './get_watermarks'; // This is fixed in a newer versions of source-map, but our dependencies are still stuck on old versions interface FixedRawSourceMap extends Omit { @@ -494,6 +495,7 @@ export default class CoverageReporter extends BaseReporter { // @ts-ignore coverageMap: map, dir: this._globalConfig.coverageDirectory, + watermarks: getWatermarks(this._globalConfig), }); return {map, reportContext}; @@ -506,6 +508,7 @@ export default class CoverageReporter extends BaseReporter { dir: this._globalConfig.coverageDirectory, // @ts-ignore sourceFinder: this._sourceMapStore.sourceFinder, + watermarks: getWatermarks(this._globalConfig), }); // @ts-ignore diff --git a/packages/jest-reporters/src/get_watermarks.ts b/packages/jest-reporters/src/get_watermarks.ts new file mode 100644 index 000000000000..631907655ac7 --- /dev/null +++ b/packages/jest-reporters/src/get_watermarks.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {Config} from '@jest/types'; +import istanbulReport = require('istanbul-lib-report'); + +export default function getWatermarks( + config: Config.GlobalConfig, +): istanbulReport.Watermarks { + const defaultWatermarks = istanbulReport.getDefaultWatermarks(); + + const {coverageThreshold} = config; + + if (!coverageThreshold || !coverageThreshold.global) { + return defaultWatermarks; + } + + const keys: Array = [ + 'branches', + 'functions', + 'lines', + 'statements', + ]; + return keys.reduce((watermarks, key) => { + const value = coverageThreshold.global[key]; + if (value !== undefined) { + watermarks[key][1] = value; + } + + return watermarks; + }, defaultWatermarks); +}