forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			336 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			336 lines
		
	
	
		
			11 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; | ||
|  | 
 | ||
|  | use PHPUnit\Framework\TestCase; | ||
|  | use Symfony\Component\Validator\Constraints\All; | ||
|  | use Symfony\Component\Validator\Constraints\Collection; | ||
|  | use Symfony\Component\Validator\ConstraintValidatorFactory; | ||
|  | use Symfony\Component\Validator\ConstraintViolation; | ||
|  | use Symfony\Component\Validator\ConstraintViolationList; | ||
|  | use Symfony\Component\Validator\ExecutionContext; | ||
|  | use Symfony\Component\Validator\Tests\Fixtures\ConstraintA; | ||
|  | use Symfony\Component\Validator\ValidationVisitor; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @group legacy | ||
|  |  */ | ||
|  | class LegacyExecutionContextTest extends TestCase | ||
|  | { | ||
|  |     const TRANS_DOMAIN = 'trans_domain'; | ||
|  | 
 | ||
|  |     private $visitor; | ||
|  |     private $violations; | ||
|  |     private $metadata; | ||
|  |     private $metadataFactory; | ||
|  |     private $globalContext; | ||
|  |     private $translator; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var ExecutionContext | ||
|  |      */ | ||
|  |     private $context; | ||
|  | 
 | ||
|  |     protected function setUp() | ||
|  |     { | ||
|  |         $this->visitor = $this->getMockBuilder('Symfony\Component\Validator\ValidationVisitor') | ||
|  |             ->disableOriginalConstructor() | ||
|  |             ->getMock(); | ||
|  |         $this->violations = new ConstraintViolationList(); | ||
|  |         $this->metadata = $this->getMockBuilder('Symfony\Component\Validator\MetadataInterface')->getMock(); | ||
|  |         $this->metadataFactory = $this->getMockBuilder('Symfony\Component\Validator\MetadataFactoryInterface')->getMock(); | ||
|  |         $this->globalContext = $this->getMockBuilder('Symfony\Component\Validator\GlobalExecutionContextInterface')->getMock(); | ||
|  |         $this->globalContext->expects($this->any()) | ||
|  |             ->method('getRoot') | ||
|  |             ->will($this->returnValue('Root')); | ||
|  |         $this->globalContext->expects($this->any()) | ||
|  |             ->method('getViolations') | ||
|  |             ->will($this->returnValue($this->violations)); | ||
|  |         $this->globalContext->expects($this->any()) | ||
|  |             ->method('getVisitor') | ||
|  |             ->will($this->returnValue($this->visitor)); | ||
|  |         $this->globalContext->expects($this->any()) | ||
|  |             ->method('getMetadataFactory') | ||
|  |             ->will($this->returnValue($this->metadataFactory)); | ||
|  |         $this->translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock(); | ||
|  |         $this->context = new ExecutionContext($this->globalContext, $this->translator, self::TRANS_DOMAIN, $this->metadata, 'currentValue', 'Group', 'foo.bar'); | ||
|  |     } | ||
|  | 
 | ||
|  |     protected function tearDown() | ||
|  |     { | ||
|  |         $this->globalContext = null; | ||
|  |         $this->context = null; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testInit() | ||
|  |     { | ||
|  |         $this->assertCount(0, $this->context->getViolations()); | ||
|  |         $this->assertSame('Root', $this->context->getRoot()); | ||
|  |         $this->assertSame('foo.bar', $this->context->getPropertyPath()); | ||
|  |         $this->assertSame('Group', $this->context->getGroup()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testClone() | ||
|  |     { | ||
|  |         $clone = clone $this->context; | ||
|  | 
 | ||
|  |         // Cloning the context keeps the reference to the original violation
 | ||
|  |         // list. This way we can efficiently duplicate context instances during
 | ||
|  |         // the validation run and only modify the properties that need to be
 | ||
|  |         // changed.
 | ||
|  |         $this->assertSame($this->context->getViolations(), $clone->getViolations()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddViolation() | ||
|  |     { | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('trans') | ||
|  |             ->with('Error', array('foo' => 'bar')) | ||
|  |             ->will($this->returnValue('Translated error')); | ||
|  | 
 | ||
|  |         $this->context->addViolation('Error', array('foo' => 'bar'), 'invalid'); | ||
|  | 
 | ||
|  |         $this->assertEquals(new ConstraintViolationList(array( | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated error', | ||
|  |                 'Error', | ||
|  |                 array('foo' => 'bar'), | ||
|  |                 'Root', | ||
|  |                 'foo.bar', | ||
|  |                 'invalid' | ||
|  |             ), | ||
|  |         )), $this->context->getViolations()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddViolationUsesPreconfiguredValueIfNotPassed() | ||
|  |     { | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('trans') | ||
|  |             ->with('Error', array()) | ||
|  |             ->will($this->returnValue('Translated error')); | ||
|  | 
 | ||
|  |         $this->context->addViolation('Error'); | ||
|  | 
 | ||
|  |         $this->assertEquals(new ConstraintViolationList(array( | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated error', | ||
|  |                 'Error', | ||
|  |                 array(), | ||
|  |                 'Root', | ||
|  |                 'foo.bar', | ||
|  |                 'currentValue' | ||
|  |             ), | ||
|  |         )), $this->context->getViolations()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddViolationUsesPassedNullValue() | ||
|  |     { | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('trans') | ||
|  |             ->with('Error', array('foo1' => 'bar1')) | ||
|  |             ->will($this->returnValue('Translated error')); | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('transChoice') | ||
|  |             ->with('Choice error', 1, array('foo2' => 'bar2')) | ||
|  |             ->will($this->returnValue('Translated choice error')); | ||
|  | 
 | ||
|  |         // passed null value should override preconfigured value "invalid"
 | ||
|  |         $this->context->addViolation('Error', array('foo1' => 'bar1'), null); | ||
|  |         $this->context->addViolation('Choice error', array('foo2' => 'bar2'), null, 1); | ||
|  | 
 | ||
|  |         $this->assertEquals(new ConstraintViolationList(array( | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated error', | ||
|  |                 'Error', | ||
|  |                 array('foo1' => 'bar1'), | ||
|  |                 'Root', | ||
|  |                 'foo.bar', | ||
|  |                 null | ||
|  |             ), | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated choice error', | ||
|  |                 'Choice error', | ||
|  |                 array('foo2' => 'bar2'), | ||
|  |                 'Root', | ||
|  |                 'foo.bar', | ||
|  |                 null, | ||
|  |                 1 | ||
|  |             ), | ||
|  |         )), $this->context->getViolations()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddViolationAt() | ||
|  |     { | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('trans') | ||
|  |             ->with('Error', array('foo' => 'bar')) | ||
|  |             ->will($this->returnValue('Translated error')); | ||
|  | 
 | ||
|  |         // override preconfigured property path
 | ||
|  |         $this->context->addViolationAt('bam.baz', 'Error', array('foo' => 'bar'), 'invalid'); | ||
|  | 
 | ||
|  |         $this->assertEquals(new ConstraintViolationList(array( | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated error', | ||
|  |                 'Error', | ||
|  |                 array('foo' => 'bar'), | ||
|  |                 'Root', | ||
|  |                 'foo.bar.bam.baz', | ||
|  |                 'invalid' | ||
|  |             ), | ||
|  |         )), $this->context->getViolations()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddViolationAtUsesPreconfiguredValueIfNotPassed() | ||
|  |     { | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('trans') | ||
|  |             ->with('Error', array()) | ||
|  |             ->will($this->returnValue('Translated error')); | ||
|  | 
 | ||
|  |         $this->context->addViolationAt('bam.baz', 'Error'); | ||
|  | 
 | ||
|  |         $this->assertEquals(new ConstraintViolationList(array( | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated error', | ||
|  |                 'Error', | ||
|  |                 array(), | ||
|  |                 'Root', | ||
|  |                 'foo.bar.bam.baz', | ||
|  |                 'currentValue' | ||
|  |             ), | ||
|  |         )), $this->context->getViolations()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddViolationAtUsesPassedNullValue() | ||
|  |     { | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('trans') | ||
|  |             ->with('Error', array('foo' => 'bar')) | ||
|  |             ->will($this->returnValue('Translated error')); | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('transChoice') | ||
|  |             ->with('Choice error', 2, array('foo' => 'bar')) | ||
|  |             ->will($this->returnValue('Translated choice error')); | ||
|  | 
 | ||
|  |         // passed null value should override preconfigured value "invalid"
 | ||
|  |         $this->context->addViolationAt('bam.baz', 'Error', array('foo' => 'bar'), null); | ||
|  |         $this->context->addViolationAt('bam.baz', 'Choice error', array('foo' => 'bar'), null, 2); | ||
|  | 
 | ||
|  |         $this->assertEquals(new ConstraintViolationList(array( | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated error', | ||
|  |                 'Error', | ||
|  |                 array('foo' => 'bar'), | ||
|  |                 'Root', | ||
|  |                 'foo.bar.bam.baz', | ||
|  |                 null | ||
|  |             ), | ||
|  |             new ConstraintViolation( | ||
|  |                 'Translated choice error', | ||
|  |                 'Choice error', | ||
|  |                 array('foo' => 'bar'), | ||
|  |                 'Root', | ||
|  |                 'foo.bar.bam.baz', | ||
|  |                 null, | ||
|  |                 2 | ||
|  |             ), | ||
|  |         )), $this->context->getViolations()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddViolationPluralTranslationError() | ||
|  |     { | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('transChoice') | ||
|  |             ->with('foo') | ||
|  |             ->will($this->throwException(new \InvalidArgumentException())); | ||
|  |         $this->translator->expects($this->once()) | ||
|  |             ->method('trans') | ||
|  |             ->with('foo'); | ||
|  | 
 | ||
|  |         $this->context->addViolation('foo', array(), null, 2); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGetPropertyPath() | ||
|  |     { | ||
|  |         $this->assertEquals('foo.bar', $this->context->getPropertyPath()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGetPropertyPathWithIndexPath() | ||
|  |     { | ||
|  |         $this->assertEquals('foo.bar[bam]', $this->context->getPropertyPath('[bam]')); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGetPropertyPathWithEmptyPath() | ||
|  |     { | ||
|  |         $this->assertEquals('foo.bar', $this->context->getPropertyPath('')); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGetPropertyPathWithEmptyCurrentPropertyPath() | ||
|  |     { | ||
|  |         $this->context = new ExecutionContext($this->globalContext, $this->translator, self::TRANS_DOMAIN, $this->metadata, 'currentValue', 'Group', ''); | ||
|  | 
 | ||
|  |         $this->assertEquals('bam.baz', $this->context->getPropertyPath('bam.baz')); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGetPropertyPathWithNestedCollectionsAndAllMixed() | ||
|  |     { | ||
|  |         $constraints = new Collection(array( | ||
|  |             'shelves' => new All(array('constraints' => array( | ||
|  |                 new Collection(array( | ||
|  |                     'name' => new ConstraintA(), | ||
|  |                     'books' => new All(array('constraints' => array( | ||
|  |                         new ConstraintA(), | ||
|  |                     ))), | ||
|  |                 )), | ||
|  |             ))), | ||
|  |             'name' => new ConstraintA(), | ||
|  |         )); | ||
|  |         $data = array( | ||
|  |             'shelves' => array( | ||
|  |                 array( | ||
|  |                     'name' => 'Research', | ||
|  |                     'books' => array('foo', 'bar'), | ||
|  |                 ), | ||
|  |                 array( | ||
|  |                     'name' => 'VALID', | ||
|  |                     'books' => array('foozy', 'VALID', 'bazzy'), | ||
|  |                 ), | ||
|  |             ), | ||
|  |             'name' => 'Library', | ||
|  |         ); | ||
|  |         $expectedViolationPaths = array( | ||
|  |             '[shelves][0][name]', | ||
|  |             '[shelves][0][books][0]', | ||
|  |             '[shelves][0][books][1]', | ||
|  |             '[shelves][1][books][0]', | ||
|  |             '[shelves][1][books][2]', | ||
|  |             '[name]', | ||
|  |         ); | ||
|  | 
 | ||
|  |         $visitor = new ValidationVisitor('Root', $this->metadataFactory, new ConstraintValidatorFactory(), $this->translator); | ||
|  |         $context = new ExecutionContext($visitor, $this->translator, self::TRANS_DOMAIN); | ||
|  |         $context->validateValue($data, $constraints); | ||
|  | 
 | ||
|  |         foreach ($context->getViolations() as $violation) { | ||
|  |             $violationPaths[] = $violation->getPropertyPath(); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->assertEquals($expectedViolationPaths, $violationPaths); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class ExecutionContextTest_TestClass | ||
|  | { | ||
|  |     public $myProperty; | ||
|  | } |