Skip to content

Commit

Permalink
[Validator] fix lazy property usage.
Browse files Browse the repository at this point in the history
  • Loading branch information
bendavies authored and xabbuh committed May 2, 2020
1 parent f7749c3 commit 281861e
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 13 deletions.
10 changes: 10 additions & 0 deletions src/Symfony/Component/Validator/Tests/Fixtures/Entity.php
Expand Up @@ -53,6 +53,11 @@ public function __construct($internal = null)
$this->internal = $internal;
}

public function getFirstName()
{
return $this->firstName;
}

public function getInternal()
{
return $this->internal.' from getter';
Expand Down Expand Up @@ -141,4 +146,9 @@ public function setChildB($childB)
{
$this->childB = $childB;
}

public function getReference()
{
return $this->reference;
}
}
Expand Up @@ -32,6 +32,8 @@ abstract class AbstractValidatorTest extends TestCase

const REFERENCE_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\Reference';

const LAZY_PROPERTY = 'Symfony\Component\Validator\Validator\LazyProperty';

/**
* @var FakeMetadataFactory
*/
Expand All @@ -54,6 +56,7 @@ protected function setUp()
$this->referenceMetadata = new ClassMetadata(self::REFERENCE_CLASS);
$this->metadataFactory->addMetadata($this->metadata);
$this->metadataFactory->addMetadata($this->referenceMetadata);
$this->metadataFactory->addMetadata(new ClassMetadata(self::LAZY_PROPERTY));
}

protected function tearDown()
Expand Down Expand Up @@ -510,7 +513,10 @@ public function testFailOnScalarReferences()
$this->validate($entity);
}

public function testArrayReference()
/**
* @dataProvider getConstraintMethods
*/
public function testArrayReference($constraintMethod)
{
$entity = new Entity();
$entity->reference = ['key' => new Reference()];
Expand All @@ -528,7 +534,7 @@ public function testArrayReference()
$context->addViolation('Message %param%', ['%param%' => 'value']);
};

$this->metadata->addPropertyConstraint('reference', new Valid());
$this->metadata->$constraintMethod('reference', new Valid());
$this->referenceMetadata->addConstraint(new Callback([
'callback' => $callback,
'groups' => 'Group',
Expand All @@ -548,8 +554,10 @@ public function testArrayReference()
$this->assertNull($violations[0]->getCode());
}

// https://github.com/symfony/symfony/issues/6246
public function testRecursiveArrayReference()
/**
* @dataProvider getConstraintMethods
*/
public function testRecursiveArrayReference($constraintMethod)
{
$entity = new Entity();
$entity->reference = [2 => ['key' => new Reference()]];
Expand All @@ -567,7 +575,7 @@ public function testRecursiveArrayReference()
$context->addViolation('Message %param%', ['%param%' => 'value']);
};

$this->metadata->addPropertyConstraint('reference', new Valid());
$this->metadata->$constraintMethod('reference', new Valid());
$this->referenceMetadata->addConstraint(new Callback([
'callback' => $callback,
'groups' => 'Group',
Expand Down Expand Up @@ -611,7 +619,10 @@ public function testOnlyCascadedArraysAreTraversed()
$this->assertCount(0, $violations);
}

public function testArrayTraversalCannotBeDisabled()
/**
* @dataProvider getConstraintMethods
*/
public function testArrayTraversalCannotBeDisabled($constraintMethod)
{
$entity = new Entity();
$entity->reference = ['key' => new Reference()];
Expand All @@ -620,7 +631,7 @@ public function testArrayTraversalCannotBeDisabled()
$context->addViolation('Message %param%', ['%param%' => 'value']);
};

$this->metadata->addPropertyConstraint('reference', new Valid([
$this->metadata->$constraintMethod('reference', new Valid([
'traverse' => false,
]));
$this->referenceMetadata->addConstraint(new Callback($callback));
Expand All @@ -631,7 +642,10 @@ public function testArrayTraversalCannotBeDisabled()
$this->assertCount(1, $violations);
}

public function testRecursiveArrayTraversalCannotBeDisabled()
/**
* @dataProvider getConstraintMethods
*/
public function testRecursiveArrayTraversalCannotBeDisabled($constraintMethod)
{
$entity = new Entity();
$entity->reference = [2 => ['key' => new Reference()]];
Expand All @@ -640,9 +654,10 @@ public function testRecursiveArrayTraversalCannotBeDisabled()
$context->addViolation('Message %param%', ['%param%' => 'value']);
};

$this->metadata->addPropertyConstraint('reference', new Valid([
$this->metadata->$constraintMethod('reference', new Valid([
'traverse' => false,
]));

$this->referenceMetadata->addConstraint(new Callback($callback));

$violations = $this->validate($entity);
Expand All @@ -651,25 +666,31 @@ public function testRecursiveArrayTraversalCannotBeDisabled()
$this->assertCount(1, $violations);
}

public function testIgnoreScalarsDuringArrayTraversal()
/**
* @dataProvider getConstraintMethods
*/
public function testIgnoreScalarsDuringArrayTraversal($constraintMethod)
{
$entity = new Entity();
$entity->reference = ['string', 1234];

$this->metadata->addPropertyConstraint('reference', new Valid());
$this->metadata->$constraintMethod('reference', new Valid());

$violations = $this->validate($entity);

/* @var ConstraintViolationInterface[] $violations */
$this->assertCount(0, $violations);
}

public function testIgnoreNullDuringArrayTraversal()
/**
* @dataProvider getConstraintMethods
*/
public function testIgnoreNullDuringArrayTraversal($constraintMethod)
{
$entity = new Entity();
$entity->reference = [null];

$this->metadata->addPropertyConstraint('reference', new Valid());
$this->metadata->$constraintMethod('reference', new Valid());

$violations = $this->validate($entity);

Expand Down Expand Up @@ -1218,6 +1239,14 @@ public function testReplaceDefaultGroup($sequence, array $assertViolations)
}
}

public function getConstraintMethods()
{
return [
['addPropertyConstraint'],
['addGetterConstraint'],
];
}

public function getTestReplaceDefaultGroup()
{
return [
Expand Down
Expand Up @@ -677,6 +677,10 @@ private function validateGenericNode($value, $object, $cacheKey, MetadataInterfa
// See validateClassNode()
$cascadedGroups = null !== $cascadedGroups && \count($cascadedGroups) > 0 ? $cascadedGroups : $groups;

if ($value instanceof LazyProperty) {
$value = $value->getPropertyValue();
}

if (\is_array($value)) {
// Arrays are always traversed, independent of the specified
// traversal strategy
Expand Down

0 comments on commit 281861e

Please sign in to comment.