ValidatorFactoryTest.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien.potencier@symfony-project.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->classMetadataFactory($factory1);
  35. $result = $this->factory->classMetadataFactory($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->constraintValidatorFactory($factory1);
  44. $result = $this->factory->constraintValidatorFactory($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. ->classMetadataFactory($metadataFactory)
  54. ->constraintValidatorFactory($validatorFactory);
  55. $validator = $this->factory->getValidator();
  56. $this->assertEquals(new Validator($metadataFactory, $validatorFactory), $validator);
  57. }
  58. public function testBuildDefaultFromAnnotations()
  59. {
  60. $factory = ValidatorFactory::buildDefault();
  61. $context = new ValidatorContext();
  62. $context
  63. ->classMetadataFactory(new ClassMetadataFactory(new AnnotationLoader()))
  64. ->constraintValidatorFactory(new ConstraintValidatorFactory());
  65. $this->assertEquals(new ValidatorFactory($context), $factory);
  66. }
  67. public function testBuildDefaultFromAnnotationsWithCustomNamespaces()
  68. {
  69. $factory = ValidatorFactory::buildDefault(array(), true, array(
  70. 'myns' => 'My\\Namespace\\',
  71. ));
  72. $context = new ValidatorContext();
  73. $context
  74. ->classMetadataFactory(new ClassMetadataFactory(new AnnotationLoader(array(
  75. 'myns' => 'My\\Namespace\\',
  76. ))))
  77. ->constraintValidatorFactory(new ConstraintValidatorFactory());
  78. $this->assertEquals(new ValidatorFactory($context), $factory);
  79. }
  80. public function testBuildDefaultFromXml()
  81. {
  82. $path = __DIR__.'/Mapping/Loader/constraint-mapping.xml';
  83. $factory = ValidatorFactory::buildDefault(array($path), false);
  84. $context = new ValidatorContext();
  85. $context
  86. ->classMetadataFactory(new ClassMetadataFactory(new XmlFilesLoader(array($path))))
  87. ->constraintValidatorFactory(new ConstraintValidatorFactory());
  88. $this->assertEquals(new ValidatorFactory($context), $factory);
  89. }
  90. public function testBuildDefaultFromYaml()
  91. {
  92. $path = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
  93. $factory = ValidatorFactory::buildDefault(array($path), false);
  94. $context = new ValidatorContext();
  95. $context
  96. ->classMetadataFactory(new ClassMetadataFactory(new YamlFilesLoader(array($path))))
  97. ->constraintValidatorFactory(new ConstraintValidatorFactory());
  98. $this->assertEquals(new ValidatorFactory($context), $factory);
  99. }
  100. public function testBuildDefaultFromStaticMethod()
  101. {
  102. $path = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
  103. $factory = ValidatorFactory::buildDefault(array(), false, null, 'loadMetadata');
  104. $context = new ValidatorContext();
  105. $context
  106. ->classMetadataFactory(new ClassMetadataFactory(new StaticMethodLoader('loadMetadata')))
  107. ->constraintValidatorFactory(new ConstraintValidatorFactory());
  108. $this->assertEquals(new ValidatorFactory($context), $factory);
  109. }
  110. public function testBuildDefaultFromMultipleLoaders()
  111. {
  112. $xmlPath = __DIR__.'/Mapping/Loader/constraint-mapping.xml';
  113. $yamlPath = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
  114. $factory = ValidatorFactory::buildDefault(array($xmlPath, $yamlPath), true, null, 'loadMetadata');
  115. $chain = new LoaderChain(array(
  116. new XmlFilesLoader(array($xmlPath)),
  117. new YamlFilesLoader(array($yamlPath)),
  118. new AnnotationLoader(),
  119. new StaticMethodLoader('loadMetadata'),
  120. ));
  121. $context = new ValidatorContext();
  122. $context
  123. ->classMetadataFactory(new ClassMetadataFactory($chain))
  124. ->constraintValidatorFactory(new ConstraintValidatorFactory());
  125. $this->assertEquals(new ValidatorFactory($context), $factory);
  126. }
  127. /**
  128. * @expectedException Symfony\Component\Validator\Exception\MappingException
  129. */
  130. public function testBuildDefaultThrowsExceptionIfNoLoaderIsFound()
  131. {
  132. ValidatorFactory::buildDefault(array(), false);
  133. }
  134. /**
  135. * @expectedException Symfony\Component\Validator\Exception\MappingException
  136. */
  137. public function testBuildDefaultThrowsExceptionIfUnknownExtension()
  138. {
  139. ValidatorFactory::buildDefault(array(
  140. __DIR__.'/Mapping/Loader/StaticMethodLoaderTest.php'
  141. ));
  142. }
  143. }