ValidatorFactoryTest.php 7.2 KB

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