-
Notifications
You must be signed in to change notification settings - Fork 12k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(@angular-devkit/build-angular): transform remapped sourcemap into…
… a plain object `remapping` will return a SourceMap which it's prototype is not a simple object. This causes Babel to fail when it invoked from `istanbul-lib-instrument` because Babel with `don't know how to turn this value into a node` error as Babel will not process not simple objects. See: https://github.com/babel/babel/blob/780aa48d2a34dc55f556843074b6aed45e7eabeb/packages/babel-types/src/converters/valueToNode.ts#L115-L130 Closes #21967 (cherry picked from commit da1733c)
- Loading branch information
1 parent
b93e63f
commit 6173609
Showing
3 changed files
with
99 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
89 changes: 89 additions & 0 deletions
89
packages/angular_devkit/build_angular/src/karma/tests/behavior/code-coverage_spec.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/** | ||
* @license | ||
* Copyright Google LLC All Rights Reserved. | ||
* | ||
* Use of this source code is governed by an MIT-style license that can be | ||
* found in the LICENSE file at https://angular.io/license | ||
*/ | ||
|
||
import { last, tap } from 'rxjs/operators'; | ||
import { promisify } from 'util'; | ||
import { execute } from '../../index'; | ||
import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeBuilder } from '../setup'; | ||
|
||
// In each of the test below we'll have to call setTimeout to wait for the coverage | ||
// analysis to be done. This is because karma-coverage performs the analysis | ||
// asynchronously but the promise that it returns is not awaited by Karma. | ||
// Coverage analysis begins when onRunComplete() is invoked, and output files | ||
// are subsequently written to disk. For more information, see | ||
// https://github.com/karma-runner/karma-coverage/blob/32acafa90ed621abd1df730edb44ae55a4009c2c/lib/reporter.js#L221 | ||
|
||
const setTimeoutPromise = promisify(setTimeout); | ||
const coveragePath = 'coverage/lcov.info'; | ||
|
||
describeBuilder(execute, KARMA_BUILDER_INFO, (harness) => { | ||
describe('Behavior: "codeCoverage"', () => { | ||
it('should generate coverage report when file was previously processed by Babel', async () => { | ||
// Force Babel transformation. | ||
await harness.appendToFile('src/app/app.component.ts', '// async'); | ||
|
||
harness.useTarget('test', { | ||
...BASE_OPTIONS, | ||
codeCoverage: true, | ||
}); | ||
|
||
const { result } = await harness.executeOnce(); | ||
expect(result?.success).toBeTrue(); | ||
|
||
await setTimeoutPromise(1000); | ||
harness.expectFile(coveragePath).toExist(); | ||
}); | ||
|
||
it('should exit with non-zero code when coverage is below threshold', async () => { | ||
await harness.modifyFile('karma.conf.js', (content) => | ||
content.replace( | ||
'coverageReporter: {', | ||
`coverageReporter: { | ||
check: { | ||
global: { | ||
statements: 100, | ||
lines: 100, | ||
branches: 100, | ||
functions: 100 | ||
} | ||
}, | ||
`, | ||
), | ||
); | ||
|
||
await harness.appendToFile( | ||
'src/app/app.component.ts', | ||
` | ||
export function nonCovered(): boolean { | ||
return true; | ||
} | ||
`, | ||
); | ||
|
||
harness.useTarget('test', { | ||
...BASE_OPTIONS, | ||
codeCoverage: true, | ||
}); | ||
|
||
await harness | ||
.execute() | ||
.pipe( | ||
// In incremental mode, karma-coverage does not have the ability to mark a | ||
// run as failed if code coverage does not pass. This is because it does | ||
// the coverage asynchoronously and Karma does not await the promise | ||
// returned by the plugin. | ||
|
||
// However the program must exit with non-zero exit code. | ||
// This is a more common use case of coverage testing and must be supported. | ||
last(), | ||
tap((buildEvent) => expect(buildEvent.result?.success).toBeFalse()), | ||
) | ||
.toPromise(); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters