agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
173 lines (132 loc) • 5.14 kB
JavaScript
/**
* @file Unit tests for CLI error handler utility
* @description Tests error handling, logging, and exit code management for CLI tools
*/
const { handleAnalysisError, handleFileAccessError, exitOnSeverityThreshold } = require('./errorHandler');
const qtests = require('qtests');
/**
* Mock console and process for testing
*/
const mockConsole = {
error: jest.fn ? jest.fn() : () => {},
log: jest.fn ? jest.fn() : () => {}
};
const mockProcess = {
exit: jest.fn ? jest.fn() : () => {},
exitCode: 0
};
/**
* Test runner for error handler
*/
async function runTests() {
console.log('=== Testing CLI Error Handler ===');
const results = {
total: 0,
passed: 0
};
// Test handleAnalysisError with generic error
results.total++;
try {
const testError = new Error('Test analysis error');
const originalConsoleError = console.error;
const originalProcessExit = process.exit;
let errorLogged = false;
let exitCalled = false;
// Mock console.error and process.exit
console.error = (message) => { errorLogged = message.includes('analysis error'); };
process.exit = (code) => { exitCalled = code === 1; };
handleAnalysisError(testError, 'test analysis');
// Restore originals
console.error = originalConsoleError;
process.exit = originalProcessExit;
qtests.assert(errorLogged, 'handleAnalysisError should log error message');
qtests.assert(exitCalled, 'handleAnalysisError should call process.exit(1)');
console.log('✓ handleAnalysisError correctly handles analysis errors');
results.passed++;
} catch (error) {
console.log(`✗ handleAnalysisError test failed: ${error.message}`);
}
// Test handleFileAccessError for file not found
results.total++;
try {
const testError = Object.assign(new Error('ENOENT: no such file'), { code: 'ENOENT' });
const originalConsoleError = console.error;
let errorLogged = false;
console.error = (message) => { errorLogged = message.includes('not found'); };
handleFileAccessError(testError, '/test/path');
console.error = originalConsoleError;
qtests.assert(errorLogged, 'handleFileAccessError should log file not found message');
console.log('✓ handleFileAccessError correctly handles ENOENT errors');
results.passed++;
} catch (error) {
console.log(`✗ handleFileAccessError test failed: ${error.message}`);
}
// Test exitOnSeverityThreshold with high severity issues
results.total++;
try {
const testResults = {
summary: {
severityBreakdown: {
HIGH: 3,
MEDIUM: 2,
LOW: 1
}
}
};
const originalProcessExit = process.exit;
let exitCalled = false;
process.exit = (code) => { exitCalled = code === 1; };
exitOnSeverityThreshold(testResults);
process.exit = originalProcessExit;
qtests.assert(exitCalled, 'exitOnSeverityThreshold should exit with code 1 for high severity issues');
console.log('✓ exitOnSeverityThreshold correctly exits on high severity');
results.passed++;
} catch (error) {
console.log(`✗ exitOnSeverityThreshold test failed: ${error.message}`);
}
// Test exitOnSeverityThreshold with no high severity issues
results.total++;
try {
const testResults = {
summary: {
severityBreakdown: {
HIGH: 0,
MEDIUM: 2,
LOW: 1
}
}
};
const originalProcessExit = process.exit;
let exitCalled = false;
process.exit = (code) => { exitCalled = true; };
exitOnSeverityThreshold(testResults);
process.exit = originalProcessExit;
qtests.assert(!exitCalled, 'exitOnSeverityThreshold should not exit for non-high severity issues');
console.log('✓ exitOnSeverityThreshold correctly handles low severity issues');
results.passed++;
} catch (error) {
console.log(`✗ exitOnSeverityThreshold low severity test failed: ${error.message}`);
}
// Test error categorization
results.total++;
try {
const permissionError = Object.assign(new Error('EACCES: permission denied'), { code: 'EACCES' });
const originalConsoleError = console.error;
let errorType = '';
console.error = (message) => {
if (message.includes('permission')) errorType = 'permission';
};
handleFileAccessError(permissionError, '/test/path');
console.error = originalConsoleError;
qtests.assert(errorType === 'permission', 'handleFileAccessError should categorize permission errors');
console.log('✓ handleFileAccessError correctly categorizes different error types');
results.passed++;
} catch (error) {
console.log(`✗ handleFileAccessError categorization test failed: ${error.message}`);
}
console.log(`=== Error Handler Test Results ===`);
console.log(`Tests passed: ${results.passed}/${results.total}`);
console.log(`Success rate: ${((results.passed / results.total) * 100).toFixed(1)}%`);
return results;
}
module.exports = { runTests };