Skip to content

Commit 1a2eacb

Browse files
authored
fix: coverage.exclude should exclude path correctly (#592)
1 parent 6c86cf9 commit 1a2eacb

File tree

6 files changed

+67
-8
lines changed

6 files changed

+67
-8
lines changed

e2e/test-coverage/fixtures/rstest.include.config.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import { defineConfig } from '@rstest/core';
2+
import { join } from 'pathe';
23

34
export default defineConfig({
45
coverage: {
56
enabled: true,
67
provider: 'istanbul',
78
include: ['src/**/*.{js,jsx,ts,tsx}'],
9+
exclude: [
10+
join(__dirname, '../404.ts'),
11+
'a.ts',
12+
join(__dirname, 'src/b.ts'),
13+
'./src/c.ts',
14+
],
815
reporters: ['text'],
916
},
1017
setupFiles: ['./rstest.setup.ts'],
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const a = 1;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const b = 1;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const c = 1;

e2e/test-coverage/include.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ describe('test coverage-istanbul include option', () => {
2929
?.replaceAll(' ', ''),
3030
).toMatchInlineSnapshot(`"date.ts|100|100|100|100|"`);
3131

32+
expect(
33+
logs.find((log) => log.includes('a.ts') && log.includes('|')),
34+
).toBeFalsy();
35+
36+
expect(
37+
logs.find((log) => log.includes('b.ts') && log.includes('|')),
38+
).toBeFalsy();
39+
40+
expect(
41+
logs.find((log) => log.includes('c.ts') && log.includes('|')),
42+
).toBeFalsy();
43+
3244
expectLog('Test Files 1 passed', logs);
3345
});
3446
});

packages/core/src/coverage/generate.ts

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { normalize } from 'pathe';
2-
import { glob } from 'tinyglobby';
2+
import { glob, isDynamicPattern } from 'tinyglobby';
33
import type { TestFileResult } from '../types';
44
import type {
55
CoverageMap,
@@ -8,6 +8,42 @@ import type {
88
} from '../types/coverage';
99
import { logger } from '../utils';
1010

11+
const getIncludedFiles = async (
12+
coverage: CoverageOptions,
13+
rootPath: string,
14+
): Promise<string[]> => {
15+
// fix issue with glob not working correctly when exclude path was not in the cwd
16+
const ignoredPatterns = coverage.exclude?.filter(
17+
(item) =>
18+
isDynamicPattern(item) ||
19+
item.startsWith(rootPath) ||
20+
item.startsWith('./'),
21+
);
22+
const allFiles = await glob(coverage.include!, {
23+
cwd: rootPath,
24+
absolute: true,
25+
onlyFiles: true,
26+
ignore: ignoredPatterns,
27+
dot: true,
28+
expandDirectories: false,
29+
});
30+
31+
// 'a.ts' should match 'src/a.ts'
32+
if (ignoredPatterns?.length !== coverage.exclude?.length) {
33+
const excludes = coverage.exclude!.filter(
34+
(item) =>
35+
!isDynamicPattern(item) &&
36+
!item.startsWith(rootPath) &&
37+
!item.startsWith('./'),
38+
);
39+
return allFiles.filter((file) => {
40+
return !excludes.some((exclude) => file.includes(exclude));
41+
});
42+
}
43+
44+
return allFiles;
45+
};
46+
1147
export async function generateCoverage(
1248
coverage: CoverageOptions,
1349
rootPath: string,
@@ -25,13 +61,7 @@ export async function generateCoverage(
2561
}
2662

2763
if (coverage.include?.length) {
28-
const allFiles = await glob(coverage.include, {
29-
cwd: rootPath,
30-
absolute: true,
31-
ignore: coverage.exclude,
32-
dot: true,
33-
expandDirectories: false,
34-
});
64+
const allFiles = await getIncludedFiles(coverage, rootPath);
3565

3666
// should be better to filter files before swc coverage is processed
3767
finalCoverageMap.filter((file) => allFiles.includes(normalize(file)));
@@ -80,6 +110,13 @@ async function generateCoverageForUntestedFiles(
80110
): Promise<void> {
81111
logger.debug('Generating coverage for untested files...');
82112

113+
if (!coverageProvider.generateCoverageForUntestedFiles) {
114+
logger.warn(
115+
'Current coverage provider does not support generating coverage for untested files.',
116+
);
117+
return;
118+
}
119+
83120
const coverages =
84121
await coverageProvider.generateCoverageForUntestedFiles(uncoveredFiles);
85122

0 commit comments

Comments
 (0)