exporter = new StatisticsExporter(); } #[Test] public function itExportsClassStatisticsToCsv(): void { $stats = new ClassStatisticsDetailDto( average: 12.5, successRate: 72.0, distribution: [0, 0, 1, 2, 3, 2, 1, 0], evolution: [], students: [ new StudentAverageDto( studentId: 's1', studentName: 'Alice Dupont', average: 14.0, inDifficulty: false, trend: 'improving', ), new StudentAverageDto( studentId: 's2', studentName: 'Bob Martin', average: 7.0, inDifficulty: true, trend: 'declining', ), ], ); $csv = $this->exporter->exportClassToCsv($stats, '6ème A', 'Mathématiques'); self::assertNotSame('', $csv); self::assertTrue(str_contains($csv, '6ème A')); self::assertTrue(str_contains($csv, 'Mathématiques')); self::assertTrue(str_contains($csv, '12.5')); self::assertTrue(str_contains($csv, '72%')); self::assertTrue(str_contains($csv, 'Alice Dupont')); self::assertTrue(str_contains($csv, '14')); self::assertTrue(str_contains($csv, 'Progression')); self::assertTrue(str_contains($csv, 'Bob Martin')); self::assertTrue(str_contains($csv, 'Oui')); self::assertTrue(str_contains($csv, 'Régression')); } #[Test] public function itHandlesEmptyStudentList(): void { $stats = new ClassStatisticsDetailDto( average: null, successRate: 0.0, distribution: [0, 0, 0, 0, 0, 0, 0, 0], evolution: [], students: [], ); $csv = $this->exporter->exportClassToCsv($stats, '5ème B', 'Français'); self::assertNotSame('', $csv); self::assertTrue(str_contains($csv, '5ème B')); self::assertTrue(str_contains($csv, 'N/A')); } }