4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Validator\Tests\Mapping\Factory;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\Validator\Constraints\Callback;
16 use Symfony\Component\Validator\Mapping\ClassMetadata;
17 use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory;
18 use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
19 use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
21 class LazyLoadingMetadataFactoryTest extends TestCase
23 const CLASS_NAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity';
24 const PARENT_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityParent';
25 const INTERFACE_A_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityInterfaceA';
26 const INTERFACE_B_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityInterfaceB';
27 const PARENT_INTERFACE_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityParentInterface';
29 public function testLoadClassMetadataWithInterface()
31 $factory = new LazyLoadingMetadataFactory(new TestLoader());
32 $metadata = $factory->getMetadataFor(self::PARENT_CLASS);
35 new ConstraintA(array('groups' => array('Default', 'EntityParent'))),
36 new ConstraintA(array('groups' => array('Default', 'EntityInterfaceA', 'EntityParent'))),
39 $this->assertEquals($constraints, $metadata->getConstraints());
42 public function testMergeParentConstraints()
44 $factory = new LazyLoadingMetadataFactory(new TestLoader());
45 $metadata = $factory->getMetadataFor(self::CLASS_NAME);
48 new ConstraintA(array('groups' => array(
52 new ConstraintA(array('groups' => array(
57 new ConstraintA(array('groups' => array(
63 new ConstraintA(array('groups' => array(
68 new ConstraintA(array('groups' => array(
70 'EntityParentInterface',
76 $this->assertEquals($constraints, $metadata->getConstraints());
79 public function testWriteMetadataToCache()
81 $cache = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Cache\CacheInterface')->getMock();
82 $factory = new LazyLoadingMetadataFactory(new TestLoader(), $cache);
84 $parentClassConstraints = array(
85 new ConstraintA(array('groups' => array('Default', 'EntityParent'))),
86 new ConstraintA(array('groups' => array('Default', 'EntityInterfaceA', 'EntityParent'))),
88 $interfaceAConstraints = array(
89 new ConstraintA(array('groups' => array('Default', 'EntityInterfaceA'))),
92 $cache->expects($this->never())
94 $cache->expects($this->exactly(2))
97 array($this->equalTo(self::PARENT_CLASS)),
98 array($this->equalTo(self::INTERFACE_A_CLASS))
100 ->will($this->returnValue(false));
101 $cache->expects($this->exactly(2))
104 $this->callback(function ($metadata) use ($interfaceAConstraints) {
105 return $interfaceAConstraints == $metadata->getConstraints();
107 $this->callback(function ($metadata) use ($parentClassConstraints) {
108 return $parentClassConstraints == $metadata->getConstraints();
112 $metadata = $factory->getMetadataFor(self::PARENT_CLASS);
114 $this->assertEquals(self::PARENT_CLASS, $metadata->getClassName());
115 $this->assertEquals($parentClassConstraints, $metadata->getConstraints());
118 public function testReadMetadataFromCache()
120 $loader = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Loader\LoaderInterface')->getMock();
121 $cache = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Cache\CacheInterface')->getMock();
122 $factory = new LazyLoadingMetadataFactory($loader, $cache);
124 $metadata = new ClassMetadata(self::PARENT_CLASS);
125 $metadata->addConstraint(new ConstraintA());
127 $parentClass = self::PARENT_CLASS;
128 $interfaceClass = self::INTERFACE_A_CLASS;
130 $loader->expects($this->never())
131 ->method('loadClassMetadata');
133 $cache->expects($this->never())
135 $cache->expects($this->exactly(2))
138 array(self::PARENT_CLASS),
139 array(self::INTERFACE_A_CLASS)
141 ->willReturnCallback(function ($name) use ($metadata, $parentClass, $interfaceClass) {
142 if ($parentClass == $name) {
146 return new ClassMetadata($interfaceClass);
149 $this->assertEquals($metadata, $factory->getMetadataFor(self::PARENT_CLASS));
152 public function testMetadataCacheWithRuntimeConstraint()
154 $cache = $this->getMockBuilder('Symfony\Component\Validator\Mapping\Cache\CacheInterface')->getMock();
155 $factory = new LazyLoadingMetadataFactory(new TestLoader(), $cache);
158 ->expects($this->any())
160 ->will($this->returnCallback(function ($metadata) { serialize($metadata); }))
163 $cache->expects($this->any())
165 ->will($this->returnValue(false));
167 $metadata = $factory->getMetadataFor(self::PARENT_CLASS);
168 $metadata->addConstraint(new Callback(function () {}));
170 $this->assertCount(3, $metadata->getConstraints());
172 $metadata = $factory->getMetadataFor(self::CLASS_NAME);
174 $this->assertCount(6, $metadata->getConstraints());
177 public function testGroupsFromParent()
179 $reader = new \Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader();
180 $factory = new LazyLoadingMetadataFactory($reader);
181 $metadata = $factory->getMetadataFor('Symfony\Component\Validator\Tests\Fixtures\EntityStaticCarTurbo');
184 foreach ($metadata->getPropertyMetadata('wheels') as $propertyMetadata) {
185 $constraints = $propertyMetadata->getConstraints();
186 $groups = array_replace($groups, $constraints[0]->groups);
189 $this->assertCount(4, $groups);
190 $this->assertContains('Default', $groups);
191 $this->assertContains('EntityStaticCarTurbo', $groups);
192 $this->assertContains('EntityStaticCar', $groups);
193 $this->assertContains('EntityStaticVehicle', $groups);
197 class TestLoader implements LoaderInterface
199 public function loadClassMetadata(ClassMetadata $metadata)
201 $metadata->addConstraint(new ConstraintA());