forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			390 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			390 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|  * This file is part of the Symfony package.
 | |
|  *
 | |
|  * (c) Fabien Potencier <fabien@symfony.com>
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| namespace Symfony\Component\Validator\Tests\Constraints;
 | |
| 
 | |
| use Symfony\Component\Validator\Constraints\Collection;
 | |
| use Symfony\Component\Validator\Constraints\CollectionValidator;
 | |
| use Symfony\Component\Validator\Constraints\NotNull;
 | |
| use Symfony\Component\Validator\Constraints\Optional;
 | |
| use Symfony\Component\Validator\Constraints\Range;
 | |
| use Symfony\Component\Validator\Constraints\Required;
 | |
| use Symfony\Component\Validator\Validation;
 | |
| 
 | |
| abstract class CollectionValidatorTest extends AbstractConstraintValidatorTest
 | |
| {
 | |
|     protected function getApiVersion()
 | |
|     {
 | |
|         return Validation::API_VERSION_2_5;
 | |
|     }
 | |
| 
 | |
|     protected function createValidator()
 | |
|     {
 | |
|         return new CollectionValidator();
 | |
|     }
 | |
| 
 | |
|     abstract protected function prepareTestData(array $contents);
 | |
| 
 | |
|     public function testNullIsValid()
 | |
|     {
 | |
|         $this->validator->validate(null, new Collection(array('fields' => array(
 | |
|             'foo' => new Range(array('min' => 4)),
 | |
|         ))));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testFieldsAsDefaultOption()
 | |
|     {
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $data = $this->prepareTestData(array('foo' => 'foobar'));
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $data['foo'], array($constraint));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => $constraint,
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @expectedException \Symfony\Component\Validator\Exception\UnexpectedTypeException
 | |
|      */
 | |
|     public function testThrowsExceptionIfNotTraversable()
 | |
|     {
 | |
|         $this->validator->validate('foobar', new Collection(array('fields' => array(
 | |
|             'foo' => new Range(array('min' => 4)),
 | |
|         ))));
 | |
|     }
 | |
| 
 | |
|     public function testWalkSingleConstraint()
 | |
|     {
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $array = array(
 | |
|             'foo' => 3,
 | |
|             'bar' => 5,
 | |
|         );
 | |
| 
 | |
|         $i = 0;
 | |
| 
 | |
|         foreach ($array as $key => $value) {
 | |
|             $this->expectValidateValueAt($i++, '['.$key.']', $value, array($constraint));
 | |
|         }
 | |
| 
 | |
|         $data = $this->prepareTestData($array);
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => $constraint,
 | |
|                 'bar' => $constraint,
 | |
|             ),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testWalkMultipleConstraints()
 | |
|     {
 | |
|         $constraints = array(
 | |
|             new Range(array('min' => 4)),
 | |
|             new NotNull(),
 | |
|         );
 | |
| 
 | |
|         $array = array(
 | |
|             'foo' => 3,
 | |
|             'bar' => 5,
 | |
|         );
 | |
| 
 | |
|         $i = 0;
 | |
| 
 | |
|         foreach ($array as $key => $value) {
 | |
|             $this->expectValidateValueAt($i++, '['.$key.']', $value, $constraints);
 | |
|         }
 | |
| 
 | |
|         $data = $this->prepareTestData($array);
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => $constraints,
 | |
|                 'bar' => $constraints,
 | |
|             ),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testExtraFieldsDisallowed()
 | |
|     {
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $data = $this->prepareTestData(array(
 | |
|             'foo' => 5,
 | |
|             'baz' => 6,
 | |
|         ));
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $data['foo'], array($constraint));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 '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()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array(
 | |
|             'foo' => null,
 | |
|         ));
 | |
| 
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $data['foo'], array($constraint));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => $constraint,
 | |
|             ),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testExtraFieldsAllowed()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array(
 | |
|             'foo' => 5,
 | |
|             'bar' => 6,
 | |
|         ));
 | |
| 
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $data['foo'], array($constraint));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => $constraint,
 | |
|             ),
 | |
|             'allowExtraFields' => true,
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testMissingFieldsDisallowed()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array());
 | |
| 
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => $constraint,
 | |
|             ),
 | |
