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 returnsAssignmentById(): void { $assignment = $this->createAndSaveAssignment(); $provider = $this->createProvider(); $result = $provider->provide( new Get(), ['id' => (string) $assignment->id], ); self::assertInstanceOf(TeacherAssignmentResource::class, $result); self::assertSame((string) $assignment->id, $result->id); self::assertSame(self::TEACHER_ID, $result->teacherId); } #[Test] public function returnsNullForUnknownId(): void { $provider = $this->createProvider(); $result = $provider->provide( new Get(), ['id' => '550e8400-e29b-41d4-a716-446655440099'], ); self::assertNull($result); } #[Test] public function returnsNullForInvalidUuid(): void { $provider = $this->createProvider(); $result = $provider->provide( new Get(), ['id' => 'not-a-uuid'], ); self::assertNull($result); } #[Test] public function throwsUnauthorizedWhenNoTenant(): void { $tenantContext = new TenantContext(); $provider = $this->createProvider(tenantContext: $tenantContext); $this->expectException(UnauthorizedHttpException::class); $provider->provide( new Get(), ['id' => '550e8400-e29b-41d4-a716-446655440099'], ); } #[Test] public function throwsAccessDeniedWhenNotAuthorized(): void { $provider = $this->createProvider(authorized: false); $this->expectException(AccessDeniedHttpException::class); $provider->provide( new Get(), ['id' => '550e8400-e29b-41d4-a716-446655440099'], ); } private function createAndSaveAssignment(): TeacherAssignment { $assignment = TeacherAssignment::creer( tenantId: TenantId::fromString(self::TENANT_ID), teacherId: UserId::fromString(self::TEACHER_ID), classId: ClassId::fromString(self::CLASS_ID), subjectId: SubjectId::fromString(self::SUBJECT_ID), academicYearId: AcademicYearId::fromString(self::ACADEMIC_YEAR_ID), createdAt: new DateTimeImmutable('2026-02-10 10:00:00'), ); $this->repository->save($assignment); return $assignment; } private function createProvider( bool $authorized = true, ?TenantContext $tenantContext = null, ): TeacherAssignmentItemProvider { $authorizationChecker = $this->createMock(AuthorizationCheckerInterface::class); $authorizationChecker->method('isGranted') ->with(TeacherAssignmentVoter::DELETE) ->willReturn($authorized); return new TeacherAssignmentItemProvider( $this->repository, $tenantContext ?? $this->tenantContext, $authorizationChecker, ); } }