ValidatorFactoryTest.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Tests\Component\Validator;
  11. use Doctrine\Common\Annotations\AnnotationReader;
  12. use Symfony\Component\Validator\Validator;
  13. use Symfony\Component\Validator\ValidatorContext;
  14. use Symfony\Component\Validator\ValidatorFactory;
  15. use Symfony\Component\Validator\ConstraintValidatorFactory;
  16. use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
  17. use Symfony\Component\Validator\Mapping\Loader\XmlFilesLoader;
  18. use Symfony\Component\Validator\Mapping\Loader\YamlFilesLoader;
  19. use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
  20. use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
  21. use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
  22. class ValidatorFactoryTest extends \PHPUnit_Framework_TestCase
  23. {
  24. protected $defaultContext;
  25. protected $factory;
  26. protected function setUp()
  27. {
  28. $this->defaultContext = new ValidatorContext();
  29. $this->factory = new ValidatorFactory($this->defaultContext);
  30. }
  31. protected function tearDown()
  32. {
  33. $this->defaultContext = null;
  34. $this->factory = null;
  35. }
  36. public function testOverrideClassMetadataFactory()
  37. {
  38. $factory1 = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
  39. $factory2 = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
  40. $this->defaultContext->setClassMetadataFactory($factory1);
  41. $result = $this->factory->setClassMetadataFactory($factory2);
  42. $this->assertSame($factory1, $this->defaultContext->getClassMetadataFactory());
  43. $this->assertSame($factory2, $result->getClassMetadataFactory());
  44. }
  45. public function testOverrideConstraintValidatorFactory()
  46. {
  47. $factory1 = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
  48. $factory2 = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
  49. $this->defaultContext->setConstraintValidatorFactory($factory1);
  50. $result = $this->factory->setConstraintValidatorFactory($factory2);
  51. $this->assertSame($factory1, $this->defaultContext->getConstraintValidatorFactory());
  52. $this->assertSame($factory2, $result->getConstraintValidatorFactory());
  53. }
  54. public function testGetValidator()
  55. {
  56. $metadataFactory = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
  57. $validatorFactory = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
  58. $this->defaultContext
  59. ->setClassMetadataFactory($metadataFactory)
  60. ->setConstraintValidatorFactory($validatorFactory);
  61. $validator = $this->factory->getValidator();
  62. $this->assertEquals(new Validator($metadataFactory, $validatorFactory), $validator);
  63. }
  64. public function testBuildDefaultFromAnnotations()
  65. {
  66. if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
  67. $this->markTestSkipped('Annotations is required for this test');
  68. }
  69. $factory = ValidatorFactory::buildDefault();
  70. $context = new ValidatorContext();
  71. $context
  72. ->setClassMetadataFactory(new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())))
  73. ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
  74. $this->assertEquals(new ValidatorFactory($context), $factory);
  75. }
  76. public function testBuildDefaultFromAnnotationsWithCustomNamespaces()
  77. {
  78. if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
  79. $this->markTestSkipped('Annotations is required for this test');
  80. }
  81. $factory = ValidatorFactory::buildDefault(array(), true);
  82. $context = new ValidatorContext();
  83. $context
  84. ->setClassMetadataFactory(new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())))
  85. ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
  86. $this->assertEquals(new ValidatorFactory($context), $factory);
  87. }
  88. public function testBuildDefaultFromXml()
  89. {
  90. $path = __DIR__.'/Mapping/Loader/constraint-mapping.xml';
  91. $factory = ValidatorFactory::buildDefault(array($path), false);
  92. $context = new ValidatorContext();
  93. $context
  94. ->setClassMetadataFactory(new ClassMetadataFactory(new XmlFilesLoader(array($path))))
  95. ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
  96. $this->assertEquals(new ValidatorFactory($context), $factory);
  97. }
  98. public function testBuildDefaultFromYaml()
  99. {
  100. $path = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
  101. $factory = ValidatorFactory::buildDefault(array($path), false);
  102. $context = new ValidatorContext();
  103. $context
  104. ->setClassMetadataFactory(new ClassMetadataFactory(new YamlFilesLoader(array($path))))
  105. ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
  106. $this->assertEquals(new ValidatorFactory($context), $factory);
  107. }
  108. public function testBuildDefaultFromStaticMethod()
  109. {
  110. $path = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
  111. $factory = ValidatorFactory::buildDefault(array(), false, 'loadMetadata');
  112. $context = new ValidatorContext();
  113. $context
  114. ->setClassMetadataFactory(new ClassMetadataFactory(new StaticMethodLoader('loadMetadata')))
  115. ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
  116. $this->assertEquals(new ValidatorFactory($context), $factory);
  117. }
  118. public function testBuildDefaultFromMultipleLoaders()
  119. {
  120. if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
  121. $this->markTestSkipped('Annotations is required for this test');
  122. }
  123. $xmlPath = __DIR__.'/Mapping/Loader/constraint-mapping.xml';
  124. $yamlPath = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
  125. $factory = ValidatorFactory::buildDefault(array($xmlPath, $yamlPath), true, 'loadMetadata');
  126. $chain = new LoaderChain(array(
  127. new XmlFilesLoader(array($xmlPath)),
  128. new YamlFilesLoader(array($yamlPath)),
  129. new AnnotationLoader(new AnnotationReader()),
  130. new StaticMethodLoader('loadMetadata'),
  131. ));
  132. $context = new ValidatorContext();
  133. $context
  134. ->setClassMetadataFactory(new ClassMetadataFactory($chain))
  135. ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
  136. $this->assertEquals(new ValidatorFactory($context), $factory);
  137. }
  138. /**
  139. * @expectedException Symfony\Component\Validator\Exception\MappingException
  140. */
  141. public function testBuildDefaultThrowsExceptionIfNoLoaderIsFound()
  142. {
  143. ValidatorFactory::buildDefault(array(), false);
  144. }
  145. /**
  146. * @expectedException Symfony\Component\Validator\Exception\MappingException
  147. */
  148. public function testBuildDefaultThrowsExceptionIfUnknownExtension()
  149. {
  150. ValidatorFactory::buildDefault(array(
  151. __DIR__.'/Mapping/Loader/StaticMethodLoaderTest.php'
  152. ));
  153. }
  154. }