[Validator] Fixed default group for nested composite constraints

This commit is contained in:
Jules Pietri 2020-04-06 21:16:17 +02:00
parent 5da141b8d0
commit 117ee34698
No known key found for this signature in database
GPG Key ID: C924CC98D39AA885
4 changed files with 62 additions and 2 deletions

View File

@ -88,7 +88,8 @@ abstract class Composite extends Constraint
}
}
$this->groups = array_keys($mergedGroups);
// prevent empty composite constraint to have empty groups
$this->groups = array_keys($mergedGroups) ?: [self::DEFAULT_GROUP];
$this->$compositeOption = $nestedConstraints;
return;

View File

@ -100,4 +100,16 @@ class CollectionTest extends TestCase
$this->assertEquals($collection1, $collection2);
}
public function testConstraintHasDefaultGroupWithOptionalValues()
{
$constraint = new Collection([
'foo' => new Required(),
'bar' => new Optional(),
]);
$this->assertEquals(['Default'], $constraint->groups);
$this->assertEquals(['Default'], $constraint->fields['foo']->groups);
$this->assertEquals(['Default'], $constraint->fields['bar']->groups);
}
}

View File

@ -143,6 +143,29 @@ abstract class CollectionValidatorTest extends ConstraintValidatorTestCase
->assertRaised();
}
public function testExtraFieldsDisallowedWithOptionalValues()
{
$constraint = new Optional();
$data = $this->prepareTestData([
'baz' => 6,
]);
$this->validator->validate($data, new Collection([
'fields' => [
'foo' => $constraint,
],
'extraFieldsMessage' => 'myMessage',
]));
$this->buildViolation('myMessage')
->setParameter('{{ field }}', '"baz"')
->atPath('property.path[baz]')
->setInvalidValue(6)
->setCode(Collection::NO_SUCH_FIELD_ERROR)
->assertRaised();
}
// bug fix
public function testNullNotConsideredExtraField()
{

View File

@ -19,7 +19,7 @@ use Symfony\Component\Validator\Constraints\Valid;
class ConcreteComposite extends Composite
{
public $constraints;
public $constraints = [];
protected function getCompositeOption()
{
@ -37,6 +37,30 @@ class ConcreteComposite extends Composite
*/
class CompositeTest extends TestCase
{
public function testConstraintHasDefaultGroup()
{
$constraint = new ConcreteComposite([
new NotNull(),
new NotBlank(),
]);
$this->assertEquals(['Default'], $constraint->groups);
$this->assertEquals(['Default'], $constraint->constraints[0]->groups);
$this->assertEquals(['Default'], $constraint->constraints[1]->groups);
}
public function testNestedCompositeConstraintHasDefaultGroup()
{
$constraint = new ConcreteComposite([
new ConcreteComposite(),
new ConcreteComposite(),
]);
$this->assertEquals(['Default'], $constraint->groups);
$this->assertEquals(['Default'], $constraint->constraints[0]->groups);
$this->assertEquals(['Default'], $constraint->constraints[1]->groups);
}
public function testMergeNestedGroupsIfNoExplicitParentGroup()
{
$constraint = new ConcreteComposite([