userRepository = new InMemoryUserRepository(); $this->handler = new GetStudentsImageRightsHandler($this->userRepository); } #[Test] public function returnsOnlyStudents(): void { $this->seedStudentsAndParent(); $query = new GetStudentsImageRightsQuery(tenantId: self::TENANT_ID); $result = ($this->handler)($query); self::assertCount(2, $result); } #[Test] public function filtersStudentsByStatus(): void { $this->seedStudentsAndParent(); $query = new GetStudentsImageRightsQuery( tenantId: self::TENANT_ID, status: 'authorized', ); $result = ($this->handler)($query); self::assertCount(1, $result); self::assertSame('authorized', $result[0]->imageRightsStatus); } #[Test] public function returnsEmptyForNoStudents(): void { $query = new GetStudentsImageRightsQuery(tenantId: self::TENANT_ID); $result = ($this->handler)($query); self::assertCount(0, $result); } #[Test] public function doesNotReturnStudentsFromOtherTenant(): void { $this->seedStudentsAndParent(); $query = new GetStudentsImageRightsQuery( tenantId: '550e8400-e29b-41d4-a716-446655440099', ); $result = ($this->handler)($query); self::assertCount(0, $result); } #[Test] public function returnsDtoWithCorrectFields(): void { $this->seedStudentsAndParent(); $query = new GetStudentsImageRightsQuery( tenantId: self::TENANT_ID, status: 'authorized', ); $result = ($this->handler)($query); self::assertCount(1, $result); $dto = $result[0]; self::assertSame('Alice', $dto->firstName); self::assertSame('Dupont', $dto->lastName); self::assertSame('authorized', $dto->imageRightsStatus); self::assertSame('Autorisé', $dto->imageRightsStatusLabel); } private function seedStudentsAndParent(): void { $student1 = User::inviter( email: new Email('alice@example.com'), role: Role::ELEVE, tenantId: TenantId::fromString(self::TENANT_ID), schoolName: 'École Alpha', firstName: 'Alice', lastName: 'Dupont', invitedAt: new DateTimeImmutable('2026-01-15'), dateNaissance: new DateTimeImmutable('2012-06-15'), ); $student1->modifierDroitImage( ImageRightsStatus::AUTHORIZED, UserId::fromString('550e8400-e29b-41d4-a716-446655440099'), new DateTimeImmutable('2026-02-01'), ); $student2 = User::inviter( email: new Email('bob@example.com'), role: Role::ELEVE, tenantId: TenantId::fromString(self::TENANT_ID), schoolName: 'École Alpha', firstName: 'Bob', lastName: 'Martin', invitedAt: new DateTimeImmutable('2026-01-15'), dateNaissance: new DateTimeImmutable('2013-03-20'), ); // Bob has default NOT_SPECIFIED $parent = User::inviter( email: new Email('parent@example.com'), role: Role::PARENT, tenantId: TenantId::fromString(self::TENANT_ID), schoolName: 'École Alpha', firstName: 'Pierre', lastName: 'Dupont', invitedAt: new DateTimeImmutable('2026-01-15'), ); $this->userRepository->save($student1); $this->userRepository->save($student2); $this->userRepository->save($parent); } }