SymfonyValidatorSubscriberTest.php 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. namespace JMS\Serializer\Tests\Serializer\EventDispatcher\Subscriber;
  3. use JMS\Serializer\DeserializationContext;
  4. use JMS\Serializer\EventDispatcher\EventDispatcher;
  5. use JMS\Serializer\EventDispatcher\ObjectEvent;
  6. use JMS\Serializer\EventDispatcher\Subscriber\SymfonyValidatorSubscriber;
  7. use JMS\Serializer\SerializerBuilder;
  8. use Symfony\Component\Validator\ConstraintViolation;
  9. use Symfony\Component\Validator\ConstraintViolationList;
  10. class SymfonyValidatorSubscriberTest extends \PHPUnit_Framework_TestCase
  11. {
  12. private $validator;
  13. /** @var SymfonyValidatorSubscriber */
  14. private $subscriber;
  15. public function testValidate()
  16. {
  17. $obj = new \stdClass;
  18. $this->validator->expects($this->once())
  19. ->method('validate')
  20. ->with($obj, array('foo'))
  21. ->will($this->returnValue(new ConstraintViolationList()));
  22. $context = DeserializationContext::create()->setAttribute('validation_groups', array('foo'));
  23. $this->subscriber->onPostDeserialize(new ObjectEvent($context, $obj, array()));
  24. }
  25. /**
  26. * @expectedException JMS\Serializer\Exception\ValidationFailedException
  27. * @expectedExceptionMessage Validation failed with 1 error(s).
  28. */
  29. public function testValidateThrowsExceptionWhenListIsNotEmpty()
  30. {
  31. $obj = new \stdClass;
  32. $this->validator->expects($this->once())
  33. ->method('validate')
  34. ->with($obj, array('foo'))
  35. ->will($this->returnValue(new ConstraintViolationList(array(new ConstraintViolation('foo', 'foo', array(), 'a', 'b', 'c')))));
  36. $context = DeserializationContext::create()->setAttribute('validation_groups', array('foo'));
  37. $this->subscriber->onPostDeserialize(new ObjectEvent($context, $obj, array()));
  38. }
  39. public function testValidatorIsNotCalledWhenNoGroupsAreSet()
  40. {
  41. $this->validator->expects($this->never())
  42. ->method('validate');
  43. $this->subscriber->onPostDeserialize(new ObjectEvent(DeserializationContext::create(), new \stdClass, array()));
  44. }
  45. public function testValidationIsOnlyPerformedOnRootObject()
  46. {
  47. $this->validator->expects($this->once())
  48. ->method('validate')
  49. ->with($this->isInstanceOf('JMS\Serializer\Tests\Fixtures\AuthorList'), array('Foo'))
  50. ->will($this->returnValue(new ConstraintViolationList()));
  51. $subscriber = $this->subscriber;
  52. $list = SerializerBuilder::create()
  53. ->configureListeners(function (EventDispatcher $dispatcher) use ($subscriber) {
  54. $dispatcher->addSubscriber($subscriber);
  55. })
  56. ->build()
  57. ->deserialize(
  58. '{"authors":[{"full_name":"foo"},{"full_name":"bar"}]}',
  59. 'JMS\Serializer\Tests\Fixtures\AuthorList',
  60. 'json',
  61. DeserializationContext::create()->setAttribute('validation_groups', array('Foo'))
  62. );
  63. $this->assertCount(2, $list);
  64. }
  65. protected function setUp()
  66. {
  67. if (!interface_exists('Symfony\Component\Validator\ValidatorInterface')) {
  68. $this->markTestSkipped('Symfony\Component\Validator\ValidatorInterface is not available');
  69. }
  70. $this->validator = $this->getMockBuilder('Symfony\Component\Validator\ValidatorInterface')->getMock();
  71. $this->subscriber = new SymfonyValidatorSubscriber($this->validator);
  72. }
  73. }