reader = new InMemoryTeacherStatisticsReader(); $this->handler = new GetEvaluationDifficultyHandler( $this->reader, new TeacherStatisticsCalculator(), ); } #[Test] public function itReturnsEmptyWhenNoEvaluations(): void { $result = ($this->handler)($this->query()); self::assertSame([], $result); } #[Test] public function itReturnsEvaluationDifficultyWithComparison(): void { $this->reader->feedEvaluationDifficulties([ [ 'evaluationId' => 'eval-1', 'title' => 'Contrôle chapitre 5', 'classId' => 'class-1', 'className' => '6ème A', 'subjectId' => 'subject-1', 'subjectName' => 'Mathématiques', 'date' => '2026-03-15', 'average' => 12.0, 'gradedCount' => 25, ], ]); // Other teachers' averages for same subject $this->reader->feedOtherTeachersAverages([10.0, 11.0, 13.0]); $result = ($this->handler)($this->query()); self::assertCount(1, $result); self::assertSame('Contrôle chapitre 5', $result[0]->title); self::assertSame(12.0, $result[0]->average); self::assertEqualsWithDelta(11.33, $result[0]->subjectAverage, 0.01); self::assertNotNull($result[0]->percentile); } #[Test] public function itHandlesNoOtherTeachersForComparison(): void { $this->reader->feedEvaluationDifficulties([ [ 'evaluationId' => 'eval-1', 'title' => 'Test unique', 'classId' => 'class-1', 'className' => '6ème A', 'subjectId' => 'subject-1', 'subjectName' => 'Musique', 'date' => '2026-03-15', 'average' => 14.0, 'gradedCount' => 20, ], ]); $this->reader->feedOtherTeachersAverages([]); $result = ($this->handler)($this->query()); self::assertCount(1, $result); self::assertNull($result[0]->subjectAverage); self::assertNull($result[0]->percentile); } private function query(): GetEvaluationDifficultyQuery { return new GetEvaluationDifficultyQuery( teacherId: self::TEACHER_ID, tenantId: self::TENANT_ID, ); } }