diff --git a/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index dff43279..268dc29b 100644 --- a/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -831,4 +831,85 @@ public function testValidateUniquenessCause() ->setCode(UniqueEntity::NOT_UNIQUE_ERROR) ->assertRaised(); } + + /** + * @dataProvider resultWithEmptyIterator + */ + public function testValidateUniquenessWithEmptyIterator($entity, $result) + { + $constraint = new UniqueEntity([ + 'message' => 'myMessage', + 'fields' => ['name'], + 'em' => self::EM_NAME, + 'repositoryMethod' => 'findByCustom', + ]); + + $repository = $this->createRepositoryMock(); + $repository->expects($this->once()) + ->method('findByCustom') + ->willReturn($result) + ; + $this->em = $this->createEntityManagerMock($repository); + $this->registry = $this->createRegistryMock($this->em); + $this->validator = $this->createValidator(); + $this->validator->initialize($this->context); + + $this->validator->validate($entity, $constraint); + + $this->assertNoViolation(); + } + + public function resultWithEmptyIterator(): array + { + $entity = new SingleIntIdEntity(1, 'foo'); + + return [ + [$entity, new class() implements \Iterator { + public function current() + { + return null; + } + + public function valid(): bool + { + return false; + } + + public function next() + { + } + + public function key() + { + } + + public function rewind() + { + } + }], + [$entity, new class() implements \Iterator { + public function current() + { + return false; + } + + public function valid(): bool + { + return false; + } + + public function next() + { + } + + public function key() + { + } + + public function rewind() + { + } + }], + ]; + } } diff --git a/Validator/Constraints/UniqueEntityValidator.php b/Validator/Constraints/UniqueEntityValidator.php index cc811ef4..bed785cb 100644 --- a/Validator/Constraints/UniqueEntityValidator.php +++ b/Validator/Constraints/UniqueEntityValidator.php @@ -147,8 +147,7 @@ public function validate($entity, Constraint $constraint) if ($result instanceof \Countable && 1 < \count($result)) { $result = [$result->current(), $result->current()]; } else { - $result = $result->current(); - $result = null === $result ? [] : [$result]; + $result = $result->valid() && null !== $result->current() ? [$result->current()] : []; } } elseif (\is_array($result)) { reset($result);