GraphWalkerTest.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace Symfony\Tests\Component\Validator;
  3. require_once __DIR__.'/Fixtures/Entity.php';
  4. require_once __DIR__.'/Fixtures/ConstraintA.php';
  5. require_once __DIR__.'/Fixtures/ConstraintAValidator.php';
  6. require_once __DIR__.'/Fixtures/FailingConstraint.php';
  7. require_once __DIR__.'/Fixtures/FailingConstraintValidator.php';
  8. require_once __DIR__.'/Fixtures/FakeClassMetadataFactory.php';
  9. use Symfony\Tests\Component\Validator\Fixtures\Entity;
  10. use Symfony\Tests\Component\Validator\Fixtures\FakeClassMetadataFactory;
  11. use Symfony\Tests\Component\Validator\Fixtures\ConstraintA;
  12. use Symfony\Tests\Component\Validator\Fixtures\FailingConstraint;
  13. use Symfony\Component\Validator\GraphWalker;
  14. use Symfony\Component\Validator\ConstraintViolation;
  15. use Symfony\Component\Validator\ConstraintViolationList;
  16. use Symfony\Component\Validator\ConstraintValidatorFactory;
  17. use Symfony\Component\Validator\Mapping\ClassMetadata;
  18. use Symfony\Component\Validator\Constraints\Valid;
  19. class GraphWalkerTest extends \PHPUnit_Framework_TestCase
  20. {
  21. const CLASSNAME = 'Symfony\Tests\Component\Validator\Fixtures\Entity';
  22. protected $factory;
  23. protected $metadata;
  24. public function setUp()
  25. {
  26. $this->factory = new FakeClassMetadataFactory();
  27. $this->walker = new GraphWalker('Root', $this->factory, new ConstraintValidatorFactory());
  28. $this->metadata = new ClassMetadata(self::CLASSNAME);
  29. }
  30. public function testWalkClassValidatesConstraints()
  31. {
  32. $this->metadata->addConstraint(new ConstraintA());
  33. $this->walker->walkClass($this->metadata, new Entity(), 'Default', '');
  34. $this->assertEquals(1, count($this->walker->getViolations()));
  35. }
  36. public function testWalkClassValidatesPropertyConstraints()
  37. {
  38. $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
  39. $this->walker->walkClass($this->metadata, new Entity(), 'Default', '');
  40. $this->assertEquals(1, count($this->walker->getViolations()));
  41. }
  42. public function testWalkClassValidatesGetterConstraints()
  43. {
  44. $this->metadata->addGetterConstraint('lastName', new ConstraintA());
  45. $this->walker->walkClass($this->metadata, new Entity(), 'Default', '');
  46. $this->assertEquals(1, count($this->walker->getViolations()));
  47. }
  48. public function testWalkPropertyValueValidatesConstraints()
  49. {
  50. $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
  51. $this->walker->walkPropertyValue($this->metadata, 'firstName', 'value', 'Default', '');
  52. $this->assertEquals(1, count($this->walker->getViolations()));
  53. }
  54. public function testWalkCascadedPropertyValidatesReferences()
  55. {
  56. $entity = new Entity();
  57. $entityMetadata = new ClassMetadata(get_class($entity));
  58. $this->factory->addClassMetadata($entityMetadata);
  59. // add a constraint for the entity that always fails
  60. $entityMetadata->addConstraint(new FailingConstraint());
  61. // validate entity when validating the property "reference"
  62. $this->metadata->addPropertyConstraint('reference', new Valid());
  63. // invoke validation on an object
  64. $this->walker->walkPropertyValue(
  65. $this->metadata,
  66. 'reference',
  67. $entity, // object!
  68. 'Default',
  69. 'path'
  70. );
  71. $violations = new ConstraintViolationList();
  72. $violations->add(new ConstraintViolation(
  73. '',
  74. array(),
  75. 'Root',
  76. 'path',
  77. $entity
  78. ));
  79. $this->assertEquals($violations, $this->walker->getViolations());
  80. }
  81. public function testWalkCascadedPropertyValidatesArrays()
  82. {
  83. $entity = new Entity();
  84. $entityMetadata = new ClassMetadata(get_class($entity));
  85. $this->factory->addClassMetadata($entityMetadata);
  86. // add a constraint for the entity that always fails
  87. $entityMetadata->addConstraint(new FailingConstraint());
  88. // validate array when validating the property "reference"
  89. $this->metadata->addPropertyConstraint('reference', new Valid());
  90. $this->walker->walkPropertyValue(
  91. $this->metadata,
  92. 'reference',
  93. array('key' => $entity), // array!
  94. 'Default',
  95. 'path'
  96. );
  97. $violations = new ConstraintViolationList();
  98. $violations->add(new ConstraintViolation(
  99. '',
  100. array(),
  101. 'Root',
  102. 'path[key]',
  103. $entity
  104. ));
  105. $this->assertEquals($violations, $this->walker->getViolations());
  106. }
  107. public function testWalkCascadedPropertyDoesNotValidateNullValues()
  108. {
  109. $this->metadata->addPropertyConstraint('reference', new Valid());
  110. $this->walker->walkPropertyValue(
  111. $this->metadata,
  112. 'reference',
  113. null,
  114. 'Default',
  115. ''
  116. );
  117. $this->assertEquals(0, count($this->walker->getViolations()));
  118. }
  119. public function testWalkCascadedPropertyRequiresObjectOrArray()
  120. {
  121. $this->metadata->addPropertyConstraint('reference', new Valid());
  122. $this->setExpectedException('Symfony\Component\Validator\Exception\UnexpectedTypeException');
  123. $this->walker->walkPropertyValue(
  124. $this->metadata,
  125. 'reference',
  126. 'no object',
  127. 'Default',
  128. ''
  129. );
  130. }
  131. public function testWalkConstraintBuildsAViolationIfFailed()
  132. {
  133. $constraint = new ConstraintA();
  134. $this->walker->walkConstraint($constraint, 'foobar', 'Default', 'firstName.path');
  135. $violations = new ConstraintViolationList();
  136. $violations->add(new ConstraintViolation(
  137. 'message',
  138. array('param' => 'value'),
  139. 'Root',
  140. 'firstName.path',
  141. 'foobar'
  142. ));
  143. $this->assertEquals($violations, $this->walker->getViolations());
  144. }
  145. public function testWalkConstraintBuildsNoViolationIfSuccessful()
  146. {
  147. $constraint = new ConstraintA();
  148. $this->walker->walkConstraint($constraint, 'VALID', 'Default', 'firstName.path');
  149. $this->assertEquals(0, count($this->walker->getViolations()));
  150. }
  151. }