|             'missingFieldsMessage' => 'myMessage',
 | |
|         )));
 | |
| 
 | |
|         $this->buildViolation('myMessage')
 | |
|             ->setParameter('{{ field }}', '"foo"')
 | |
|             ->atPath('property.path[foo]')
 | |
|             ->setInvalidValue(null)
 | |
|             ->setCode(Collection::MISSING_FIELD_ERROR)
 | |
|             ->assertRaised();
 | |
|     }
 | |
| 
 | |
|     public function testMissingFieldsAllowed()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array());
 | |
| 
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => $constraint,
 | |
|             ),
 | |
|             'allowMissingFields' => true,
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testOptionalFieldPresent()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array(
 | |
|             'foo' => null,
 | |
|         ));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => new Optional(),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testOptionalFieldNotPresent()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array());
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => new Optional(),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testOptionalFieldSingleConstraint()
 | |
|     {
 | |
|         $array = array(
 | |
|             'foo' => 5,
 | |
|         );
 | |
| 
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $array['foo'], array($constraint));
 | |
| 
 | |
|         $data = $this->prepareTestData($array);
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => new Optional($constraint),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testOptionalFieldMultipleConstraints()
 | |
|     {
 | |
|         $array = array(
 | |
|             'foo' => 5,
 | |
|         );
 | |
| 
 | |
|         $constraints = array(
 | |
|             new NotNull(),
 | |
|             new Range(array('min' => 4)),
 | |
|         );
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $array['foo'], $constraints);
 | |
| 
 | |
|         $data = $this->prepareTestData($array);
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => new Optional($constraints),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testRequiredFieldPresent()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array(
 | |
|             'foo' => null,
 | |
|         ));
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => new Required(),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testRequiredFieldNotPresent()
 | |
|     {
 | |
|         $data = $this->prepareTestData(array());
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => new Required(),
 | |
|             ),
 | |
|             'missingFieldsMessage' => 'myMessage',
 | |
|         )));
 | |
| 
 | |
|         $this->buildViolation('myMessage')
 | |
|             ->setParameter('{{ field }}', '"foo"')
 | |
|             ->atPath('property.path[foo]')
 | |
|             ->setInvalidValue(null)
 | |
|             ->setCode(Collection::MISSING_FIELD_ERROR)
 | |
|             ->assertRaised();
 | |
|     }
 | |
| 
 | |
|     public function testRequiredFieldSingleConstraint()
 | |
|     {
 | |
|         $array = array(
 | |
|             'foo' => 5,
 | |
|         );
 | |
| 
 | |
|         $constraint = new Range(array('min' => 4));
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $array['foo'], array($constraint));
 | |
| 
 | |
|         $data = $this->prepareTestData($array);
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => new Required($constraint),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testRequiredFieldMultipleConstraints()
 | |
|     {
 | |
|         $array = array(
 | |
|             'foo' => 5,
 | |
|         );
 | |
| 
 | |
|         $constraints = array(
 | |
|             new NotNull(),
 | |
|             new Range(array('min' => 4)),
 | |
|         );
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $array['foo'], $constraints);
 | |
| 
 | |
|         $data = $this->prepareTestData($array);
 | |
| 
 | |
|         $this->validator->validate($data, new Collection(array(
 | |
|             'foo' => new Required($constraints),
 | |
|         )));
 | |
| 
 | |
|         $this->assertNoViolation();
 | |
|     }
 | |
| 
 | |
|     public function testObjectShouldBeLeftUnchanged()
 | |
|     {
 | |
|         $value = new \ArrayObject(array(
 | |
|             'foo' => 3,
 | |
|         ));
 | |
| 
 | |
|         $constraint = new Range(array('min' => 2));
 | |
| 
 | |
|         $this->expectValidateValueAt(0, '[foo]', $value['foo'], array($constraint));
 | |
| 
 | |
|         $this->validator->validate($value, new Collection(array(
 | |
|             'fields' => array(
 | |
|                 'foo' => $constraint,
 | |
|             ),
 | |
|         )));
 | |
| 
 | |
|         $this->assertEquals(array(
 | |
|             'foo' => 3,
 | |
|         ), (array) $value);
 | |
|     }
 | |
| }
 |