From a9e9359581fe95be6b6fda9a8129e7c5258fbb4c Mon Sep 17 00:00:00 2001 From: FabienSalles Date: Mon, 1 Feb 2021 18:18:40 +0100 Subject: [PATCH] fix validator when we have a false current element fix coding styles add type in return --- .../Constraints/UniqueEntityValidatorTest.php | 81 +++++++++++++++++++ .../Constraints/UniqueEntityValidator.php | 3 +- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index d8b7abc806..05faff5872 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -793,4 +793,85 @@ class UniqueEntityValidatorTest extends ConstraintValidatorTestCase ->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/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index 4324dfde55..399a18d90c 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -147,8 +147,7 @@ class UniqueEntityValidator extends ConstraintValidator 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);