evaluationRepository = new InMemoryEvaluationRepository(); $this->clock = new class implements Clock { public function now(): DateTimeImmutable { return new DateTimeImmutable('2026-03-14 08:00:00'); } }; } #[Test] public function itSoftDeletesEvaluation(): void { $evaluation = $this->createAndSaveEvaluation(); $handler = $this->createHandler(); $result = $handler(new DeleteEvaluationCommand( tenantId: self::TENANT_ID, evaluationId: (string) $evaluation->id, teacherId: self::TEACHER_ID, )); self::assertSame(EvaluationStatus::DELETED, $result->status); } #[Test] public function itThrowsWhenTeacherIsNotOwner(): void { $evaluation = $this->createAndSaveEvaluation(); $handler = $this->createHandler(); $this->expectException(NonProprietaireDeLEvaluationException::class); $handler(new DeleteEvaluationCommand( tenantId: self::TENANT_ID, evaluationId: (string) $evaluation->id, teacherId: self::OTHER_TEACHER_ID, )); } #[Test] public function itThrowsWhenEvaluationNotFound(): void { $handler = $this->createHandler(); $this->expectException(EvaluationNotFoundException::class); $handler(new DeleteEvaluationCommand( tenantId: self::TENANT_ID, evaluationId: '550e8400-e29b-41d4-a716-446655449999', teacherId: self::TEACHER_ID, )); } #[Test] public function itThrowsWhenAlreadyDeleted(): void { $evaluation = $this->createAndSaveEvaluation(); $evaluation->supprimer(new DateTimeImmutable('2026-03-13')); $this->evaluationRepository->save($evaluation); $handler = $this->createHandler(); $this->expectException(EvaluationDejaSupprimeeException::class); $handler(new DeleteEvaluationCommand( tenantId: self::TENANT_ID, evaluationId: (string) $evaluation->id, teacherId: self::TEACHER_ID, )); } private function createHandler(): DeleteEvaluationHandler { return new DeleteEvaluationHandler( $this->evaluationRepository, $this->clock, ); } private function createAndSaveEvaluation(): Evaluation { $evaluation = Evaluation::creer( tenantId: TenantId::fromString(self::TENANT_ID), classId: ClassId::fromString(self::CLASS_ID), subjectId: SubjectId::fromString(self::SUBJECT_ID), teacherId: UserId::fromString(self::TEACHER_ID), title: 'Contrôle chapitre 5', description: 'Évaluation sur les fonctions', evaluationDate: new DateTimeImmutable('2026-04-15'), gradeScale: new GradeScale(20), coefficient: new Coefficient(1.0), now: new DateTimeImmutable('2026-03-12 10:00:00'), ); $this->evaluationRepository->save($evaluation); return $evaluation; } }