CallbackValidatorTest.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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\Constraints;
  11. use Symfony\Component\Validator\ExecutionContext;
  12. use Symfony\Component\Validator\ConstraintViolation;
  13. use Symfony\Component\Validator\ConstraintViolationList;
  14. use Symfony\Component\Validator\Constraints\Callback;
  15. use Symfony\Component\Validator\Constraints\CallbackValidator;
  16. class CallbackValidatorTest_Class
  17. {
  18. public static function validateStatic($object, ExecutionContext $context)
  19. {
  20. $context->setCurrentClass('Foo');
  21. $context->setCurrentProperty('bar');
  22. $context->setGroup('mygroup');
  23. $context->setPropertyPath('foo.bar');
  24. $context->addViolation('Static message', array('parameter'), 'invalidValue');
  25. }
  26. }
  27. class CallbackValidatorTest_Object
  28. {
  29. public function validateOne(ExecutionContext $context)
  30. {
  31. $context->setCurrentClass('Foo');
  32. $context->setCurrentProperty('bar');
  33. $context->setGroup('mygroup');
  34. $context->setPropertyPath('foo.bar');
  35. $context->addViolation('My message', array('parameter'), 'invalidValue');
  36. }
  37. public function validateTwo(ExecutionContext $context)
  38. {
  39. $context->addViolation('Other message', array('other parameter'), 'otherInvalidValue');
  40. }
  41. }
  42. class CallbackValidatorTest extends \PHPUnit_Framework_TestCase
  43. {
  44. protected $validator;
  45. protected $walker;
  46. protected $context;
  47. protected function setUp()
  48. {
  49. $this->walker = $this->getMock('Symfony\Component\Validator\GraphWalker', array(), array(), '', false);
  50. $metadataFactory = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
  51. $this->context = new ExecutionContext('Root', $this->walker, $metadataFactory);
  52. $this->context->setCurrentClass('InitialClass');
  53. $this->context->setCurrentProperty('initialProperty');
  54. $this->context->setGroup('InitialGroup');
  55. $this->context->setPropertyPath('initial.property.path');
  56. $this->validator = new CallbackValidator();
  57. $this->validator->initialize($this->context);
  58. }
  59. public function testNullIsValid()
  60. {
  61. $this->assertTrue($this->validator->isValid(null, new Callback(array('foo'))));
  62. }
  63. public function testCallbackSingleMethod()
  64. {
  65. $object = new CallbackValidatorTest_Object();
  66. $this->assertTrue($this->validator->isValid($object, new Callback(array('validateOne'))));
  67. $violations = new ConstraintViolationList();
  68. $violations->add(new ConstraintViolation(
  69. 'My message',
  70. array('parameter'),
  71. 'Root',
  72. 'foo.bar',
  73. 'invalidValue'
  74. ));
  75. $this->assertEquals($violations, $this->context->getViolations());
  76. $this->assertEquals('InitialClass', $this->context->getCurrentClass());
  77. $this->assertEquals('initialProperty', $this->context->getCurrentProperty());
  78. $this->assertEquals('InitialGroup', $this->context->getGroup());
  79. $this->assertEquals('initial.property.path', $this->context->getPropertyPath());
  80. }
  81. public function testCallbackSingleStaticMethod()
  82. {
  83. $object = new CallbackValidatorTest_Object();
  84. $this->assertTrue($this->validator->isValid($object, new Callback(array(
  85. array(__NAMESPACE__.'\CallbackValidatorTest_Class', 'validateStatic')
  86. ))));
  87. $violations = new ConstraintViolationList();
  88. $violations->add(new ConstraintViolation(
  89. 'Static message',
  90. array('parameter'),
  91. 'Root',
  92. 'foo.bar',
  93. 'invalidValue'
  94. ));
  95. $this->assertEquals($violations, $this->context->getViolations());
  96. $this->assertEquals('InitialClass', $this->context->getCurrentClass());
  97. $this->assertEquals('initialProperty', $this->context->getCurrentProperty());
  98. $this->assertEquals('InitialGroup', $this->context->getGroup());
  99. $this->assertEquals('initial.property.path', $this->context->getPropertyPath());
  100. }
  101. public function testCallbackMultipleMethods()
  102. {
  103. $object = new CallbackValidatorTest_Object();
  104. $this->assertTrue($this->validator->isValid($object, new Callback(array(
  105. 'validateOne', 'validateTwo'
  106. ))));
  107. $violations = new ConstraintViolationList();
  108. $violations->add(new ConstraintViolation(
  109. 'My message',
  110. array('parameter'),
  111. 'Root',
  112. 'foo.bar',
  113. 'invalidValue'
  114. ));
  115. // context was reset
  116. $violations->add(new ConstraintViolation(
  117. 'Other message',
  118. array('other parameter'),
  119. 'Root',
  120. 'initial.property.path',
  121. 'otherInvalidValue'
  122. ));
  123. $this->assertEquals($violations, $this->context->getViolations());
  124. }
  125. /**
  126. * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
  127. */
  128. public function testExpectCallbackArray()
  129. {
  130. $object = new CallbackValidatorTest_Object();
  131. $this->validator->isValid($object, new Callback('foobar'));
  132. }
  133. /**
  134. * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
  135. */
  136. public function testExpectValidMethods()
  137. {
  138. $object = new CallbackValidatorTest_Object();
  139. $this->validator->isValid($object, new Callback(array('foobar')));
  140. }
  141. /**
  142. * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
  143. */
  144. public function testExpectValidCallbacks()
  145. {
  146. $object = new CallbackValidatorTest_Object();
  147. $this->validator->isValid($object, new Callback(array(array('foo', 'bar'))));
  148. }
  149. }