// scripts/verify-integration.ts
import { exec } from 'child_process';
import { promisify } from 'util';
const execAsync = promisify(exec);
interface VerificationResult {
testName: string;
success: boolean;
message: string;
details?: string;
}
async function verifySystemIntegration(): Promise<VerificationResult[]> {
const results: VerificationResult[] = [];
console.log('๐ Starting System Integration Verification...\n');
// npm testๆค่จผ
console.log('๐ Running npm test verification...');
try {
const { stdout, stderr } = await execAsync('npm test', { timeout: 60000 });
const success = !stderr.includes('ERROR') && !stderr.includes('FAILED') && stdout.includes('passed');
results.push({
testName: 'npm test',
success,
message: success ? 'All tests passed successfully' : 'Some tests failed',
details: success ? `${stdout.split('โ').length - 1} tests passed` : stderr || stdout
});
console.log(success ? 'โ
npm test passed' : 'โ npm test failed');
} catch (error: any) {
results.push({
testName: 'npm test',
success: false,
message: 'Test execution failed',
details: error.message
});
console.log('โ npm test execution failed');
}
// health:checkๆค่จผ
console.log('\n๐ฅ Running health:check verification...');
try {
const { stdout, stderr } = await execAsync('npm run health:check', { timeout: 60000 });
const hasErrors = stderr.includes('ERROR') || stderr.includes('FAILED');
const success = !hasErrors;
results.push({
testName: 'health:check',
success,
message: success ? 'Health check passed for all accounts' : 'Health check failed',
details: success ? 'All configured accounts checked successfully' : stderr || 'Check configuration'
});
console.log(success ? 'โ
health:check passed' : 'โ health:check failed');
} catch (error: any) {
// health:checkใฎๅคฑๆใฏใขใซใฆใณใ่จญๅฎใซไพๅญใใใใใ่ญฆๅใจใใฆๆฑใ
const isConfigurationIssue = error.message.includes('Account not found') ||
error.message.includes('EMAIL_ENCRYPTION_KEY');
results.push({
testName: 'health:check',
success: isConfigurationIssue, // ่จญๅฎใฎๅ้กใฏๆๅใจใใฆๆฑใ
message: isConfigurationIssue ? 'Health check skipped (no accounts configured)' : 'Health check failed',
details: error.message
});
console.log(isConfigurationIssue ? 'โ ๏ธ health:check skipped (configuration issue)' : 'โ health:check failed');
}
// TypeScript compilation check
console.log('\n๐ง Running TypeScript compilation check...');
try {
const { stdout, stderr } = await execAsync('npx tsc --noEmit', { timeout: 30000 });
const success = !stderr.includes('error TS');
results.push({
testName: 'TypeScript compilation',
success,
message: success ? 'TypeScript compilation successful' : 'TypeScript compilation failed',
details: success ? 'No compilation errors' : stderr
});
console.log(success ? 'โ
TypeScript compilation passed' : 'โ TypeScript compilation failed');
} catch (error: any) {
results.push({
testName: 'TypeScript compilation',
success: false,
message: 'TypeScript compilation check failed',
details: error.message
});
console.log('โ TypeScript compilation check failed');
}
// ESLint check
console.log('\n๐ Running ESLint check...');
try {
const { stdout, stderr } = await execAsync('npx eslint src --ext .ts', { timeout: 30000 });
const success = !stderr && !stdout.includes('error');
results.push({
testName: 'ESLint',
success,
message: success ? 'No linting errors found' : 'Linting errors found',
details: success ? 'Code style is compliant' : stdout || stderr
});
console.log(success ? 'โ
ESLint passed' : 'โ ESLint failed');
} catch (error: any) {
// ESLintใใชใๅ ดๅใฏในใญใใ
const isNotInstalled = error.message.includes('not found') || error.message.includes('ENOENT');
results.push({
testName: 'ESLint',
success: isNotInstalled, // ใคใณในใใผใซใใใฆใใชใๅ ดๅใฏๆๅใจใใฆๆฑใ
message: isNotInstalled ? 'ESLint not installed (skipped)' : 'ESLint check failed',
details: error.message
});
console.log(isNotInstalled ? 'โ ๏ธ ESLint skipped (not installed)' : 'โ ESLint failed');
}
// Integration tests specific check
console.log('\n๐ Running integration tests specifically...');
try {
const { stdout, stderr } = await execAsync('npx vitest run src/tests/integration/ test/integration/', { timeout: 45000 });
const success = stdout.includes('passed') && !stderr.includes('ERROR');
results.push({
testName: 'Integration Tests',
success,
message: success ? 'Integration tests passed' : 'Integration tests failed',
details: success ? 'All integration tests completed successfully' : stderr || stdout
});
console.log(success ? 'โ
Integration tests passed' : 'โ Integration tests failed');
} catch (error: any) {
results.push({
testName: 'Integration Tests',
success: false,
message: 'Integration tests execution failed',
details: error.message
});
console.log('โ Integration tests execution failed');
}
return results;
}
// Connection Manager specific verification
async function verifyConnectionManagerIntegration(): Promise<VerificationResult[]> {
const results: VerificationResult[] = [];
console.log('\n๐ Verifying ConnectionManager Integration...');
try {
// Import and basic instantiation test
const { default: McpEmailServer } = await import('../src/index.js');
const { ConnectionManager } = await import('../src/connection-manager.js');
const { ConnectionLogger } = await import('../src/connection-logger.js');
const server = new McpEmailServer();
// Check if ConnectionManager is properly integrated
const hasConnectionManager = (server as any).connectionManager instanceof ConnectionManager;
const noDuplicateHandlers = !(server as any).gmailHandler && !(server as any).imapHandler;
const hasAccountManager = (server as any).accountManager;
results.push({
testName: 'ConnectionManager Integration',
success: hasConnectionManager && noDuplicateHandlers && hasAccountManager,
message: hasConnectionManager && noDuplicateHandlers ? 'ConnectionManager properly integrated' : 'ConnectionManager integration issues',
details: `ConnectionManager: ${hasConnectionManager}, No duplicate handlers: ${noDuplicateHandlers}, AccountManager: ${!!hasAccountManager}`
});
// Check ConnectionLogger singleton
const logger1 = ConnectionLogger.getInstance();
const logger2 = ConnectionLogger.getInstance();
const singletonWorking = logger1 === logger2;
results.push({
testName: 'ConnectionLogger Singleton',
success: singletonWorking,
message: singletonWorking ? 'ConnectionLogger singleton working' : 'ConnectionLogger singleton failed',
details: singletonWorking ? 'Same instance returned' : 'Different instances returned'
});
console.log(hasConnectionManager ? 'โ
ConnectionManager integrated' : 'โ ConnectionManager not integrated');
console.log(noDuplicateHandlers ? 'โ
No duplicate handlers' : 'โ Duplicate handlers found');
console.log(singletonWorking ? 'โ
ConnectionLogger singleton working' : 'โ ConnectionLogger singleton failed');
} catch (error: any) {
results.push({
testName: 'ConnectionManager Integration',
success: false,
message: 'Failed to verify ConnectionManager integration',
details: error.message
});
console.log('โ ConnectionManager integration verification failed');
}
return results;
}
// Main execution
async function main() {
console.log('๐ MCP Email Server - System Integration Verification\n');
console.log('=' .repeat(60));
try {
// Run basic system verification
const systemResults = await verifySystemIntegration();
// Run ConnectionManager specific verification
const connectionResults = await verifyConnectionManagerIntegration();
const allResults = [...systemResults, ...connectionResults];
// Print summary
console.log('\n' + '='.repeat(60));
console.log('๐ VERIFICATION SUMMARY');
console.log('='.repeat(60));
let passCount = 0;
let failCount = 0;
let skipCount = 0;
allResults.forEach(result => {
const icon = result.success ? 'โ
' : 'โ';
const status = result.success ? 'PASS' : 'FAIL';
if (result.message.includes('skipped')) {
console.log(`โ ๏ธ SKIP ${result.testName}: ${result.message}`);
skipCount++;
} else {
console.log(`${icon} ${status} ${result.testName}: ${result.message}`);
if (result.success) {
passCount++;
} else {
failCount++;
if (result.details) {
console.log(` Details: ${result.details.substring(0, 200)}${result.details.length > 200 ? '...' : ''}`);
}
}
}
});
console.log('\n' + '-'.repeat(60));
console.log(`๐ Results: ${passCount} passed, ${failCount} failed, ${skipCount} skipped`);
const overallSuccess = failCount === 0;
console.log(`\n๐ฏ Overall Result: ${overallSuccess ? 'โ
ALL VERIFICATIONS PASSED' : 'โ SOME VERIFICATIONS FAILED'}`);
if (overallSuccess) {
console.log('\n๐ System integration verification completed successfully!');
console.log('โจ The ConnectionManager integration is working properly.');
console.log('๐ง All tests and checks are passing.');
} else {
console.log('\nโ ๏ธ Some verifications failed. Please check the details above.');
console.log('๐ Review the failing tests and fix any issues before proceeding.');
}
process.exit(overallSuccess ? 0 : 1);
} catch (error) {
console.error('\n๐ฅ Verification process failed:', error);
process.exit(1);
}
}
// Execute if run directly
if (import.meta.url === `file://${process.argv[1]}`) {
main();
}
export { verifySystemIntegration, verifyConnectionManagerIntegration };