* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Validator\Tests\Mapping\Factory; use PHPUnit\Framework\TestCase; use Symfony\Component\Validator\Constraints\Callback; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory; use Symfony\Component\Validator\Mapping\Loader\LoaderInterface; use Symfony\Component\Validator\Tests\Fixtures\ConstraintA; class LazyLoadingMetadataFactoryTest extends TestCase { const CLASS_NAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity'; const PARENT_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityParent'; const INTERFACE_A_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityInterfaceA'; const INTERFACE_B_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityInterfaceB'; const PARENT_INTERFACE_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityParentInterface'; public function testLoadClassMetadataWithInterface() { $factory = new LazyLoadingMetadataFactory(new TestLoader()); $metadata = $factory->getMetadataFor(self::PARENT_CLASS); $constraints = array( new ConstraintA(array('groups' => array('Default', 'EntityParent'))), new ConstraintA(array('groups' => array('Default', 'EntityInterfaceA', 'EntityParent'))), ); $this->assertEquals($constraints, $metadata->getConstraints()); } public function testMergeParentConstraints() { $factory = new LazyLoadingMetadataFactory(new TestLoader()); $metadata = $factory->getMetadataFor(self::CLASS_NAME); $constraints = array( new ConstraintA(array('groups' => array( 'Default', 'Entity', ))), new ConstraintA(array('groups' => array( 'Default', 'EntityParent', 'Entity', ))), new ConstraintA(array('groups' => array( 'Default', 'EntityInterfaceA', 'EntityParent', 'Entity', ))), new ConstraintA(array('groups' => array( 'Default', 'EntityInterfaceB', 'Entity', ))), new ConstraintA(array('groups' => array( 'Default', 'EntityParentInterface', 'EntityInterfaceB', 'Entity', ))), ); $this->assertEquals($constraints, $metadata->getConstraints()); } public function testWriteMetadataToCache() { $cache = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Cache\CacheInterface')->getMock(); $factory = new LazyLoadingMetadataFactory(new TestLoader(), $cache); $parentClassConstraints = array( new ConstraintA(array('groups' => array('Default', 'EntityParent'))), new ConstraintA(array('groups' => array('Default', 'EntityInterfaceA', 'EntityParent'))), ); $interfaceAConstraints = array( new ConstraintA(array('groups' => array('Default', 'EntityInterfaceA'))), ); $cache->expects($this->never()) ->method('has'); $cache->expects($this->exactly(2)) ->method('read') ->withConsecutive( array($this->equalTo(self::PARENT_CLASS)), array($this->equalTo(self::INTERFACE_A_CLASS)) ) ->will($this->returnValue(false)); $cache->expects($this->exactly(2)) ->method('write') ->withConsecutive( $this->callback(function ($metadata) use ($interfaceAConstraints) { return $interfaceAConstraints == $metadata->getConstraints(); }), $this->callback(function ($metadata) use ($parentClassConstraints) { return $parentClassConstraints == $metadata->getConstraints(); }) ); $metadata = $factory->getMetadataFor(self::PARENT_CLASS); $this->assertEquals(self::PARENT_CLASS, $metadata->getClassName()); $this->assertEquals($parentClassConstraints, $metadata->getConstraints()); } public function testReadMetadataFromCache() { $loader = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Loader\LoaderInterface')->getMock(); $cache = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Cache\CacheInterface')->getMock(); $factory = new LazyLoadingMetadataFactory($loader, $cache); $metadata = new ClassMetadata(self::PARENT_CLASS); $metadata->addConstraint(new ConstraintA()); $parentClass = self::PARENT_CLASS; $interfaceClass = self::INTERFACE_A_CLASS; $loader->expects($this->never()) ->method('loadClassMetadata'); $cache->expects($this->never()) ->method('has'); $cache->expects($this->exactly(2)) ->method('read') ->withConsecutive( array(self::PARENT_CLASS), array(self::INTERFACE_A_CLASS) ) ->willReturnCallback(function ($name) use ($metadata, $parentClass, $interfaceClass) { if ($parentClass == $name) { return $metadata; } return new ClassMetadata($interfaceClass); }); $this->assertEquals($metadata, $factory->getMetadataFor(self::PARENT_CLASS)); } /** * @expectedException \Symfony\Component\Validator\Exception\NoSuchMetadataException */ public function testNonClassNameStringValues() { $testedValue = 'error@example.com'; $loader = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Loader\LoaderInterface')->getMock(); $cache = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Cache\CacheInterface')->getMock(); $factory = new LazyLoadingMetadataFactory($loader, $cache); $cache ->expects($this->never()) ->method('read'); $factory->getMetadataFor($testedValue); } public function testMetadataCacheWithRuntimeConstraint() { $cache = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Cache\CacheInterface')->getMock(); $factory = new LazyLoadingMetadataFactory(new TestLoader(), $cache); $cache ->expects($this->any()) ->method('write') ->will($this->returnCallback(function ($metadata) { serialize($metadata); })) ; $cache->expects($this->any()) ->method('read') ->will($this->returnValue(false)); $metadata = $factory->getMetadataFor(self::PARENT_CLASS); $metadata->addConstraint(new Callback(function () {})); $this->assertCount(3, $metadata->getConstraints()); $metadata = $factory->getMetadataFor(self::CLASS_NAME); $this->assertCount(6, $metadata->getConstraints()); } public function testGroupsFromParent() { $reader = new \Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader(); $factory = new LazyLoadingMetadataFactory($reader); $metadata = $factory->getMetadataFor('Symfony\Component\Validator\Tests\Fixtures\EntityStaticCarTurbo'); $groups = array(); foreach ($metadata->getPropertyMetadata('wheels') as $propertyMetadata) { $constraints = $propertyMetadata->getConstraints(); $groups = array_replace($groups, $constraints[0]->groups); } $this->assertCount(4, $groups); $this->assertContains('Default', $groups); $this->assertContains('EntityStaticCarTurbo', $groups); $this->assertContains('EntityStaticCar', $groups); $this->assertContains('EntityStaticVehicle', $groups); } } class TestLoader implements LoaderInterface { public function loadClassMetadata(ClassMetadata $metadata) { $metadata->addConstraint(new ConstraintA()); } } __halt_compiler();----SIGNATURE:----acVIq3E8bp/dNLycXigDvfK+ZNuGTHbMJLj1xMN2exMBuT+xXgbykORfRzTON6H+hHaPyJe0pkSNLds8ppenU43OKzfWZDtHw6Aqbb6F+LnAm7eOwlb326BrD/3+YnAbpeWb0ByfdOmdIrPwCUmNE9PC7onxSwJiJ8ucItBiS5uJn0eUXbIIghvm9l72llKSOzd9LvT1RPW1vwsls2wt/BVbuwaFeUSCp/bd62cFnybPAomd1JkqMlyRLFT4EbW9+digkUhov9GdRiZoID0JrA9pApQglpFWpwz/y0/lSPgzI5P4DmCvsqMoMaxCECpUHkInZIcfuIE+gAqCLRql+X9LPFOa1Cbjs9/He2wWUwkD8Qt1jZ1Ohtb9axjd9jQIZkJlN2InQWNvlBdKekhaODfb4S8BjcGbhAM5BzSpDG5QrY2Va7ZgniapeYY9loxW9PyAej1U3z2RATOjBM2Jt4Yt/7nk1HNmyRf+AhIufNUb4tw2m/4mCmzsJ7PZ/yUe0ML2Z44k/HV0tI1ENk4JRakbzhYeb1yrG92ZvSnP0R+h7O8es21hy//vC9t6h4zRQ68CjH5BW5kyPQvcwyV+jU1VJ8QTmN2NN4vJIP7XVuxZLlOjyGgP8G1TsdyAfhYnzTKu5LqH6NzkN9BQOpZ8ChoORJQBdJ1Lm3ZS9hwYEE0=----ATTACHMENT:----ODE3MjgwNDQ3NTIwMzY4NiA4OTYyMDYyMjc3MjUwOTc5IDYzOTYxMjM4MjE5MDY4OTI=