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;
 | 
						|
}
 |