import CommanderCommand from '../../CommanderCommand'; import chalk from 'chalk'; import ora from 'ora'; import DojoBackendManager from '../../../managers/DojoBackendManager'; import Result from '../../../sharedByClients/models/Result'; import inquirer from 'inquirer'; class ExerciseResultCommand extends CommanderCommand { protected commandName: string = 'result'; protected defineCommand(): void { this.command .description('results of an exercise') .argument('<idOrLink>', 'display results of a specific exercise by Id or Gitlab Link') .action(this.commandAction.bind(this)); } protected async commandAction(idOrLink: string): Promise<void> { const spinner = ora('Fetching exercise results...').start(); try { const exerciseId = this.extractExerciseId(idOrLink); // console.log('Exercise ID:', exerciseId); spinner.info(`Fetching results for exercise with ID: ${exerciseId}`); const results = await DojoBackendManager.getExerciseResults(exerciseId); if (!results) { spinner.info('No results found for this exercise.'); spinner.succeed('Exercise results fetched successfully.'); return; } if (results.length === 0) { spinner.info('No results found for this exercise.'); } else { const answer = await inquirer.prompt([ { type: 'list', name: 'testType', message: 'Choisissez le type de tests à afficher:', choices: ['Tests réussis', 'Tests échoués', 'Les deux'], } ]); const { testType } = answer; this.displayResults(results, testType); spinner.succeed('Exercise results fetched successfully.'); } } catch (error) { spinner.fail('Error fetching exercise results.'); console.error(error); } } private extractExerciseId(idOrLink: string): string { if (idOrLink.length <= 36) { return idOrLink; } else { const lastUnderscoreIndex = idOrLink.lastIndexOf('_'); // console.log('Last underscore index:', lastUnderscoreIndex); if (lastUnderscoreIndex !== -1) { // -1 = pas de underscore trouvé return idOrLink.substring(lastUnderscoreIndex + 1); // Extrait la sous-chaîne après le dernier underscore dans idOrLink } else { return ''; } } } private displayResults(results: Result[], testType: string): void { if (!results || results.length === 0) { console.log('No results to display.'); return; } // Filtrer les résultats en fonction du type de test choisi const filteredResults = results.filter(result => { if (testType === 'Tests réussis') { return result.success; } else if (testType === 'Tests échoués') { return !result.success; } return true; // 'Les deux' ou autre }); if (filteredResults.length === 0) { console.log('No results to display for the selected test type.'); return; } filteredResults.forEach(result => { console.log(chalk.magenta(`Résultats de l\`exercice : ${result.exerciseId}`)); console.log(` - Date et heure : ${result.dateTime}`); console.log(` - Succès : ${result.success ? chalk.green('Oui') : chalk.red('Non')}`); console.log(' - Détails des résultats :'); console.log(` - Tests réussis : ${result.results.successfulTests}`); console.log(` - Tests échoués : ${result.results.failedTests}`); if (testType === 'Tests réussis' || testType === 'Les deux') { console.log(' - Liste des tests réussis :'); if (Array.isArray(result.results.successfulTestsList)) { result.results.successfulTestsList.forEach((test: string) => { console.log(` - ${test} ${chalk.green('\u2713')}`); }); } } if (testType === 'Tests échoués' || testType === 'Les deux') { console.log(' - Liste des tests échoués :'); if (Array.isArray(result.results.failedTestsList)) { result.results.failedTestsList.forEach((test: string) => { console.log(` - ${test} ${chalk.red('\u2717')}`); }); } } console.log('-----------------------------------'); }); } } export default new ExerciseResultCommand();