ValidatorFactoryTest.php 7.2 KB

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