import { execSync } from 'child_process'; import fs from 'fs/promises'; import path from 'path'; import { Command } from 'commander'; export interface TestAgentOptions {} export interface TestAgentResult { success: boolean; metrics?: { lines: number; functions: number; branches: number; statements: number; }; summary?: { total: number; passed: number; failed: number; duration: string; }; output?: string; } /** * Exécute les tests et collecte le rapport de couverture. */ /** * Exécute les tests Jest avec couverture (json-summary) et retourne les métriques globales. */ export async function testAgent( _opts?: TestAgentOptions, ): Promise { try { // Run Jest to generate coverage summary and test results JSON const start = Date.now(); execSync( 'pnpm exec jest --coverage --coverageReporters=json-summary --json --outputFile=jest-results.json', { stdio: 'inherit' }, ); const durationMs = Date.now() - start; const duration = `${(durationMs / 1000).toFixed(2)}s`; // Read coverage-summary.json const summaryPath = path.resolve(process.cwd(), 'coverage', 'coverage-summary.json'); const raw = await fs.readFile(summaryPath, 'utf8'); const data = JSON.parse(raw).total; const metrics = { lines: data.lines.pct, functions: data.functions.pct, branches: data.branches.pct, statements: data.statements.pct, }; // Read test summary const resultsRaw = await fs.readFile(path.resolve(process.cwd(), 'jest-results.json'), 'utf8'); const results = JSON.parse(resultsRaw); const summary = { total: results.numTotalTests ?? 0, passed: results.numPassedTests ?? 0, failed: results.numFailedTests ?? 0, duration, }; return { success: true, metrics, summary }; } catch (err: unknown) { const msg = err instanceof Error ? err.message : String(err); return { success: false, output: msg }; } } export const cli = { command: 'qualimetrie:test', description: 'Exécute les tests et génère un rapport de couverture', builder: (cmd: Command) => cmd, handler: async (_opts: unknown) => { // eslint-disable-next-line @typescript-eslint/no-var-requires const { testAgent: run } = require('./testAgent'); const res = await run(); if (!res.success || !res.metrics || !res.summary) { console.error(`❌ Erreur lors de l'exécution des tests ou de la collecte de couverture:`); console.error(res.output); process.exit(1); } const { metrics, summary } = res; // Génération du rapport Markdown console.log('Test Summary:'); console.log(`- Total: ${summary.total}`); console.log(`- Passed: ${summary.passed}`); console.log(`- Failed: ${summary.failed}`); console.log(`- Duration: ${summary.duration}`); console.log('Coverage Summary:'); console.log(`- Lines: **${metrics.lines}%**`); console.log(`- Functions: **${metrics.functions}%**`); console.log(`- Branches: **${metrics.branches}%**`); console.log(`- Statements: **${metrics.statements}%**`); }, };