seo-generator-server/tools/inject-auto-reporter.js
StillHammer 4f60de68d6 Fix BatchProcessor initialization and add comprehensive test suite
- Fix BatchProcessor constructor to avoid server blocking during startup
- Add comprehensive integration tests for all modular combinations
- Enhance CLAUDE.md documentation with new test commands
- Update SelectiveLayers configuration for better LLM allocation
- Add AutoReporter system for test automation
- Include production workflow validation tests

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-19 14:17:49 +08:00

168 lines
5.5 KiB
JavaScript

#!/usr/bin/env node
/**
* INJECTION AUTOMATIQUE DE L'AUTO-REPORTER DANS TOUS LES TESTS
* Modifie automatiquement tous les fichiers .test.js pour inclure l'AutoReporter
*/
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const projectRoot = path.join(__dirname, '..');
function findTestFiles(dir) {
const testFiles = [];
function scanDir(currentDir) {
const items = fs.readdirSync(currentDir);
for (const item of items) {
const fullPath = path.join(currentDir, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
scanDir(fullPath);
} else if (item.endsWith('.test.js')) {
testFiles.push(fullPath);
}
}
}
scanDir(dir);
return testFiles;
}
// Code à injecter
const AUTOREPORTER_IMPORT = `import { AutoReporter } from './reporters/AutoReporter.js';`;
const AUTOREPORTER_RELATIVE_IMPORT = `import { AutoReporter } from '../reporters/AutoReporter.js';`;
const AUTOREPORTER_INIT = `const autoReporter = new AutoReporter();`;
function getRelativeImportPath(filePath) {
const testDir = path.dirname(filePath);
const reportersPath = path.join(projectRoot, 'tests', 'reporters', 'AutoReporter.js');
// Calculer le chemin relatif depuis le fichier de test vers AutoReporter
const relativePath = path.relative(testDir, reportersPath);
// Normaliser pour utiliser des slashes (même sur Windows)
const normalizedPath = relativePath.replace(/\\/g, '/');
// Si le fichier est dans le répertoire tests/, utiliser ./
if (normalizedPath.startsWith('../')) {
return normalizedPath;
} else {
return './' + normalizedPath;
}
}
async function injectAutoReporterIntoFile(filePath) {
try {
const content = fs.readFileSync(filePath, 'utf8');
// Vérifier si AutoReporter est déjà importé
if (content.includes('AutoReporter')) {
console.log(`⏭️ SKIP: ${filePath} (AutoReporter déjà présent)`);
return false;
}
// Calculer l'import relatif correct
const relativeImportPath = getRelativeImportPath(filePath);
const autoReporterImport = `import { AutoReporter } from '${relativeImportPath}';`;
const lines = content.split('\n');
let modifiedLines = [...lines];
let hasImports = false;
let importInsertIndex = 0;
let initInsertIndex = 0;
// Trouver où insérer l'import
for (let i = 0; i < lines.length; i++) {
const line = lines[i].trim();
if (line.startsWith('import ')) {
hasImports = true;
importInsertIndex = i + 1;
} else if (hasImports && !line.startsWith('import ') && line !== '') {
break;
}
}
// Si pas d'imports, insérer au début
if (!hasImports) {
importInsertIndex = 0;
}
// Trouver où insérer l'initialisation (après les imports et avant le premier test)
for (let i = importInsertIndex; i < lines.length; i++) {
const line = lines[i].trim();
if (line.startsWith('test(') || line.startsWith('describe(')) {
initInsertIndex = i;
break;
}
}
// Insérer l'import
modifiedLines.splice(importInsertIndex, 0, autoReporterImport);
// Insérer l'initialisation (avec décalage car on a ajouté une ligne)
const actualInitIndex = initInsertIndex + 1;
modifiedLines.splice(actualInitIndex, 0, '', '// Auto-Reporter Configuration', AUTOREPORTER_INIT, '');
const newContent = modifiedLines.join('\n');
// Écrire le fichier modifié
fs.writeFileSync(filePath, newContent, 'utf8');
console.log(`✅ MODIFIÉ: ${filePath}`);
return true;
} catch (error) {
console.error(`❌ ERREUR: ${filePath} - ${error.message}`);
return false;
}
}
async function main() {
console.log('🔧 === INJECTION AUTO-REPORTER DANS TOUS LES TESTS ===');
let modifiedFiles = 0;
let totalFiles = 0;
try {
const testsDir = path.join(projectRoot, 'tests');
const files = findTestFiles(testsDir);
console.log(`\n📋 Trouvé ${files.length} fichiers de test`);
for (const file of files) {
// Skip certains fichiers spéciaux
const fileName = path.basename(file);
if (fileName.includes('AutoReporter') || fileName.includes('commonjs-bridge')) {
console.log(`⏭️ SKIP: ${file} (fichier système)`);
continue;
}
totalFiles++;
const wasModified = await injectAutoReporterIntoFile(file);
if (wasModified) {
modifiedFiles++;
}
}
} catch (error) {
console.error(`❌ Erreur lors de la recherche des fichiers:`, error.message);
}
console.log(`\n📊 === RÉSUMÉ ===`);
console.log(`📁 Fichiers traités: ${totalFiles}`);
console.log(`✅ Fichiers modifiés: ${modifiedFiles}`);
console.log(`⏭️ Fichiers déjà configurés: ${totalFiles - modifiedFiles}`);
if (modifiedFiles > 0) {
console.log('\n🎉 AutoReporter injecté avec succès dans tous les tests !');
console.log('💡 Vous pouvez maintenant lancer: npm run test:all-with-reporter');
}
}
main().catch(console.error);