reader = new InMemoryTeacherStatisticsReader(); } #[Test] public function itReturnsEmptyWhenNoPeriodFound(): void { $handler = $this->createHandler(periodInfo: null); $result = $handler(new GetTeacherStatisticsOverviewQuery( teacherId: self::TEACHER_ID, tenantId: self::TENANT_ID, )); self::assertSame([], $result); } #[Test] public function itReturnsClassOverviewDtos(): void { $this->reader->feedClassesSummary([ [ 'classId' => 'class-1', 'className' => '6ème A', 'subjectId' => 'subject-1', 'subjectName' => 'Mathématiques', 'evaluationCount' => 3, 'studentCount' => 25, 'average' => 12.5, 'successRate' => 72.0, ], [ 'classId' => 'class-2', 'className' => '5ème B', 'subjectId' => 'subject-1', 'subjectName' => 'Mathématiques', 'evaluationCount' => 2, 'studentCount' => 28, 'average' => 10.8, 'successRate' => 57.0, ], ]); $handler = $this->createHandler(periodInfo: $this->currentPeriod()); $result = $handler(new GetTeacherStatisticsOverviewQuery( teacherId: self::TEACHER_ID, tenantId: self::TENANT_ID, )); self::assertCount(2, $result); self::assertSame('6ème A', $result[0]->className); self::assertSame(12.5, $result[0]->average); self::assertSame(72.0, $result[0]->successRate); self::assertSame('5ème B', $result[1]->className); } private function createHandler(?PeriodInfo $periodInfo): GetTeacherStatisticsOverviewHandler { $periodFinder = new class($periodInfo) implements PeriodFinder { public function __construct(private readonly ?PeriodInfo $info) { } public function findForDate(DateTimeImmutable $date, TenantId $tenantId): ?PeriodInfo { return $this->info; } }; return new GetTeacherStatisticsOverviewHandler($this->reader, $periodFinder); } private function currentPeriod(): PeriodInfo { return new PeriodInfo( periodId: 'period-1', startDate: new DateTimeImmutable('2026-01-05'), endDate: new DateTimeImmutable('2026-03-31'), ); } }