/ scripts / validate-test-runner.js
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');