validate-test-runner.js
1 #!/usr/bin/env node 2 /** 3 * Validation script for test-runner utility 4 * 5 * Demonstrates the test-runner functionality for Phase 1.3 acceptance 6 */ 7 8 import { 9 runTests, 10 runTestsForFile, 11 getCoverageForFiles, 12 parseTestOutput, 13 identifyUncoveredLines, 14 parseCoverageReport, 15 } from '../src/agents/utils/test-runner.js'; 16 17 console.log('=== Test Runner Validation ===\n'); 18 19 // Test 1: Parse test output 20 console.log('1. Testing parseTestOutput()...'); 21 const sampleOutput = `TAP version 13 22 # tests 10 23 # suites 2 24 # pass 8 25 # fail 2 26 # duration_ms 123.45`; 27 28 const parsed = parseTestOutput(sampleOutput); 29 console.log(' ✓ Parsed stats:', JSON.stringify(parsed.stats)); 30 console.log( 31 ' ✓ Tests:', 32 parsed.stats.tests, 33 'Pass:', 34 parsed.stats.pass, 35 'Fail:', 36 parsed.stats.fail 37 ); 38 39 // Test 2: Run actual tests 40 console.log('\n2. Testing runTests() with logger.test.js...'); 41 const result = await runTests({ 42 files: ['tests/logger.test.js'], 43 coverage: true, 44 timeout: 60000, 45 }); 46 47 console.log(' ✓ Success:', result.success); 48 console.log(' ✓ Duration:', result.duration, 'ms'); 49 console.log(' ✓ Tests passed:', result.stats.pass); 50 console.log(' ✓ Tests failed:', result.stats.fail); 51 console.log(' ✓ Coverage available:', result.coverage ? 'Yes' : 'No'); 52 53 // Test 3: Parse coverage 54 console.log('\n3. Testing parseCoverageReport()...'); 55 const coverage = parseCoverageReport(); 56 if (coverage) { 57 console.log(' ✓ Total coverage:', `${coverage.total.lines.pct}%`); 58 console.log(' ✓ Files in report:', Object.keys(coverage).length - 1); // -1 for 'total' 59 } else { 60 console.log(' ⚠ No coverage data available (run tests with coverage first)'); 61 } 62 63 // Test 4: Get coverage for specific file 64 console.log('\n4. Testing getCoverageForFiles()...'); 65 const loggerCoverage = getCoverageForFiles(['src/utils/logger.js']); 66 if (loggerCoverage && loggerCoverage['src/utils/logger.js']) { 67 console.log(' ✓ Logger coverage:', `${loggerCoverage['src/utils/logger.js'].lines.pct}%`); 68 } else { 69 console.log(' ⚠ No coverage for logger.js'); 70 } 71 72 // Test 5: Identify uncovered lines 73 console.log('\n5. Testing identifyUncoveredLines()...'); 74 const uncovered = identifyUncoveredLines('src/utils/logger.js'); 75 if (uncovered && uncovered.length > 0) { 76 console.log( 77 ' ✓ Uncovered lines:', 78 uncovered.slice(0, 5).join(', '), 79 uncovered.length > 5 ? '...' : '' 80 ); 81 } else if (uncovered && uncovered.length === 0) { 82 console.log(' ✓ All lines covered!'); 83 } else { 84 console.log(' ⚠ No coverage data available'); 85 } 86 87 // Test 6: Run tests for specific source file 88 console.log('\n6. Testing runTestsForFile()...'); 89 const fileResult = await runTestsForFile('src/utils/logger.js'); 90 console.log(' ✓ Found tests:', fileResult.success ? 'Yes' : 'No'); 91 if (fileResult.success) { 92 console.log(' ✓ Tests passed:', fileResult.stats.pass); 93 } 94 95 console.log('\n=== All validations complete! ===\n'); 96 97 console.log('Summary of test-runner capabilities:'); 98 console.log('✓ Execute tests with coverage'); 99 console.log('✓ Parse TAP test output'); 100 console.log('✓ Extract coverage data'); 101 console.log('✓ Identify uncovered lines'); 102 console.log('✓ Map source files to test files'); 103 console.log('✓ Run targeted test subsets'); 104 105 console.log('\nPhase 1.3: Test Execution Module - COMPLETE');