* * 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:----g8QI0UwRMdXhQIAB2dPhNScPPtmP7MNU6J8ccFyjcREmnE26J+ck/aNg4mGgWDH1uNQ5Ara+tAdAnVEqAGtaTyaJYFHLem21/lAXcOh7TT1u/F/9MnL0rgwlkkdgPTjBnHSShtyQrVr3Is/oKM7is9gc0E1voWnrOVqLXJip3Xssr7pK8pOyeeDWCTyhI/cKnhhylfjIflTaZJM91ylH2hKoc1sCt+iw/G1MAQhrqcKx05M9LDilBVmkrIRGzBybIGNLdmy63a/wg6bNtEyw/nAAnXpgPAnmlbbBBZQ+2BhE1L5Ifc+UTZTKGu/L8vlffWORakiBKV0Iq+GwBf3K31FICdIUH99TGeZM24qlfCPYgnwiyAWnvWQSnbwblukwj0+JxW4aogeuqXW/wUVC7Y8uZm9zdrDdKQGn0f1UTL7fT9Vdkye7fCHgMaXv3lk9bfGnREoH4IgicnrsJDasfR4M5ctoK02DWL+PVk/2GJo8cVoI5ualSJ5HYF5QuLHYICLoZVhld5QoRQdw6vVGsXY2wJ8IuwI7xbaaSedV8eq//lTiSn7IOYqrvROvz64NpaeyvU/3hbQSPZF/Emzh1NcWyy8mw2GpcVYOohi14ySi0jbRm8YfKfe+sxZ5nY/P5YIR/TNHpbmLvmokulR0kL0bL1nnwzNl/RyaJ6RM9og=----ATTACHMENT:----NjA3NTg3NDEyMTY0NjUwNiA2MzU4MjM1NDAzMjg1NDI5IDMyNzA3MjEwNzM4MDk3MTg=