Skip to content

Commit b39d0c1

Browse files
committed
refactor(@angular/build): normalize unit test coverage options for consistency
Previously, the unit test builder's `coverage` option was conditional. It was only defined if `coverage: true` was set, and it consolidated several top-level `coverage*` properties from the schema. This required downstream consumers, like the Karma and Vitest executors, to handle a potentially undefined object and led to complex and sometimes incorrect option merging, especially in the Vitest runner. This commit refactors the option normalization logic to ensure the `coverage` object is *always* defined. A new `enabled` flag, controlled by the main `coverage` option, is now part of this object. (cherry picked from commit 4cb985c)
1 parent 9132e6a commit b39d0c1

File tree

4 files changed

+20
-27
lines changed

4 files changed

+20
-27
lines changed

packages/angular/build/src/builders/unit-test/options.ts

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -96,22 +96,21 @@ export async function normalizeOptions(
9696
exclude: options.exclude,
9797
filter,
9898
runnerName: runner ?? 'vitest',
99-
coverage: options.coverage
100-
? {
101-
exclude: options.coverageExclude,
102-
include: options.coverageInclude,
103-
reporters: normalizeReporterOption(options.coverageReporters),
104-
thresholds: options.coverageThresholds,
105-
// The schema generation tool doesn't support tuple types for items, but the schema validation
106-
// does ensure that the array has exactly two numbers.
107-
watermarks: options.coverageWatermarks as {
108-
statements?: [number, number];
109-
branches?: [number, number];
110-
functions?: [number, number];
111-
lines?: [number, number];
112-
},
113-
}
114-
: undefined,
99+
coverage: {
100+
enabled: options.coverage,
101+
exclude: options.coverageExclude,
102+
include: options.coverageInclude,
103+
reporters: normalizeReporterOption(options.coverageReporters),
104+
thresholds: options.coverageThresholds,
105+
// The schema generation tool doesn't support tuple types for items, but the schema validation
106+
// does ensure that the array has exactly two numbers.
107+
watermarks: options.coverageWatermarks as {
108+
statements?: [number, number];
109+
branches?: [number, number];
110+
functions?: [number, number];
111+
lines?: [number, number];
112+
},
113+
},
115114
tsConfig,
116115
buildProgress: progress,
117116
reporters: normalizeReporterOption(options.reporters),

packages/angular/build/src/builders/unit-test/runners/karma/executor.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ export class KarmaExecutor implements TestExecutor {
8787
poll: buildTargetOptions.poll,
8888
preserveSymlinks: buildTargetOptions.preserveSymlinks,
8989
browsers: unitTestOptions.browsers?.join(','),
90-
codeCoverage: !!unitTestOptions.coverage,
91-
codeCoverageExclude: unitTestOptions.coverage?.exclude,
90+
codeCoverage: unitTestOptions.coverage.enabled,
91+
codeCoverageExclude: unitTestOptions.coverage.exclude,
9292
fileReplacements: buildTargetOptions.fileReplacements,
9393
reporters: unitTestOptions.reporters?.map((reporter) => {
9494
// Karma only supports string reporters.
@@ -123,7 +123,7 @@ export class KarmaExecutor implements TestExecutor {
123123
}
124124

125125
// Add coverage options
126-
if (unitTestOptions.coverage) {
126+
if (unitTestOptions.coverage.enabled) {
127127
const { thresholds, watermarks } = unitTestOptions.coverage;
128128
// eslint-disable-next-line @typescript-eslint/no-explicit-any
129129
const coverageReporter = ((options as any).coverageReporter ??= {});

packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,6 @@ async function generateCoverageOption(
242242
coverage: NormalizedUnitTestBuilderOptions['coverage'],
243243
projectName: string,
244244
): Promise<VitestCoverageOption> {
245-
if (!coverage) {
246-
return {
247-
enabled: false,
248-
};
249-
}
250-
251245
let defaultExcludes: string[] = [];
252246
if (coverage.exclude) {
253247
try {
@@ -257,7 +251,7 @@ async function generateCoverageOption(
257251
}
258252

259253
return {
260-
enabled: true,
254+
enabled: coverage.enabled,
261255
excludeAfterRemap: true,
262256
include: coverage.include,
263257
reportsDirectory: toPosixPath(path.join('coverage', projectName)),

packages/angular/build/src/builders/unit-test/runners/vitest/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const VitestTestRunner: TestRunner = {
3232
checker.check('jsdom');
3333
}
3434

35-
if (options.coverage) {
35+
if (options.coverage.enabled) {
3636
checker.check('@vitest/coverage-v8');
3737
}
3838

0 commit comments

Comments
 (0)