jest-test-lineage-reporter 2.1.2 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/package.json +2 -1
- package/src/TestCoverageReporter.js +1 -1
- package/src/cli/commands/mutate.js +7 -0
- package/src/cli/commands/report.js +18 -0
- package/src/cli/utils/jest-runner.js +6 -0
- package/src/testSetup.js +28 -5
package/README.md
CHANGED
|
@@ -100,17 +100,21 @@ jest-lineage mutate --threshold 90
|
|
|
100
100
|
jest-lineage mutate --debug --debug-dir ./mutations
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
+
**Note**: Mutation results are saved to `.jest-lineage-mutation-results.json`. Run `jest-lineage report` after mutation testing to generate an HTML report with mutation data included.
|
|
104
|
+
|
|
103
105
|
#### `jest-lineage report`
|
|
104
|
-
Generate HTML report from existing lineage data.
|
|
106
|
+
Generate HTML report from existing lineage data and mutation results.
|
|
105
107
|
|
|
106
108
|
```bash
|
|
107
|
-
# Generate and open report
|
|
109
|
+
# Generate and open report (includes mutation results if available)
|
|
108
110
|
jest-lineage report --open
|
|
109
111
|
|
|
110
112
|
# Custom output path
|
|
111
113
|
jest-lineage report --output coverage-report.html
|
|
112
114
|
```
|
|
113
115
|
|
|
116
|
+
**Tip**: The report command automatically loads mutation results from `.jest-lineage-mutation-results.json` if available.
|
|
117
|
+
|
|
114
118
|
#### `jest-lineage query <file> [line]`
|
|
115
119
|
Query which tests cover specific files or lines.
|
|
116
120
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jest-test-lineage-reporter",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.3",
|
|
4
4
|
"main": "src/TestCoverageReporter.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"jest-lineage": "./bin/jest-lineage.js"
|
|
@@ -57,6 +57,7 @@
|
|
|
57
57
|
"LICENSE"
|
|
58
58
|
],
|
|
59
59
|
"dependencies": {
|
|
60
|
+
"@babel/runtime": "^7.28.4",
|
|
60
61
|
"@modelcontextprotocol/sdk": "^0.5.0",
|
|
61
62
|
"chalk": "^4.1.2",
|
|
62
63
|
"cli-table3": "^0.6.3",
|
|
@@ -3104,7 +3104,7 @@ class TestCoverageReporter {
|
|
|
3104
3104
|
// Group mutations by line
|
|
3105
3105
|
const mutationsByLine = {};
|
|
3106
3106
|
fileData.mutations.forEach(mutation => {
|
|
3107
|
-
const line = mutation.line || 'unknown';
|
|
3107
|
+
const line = mutation.lineNumber || mutation.line || 'unknown';
|
|
3108
3108
|
if (!mutationsByLine[line]) {
|
|
3109
3109
|
mutationsByLine[line] = [];
|
|
3110
3110
|
}
|
|
@@ -55,6 +55,13 @@ async function mutateCommand(options) {
|
|
|
55
55
|
spin.succeed('Mutation testing completed!');
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// Save results to file for HTML report
|
|
59
|
+
const fs = require('fs');
|
|
60
|
+
const path = require('path');
|
|
61
|
+
const resultsPath = path.join(process.cwd(), '.jest-lineage-mutation-results.json');
|
|
62
|
+
fs.writeFileSync(resultsPath, JSON.stringify(results, null, 2));
|
|
63
|
+
info(`Mutation results saved to: ${chalk.yellow(resultsPath)}`);
|
|
64
|
+
|
|
58
65
|
// Print results
|
|
59
66
|
printMutationSummary(results);
|
|
60
67
|
|
|
@@ -26,6 +26,19 @@ async function reportCommand(options) {
|
|
|
26
26
|
// Process lineage data
|
|
27
27
|
const lineageData = processLineageDataForMutation(rawData);
|
|
28
28
|
|
|
29
|
+
// Load mutation results if available
|
|
30
|
+
const fs = require('fs');
|
|
31
|
+
const mutationResultsPath = path.join(process.cwd(), '.jest-lineage-mutation-results.json');
|
|
32
|
+
let mutationResults = null;
|
|
33
|
+
if (fs.existsSync(mutationResultsPath)) {
|
|
34
|
+
try {
|
|
35
|
+
mutationResults = JSON.parse(fs.readFileSync(mutationResultsPath, 'utf8'));
|
|
36
|
+
info(`Loaded mutation results: ${chalk.cyan(mutationResults.totalMutations)} mutations tested`);
|
|
37
|
+
} catch (e) {
|
|
38
|
+
// Ignore errors loading mutation results
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
29
42
|
// Create reporter instance with minimal config
|
|
30
43
|
const reporter = new TestCoverageReporter(
|
|
31
44
|
{ rootDir: process.cwd() },
|
|
@@ -35,6 +48,11 @@ async function reportCommand(options) {
|
|
|
35
48
|
// Load data into reporter
|
|
36
49
|
reporter.processLineageResults(lineageData, 'unknown');
|
|
37
50
|
|
|
51
|
+
// Set mutation results if available
|
|
52
|
+
if (mutationResults) {
|
|
53
|
+
reporter.mutationResults = mutationResults;
|
|
54
|
+
}
|
|
55
|
+
|
|
38
56
|
// Generate HTML report
|
|
39
57
|
const spin = spinner('Generating HTML report...');
|
|
40
58
|
spin.start();
|
|
@@ -39,6 +39,12 @@ async function runJest(options = {}) {
|
|
|
39
39
|
jestArgs.push('--coverage');
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
// Run tests serially when lineage tracking is enabled to avoid race conditions
|
|
43
|
+
// with file writes from parallel workers
|
|
44
|
+
if (enableLineage && !jestArgs.includes('--runInBand') && !jestArgs.includes('--maxWorkers')) {
|
|
45
|
+
jestArgs.push('--runInBand');
|
|
46
|
+
}
|
|
47
|
+
|
|
42
48
|
// Set environment variables for lineage tracking
|
|
43
49
|
const env = {
|
|
44
50
|
...process.env,
|
package/src/testSetup.js
CHANGED
|
@@ -278,7 +278,31 @@ function createTestWrapper(originalFn, testType) {
|
|
|
278
278
|
if (process.env.JEST_LINEAGE_MUTATION !== 'true') {
|
|
279
279
|
// Also store in a more persistent way for the reporter
|
|
280
280
|
if (!global.__LINEAGE_PERSISTENT_DATA__) {
|
|
281
|
-
|
|
281
|
+
// Initialize array - load existing tests from file if merging is enabled
|
|
282
|
+
// This ensures data persists across test files running in separate workers
|
|
283
|
+
const shouldMerge = process.env.JEST_LINEAGE_MERGE !== 'false';
|
|
284
|
+
if (shouldMerge) {
|
|
285
|
+
const fs = require('fs');
|
|
286
|
+
const path = require('path');
|
|
287
|
+
const filePath = path.join(process.cwd(), '.jest-lineage-data.json');
|
|
288
|
+
|
|
289
|
+
if (fs.existsSync(filePath)) {
|
|
290
|
+
try {
|
|
291
|
+
const existingData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
292
|
+
// Convert coverage objects back to Maps
|
|
293
|
+
global.__LINEAGE_PERSISTENT_DATA__ = existingData.tests.map(test => ({
|
|
294
|
+
...test,
|
|
295
|
+
coverage: new Map(Object.entries(test.coverage || {}))
|
|
296
|
+
}));
|
|
297
|
+
} catch (e) {
|
|
298
|
+
global.__LINEAGE_PERSISTENT_DATA__ = [];
|
|
299
|
+
}
|
|
300
|
+
} else {
|
|
301
|
+
global.__LINEAGE_PERSISTENT_DATA__ = [];
|
|
302
|
+
}
|
|
303
|
+
} else {
|
|
304
|
+
global.__LINEAGE_PERSISTENT_DATA__ = [];
|
|
305
|
+
}
|
|
282
306
|
}
|
|
283
307
|
global.__LINEAGE_PERSISTENT_DATA__.push(testData);
|
|
284
308
|
|
|
@@ -645,8 +669,9 @@ function writeTrackingDataToFile() {
|
|
|
645
669
|
try {
|
|
646
670
|
const filePath = path.join(process.cwd(), '.jest-lineage-data.json');
|
|
647
671
|
|
|
648
|
-
// Check if we should merge with existing data (default:
|
|
649
|
-
|
|
672
|
+
// Check if we should merge with existing data (default: true for multiple test files)
|
|
673
|
+
// Set JEST_LINEAGE_MERGE=false to disable merging and recreate from scratch
|
|
674
|
+
const shouldMerge = process.env.JEST_LINEAGE_MERGE !== 'false';
|
|
650
675
|
|
|
651
676
|
let existingData = { timestamp: Date.now(), tests: [] };
|
|
652
677
|
if (shouldMerge && fs.existsSync(filePath)) {
|
|
@@ -717,8 +742,6 @@ function writeTrackingDataToFile() {
|
|
|
717
742
|
}
|
|
718
743
|
|
|
719
744
|
fs.writeFileSync(filePath, JSON.stringify(dataToWrite, null, 2));
|
|
720
|
-
|
|
721
|
-
// console.log(`📝 Wrote tracking data: ${dataToWrite.tests.length} total tests to ${filePath}`);
|
|
722
745
|
} catch (error) {
|
|
723
746
|
console.warn('Warning: Could not write tracking data to file:', error.message);
|
|
724
747
|
}
|