repository = new InMemoryTeacherAssignmentRepository(); $this->tenantContext = new TenantContext(); $this->tenantContext->setCurrentTenant(new TenantConfig( tenantId: InfraTenantId::fromString(self::TENANT_ID), subdomain: 'ecole-alpha', databaseUrl: 'postgresql://test', )); } #[Test] public function returnsTeachersForClass(): void { $this->createAndSaveAssignment('550e8400-e29b-41d4-a716-446655440010'); $this->createAndSaveAssignment('550e8400-e29b-41d4-a716-446655440011'); $provider = $this->createProvider(); $results = $provider->provide( new GetCollection(), ['classId' => self::CLASS_ID], ); self::assertCount(2, $results); self::assertContainsOnlyInstancesOf(TeacherAssignmentResource::class, $results); } #[Test] public function returnsEmptyArrayWhenNoTeachersAssigned(): void { $provider = $this->createProvider(); $results = $provider->provide( new GetCollection(), ['classId' => self::CLASS_ID], ); self::assertSame([], $results); } #[Test] public function throwsBadRequestForInvalidUuid(): void { $provider = $this->createProvider(); $this->expectException(\Symfony\Component\HttpKernel\Exception\BadRequestHttpException::class); $provider->provide( new GetCollection(), ['classId' => 'not-a-uuid'], ); } #[Test] public function throwsAccessDeniedWhenNotAuthorized(): void { $provider = $this->createProvider(authorized: false); $this->expectException(AccessDeniedHttpException::class); $provider->provide( new GetCollection(), ['classId' => self::CLASS_ID], ); } #[Test] public function throwsUnauthorizedWhenNoTenant(): void { $tenantContext = new TenantContext(); $provider = $this->createProvider(tenantContext: $tenantContext); $this->expectException(UnauthorizedHttpException::class); $provider->provide( new GetCollection(), ['classId' => self::CLASS_ID], ); } private function createAndSaveAssignment(string $teacherId): void { $assignment = TeacherAssignment::creer( tenantId: TenantId::fromString(self::TENANT_ID), teacherId: UserId::fromString($teacherId), classId: ClassId::fromString(self::CLASS_ID), subjectId: SubjectId::fromString('550e8400-e29b-41d4-a716-446655440030'), academicYearId: AcademicYearId::fromString(self::ACADEMIC_YEAR_ID), createdAt: new DateTimeImmutable('2026-02-10 10:00:00'), ); $this->repository->save($assignment); } private function createProvider( bool $authorized = true, ?TenantContext $tenantContext = null, ): TeacherAssignmentsByClassProvider { $handler = new GetTeachersForClassHandler($this->repository); $authorizationChecker = $this->createMock(AuthorizationCheckerInterface::class); $authorizationChecker->method('isGranted') ->with(TeacherAssignmentVoter::VIEW) ->willReturn($authorized); return new TeacherAssignmentsByClassProvider( $handler, $tenantContext ?? $this->tenantContext, $authorizationChecker, ); } }