SerializerTest.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace JMS\SerializerBundle\Tests\Serializer;
  3. use JMS\SerializerBundle\Tests\Fixtures\ObjectWithLifecycleCallbacks;
  4. use Doctrine\Common\Annotations\AnnotationReader;
  5. use Metadata\MetadataFactory;
  6. use JMS\SerializerBundle\Serializer\UnserializeInstanceCreator;
  7. use JMS\SerializerBundle\Metadata\Driver\AnnotationDriver;
  8. use JMS\SerializerBundle\Serializer\Exclusion\AllExclusionStrategy;
  9. use JMS\SerializerBundle\Serializer\Normalizer\PropertyBasedNormalizer;
  10. use JMS\SerializerBundle\Tests\Fixtures\Comment;
  11. use JMS\SerializerBundle\Tests\Fixtures\Author;
  12. use JMS\SerializerBundle\Tests\Fixtures\AuthorList;
  13. use JMS\SerializerBundle\Tests\Fixtures\BlogPost;
  14. use JMS\SerializerBundle\Tests\Fixtures\NoopNormalizer;
  15. use JMS\SerializerBundle\Serializer\Normalizer\ArrayCollectionNormalizer;
  16. use JMS\SerializerBundle\Serializer\Naming\SerializedNameAnnotationStrategy;
  17. use JMS\SerializerBundle\Serializer\SerializerFactory;
  18. use JMS\SerializerBundle\Serializer\Exclusion\NoneExclusionStrategy;
  19. use JMS\SerializerBundle\Serializer\Exclusion\ExclusionStrategyFactory;
  20. use JMS\SerializerBundle\Serializer\Naming\CamelCaseNamingStrategy;
  21. use JMS\SerializerBundle\Serializer\Naming\AnnotatedNamingStrategy;
  22. use JMS\SerializerBundle\Serializer\Normalizer\NativePhpTypeNormalizer;
  23. use JMS\SerializerBundle\Serializer\Serializer;
  24. use JMS\SerializerBundle\Serializer\Encoder\JsonEncoder;
  25. use JMS\SerializerBundle\Serializer\Encoder\XmlEncoder;
  26. class SerializerTest extends \PHPUnit_Framework_TestCase
  27. {
  28. public function testNormalize()
  29. {
  30. $serializer = $this->getSerializer();
  31. $post = new BlogPost('Foo', new Author('Bar'));
  32. $normalized = $serializer->normalize($post);
  33. $this->assertTrue(isset($normalized['created_at']));
  34. unset($normalized['created_at']);
  35. $this->assertEquals(array(
  36. 'title' => 'Foo',
  37. 'published' => false,
  38. 'author' => array(
  39. 'full_name' => 'Bar',
  40. ),
  41. 'comments' => array(),
  42. ), $normalized);
  43. $noop = new NoopNormalizer();
  44. $serializer = $this->getSerializer(null, null, array($noop));
  45. $list = new AuthorList();
  46. $list->add(new Author('Bar'));
  47. $normalized = $serializer->normalize($list);
  48. $this->assertEquals(array(), $normalized);
  49. $normalized = $serializer->normalize(array('foo'));
  50. $this->assertEquals(array('foo'), $normalized);
  51. }
  52. public function testDenormalize()
  53. {
  54. $serializer = $this->getSerializer();
  55. $post = new BlogPost('Foo', new Author('Bar'));
  56. $post->addComment(new Comment(new Author('Johannes'), 'FooBar'));
  57. $normalized = $serializer->normalize($post);
  58. $post2 = $serializer->denormalize($normalized, 'JMS\SerializerBundle\Tests\Fixtures\BlogPost');
  59. $this->assertEquals($post, $post2);
  60. }
  61. public function testSerializeUnserialize()
  62. {
  63. $serializer = $this->getSerializer();
  64. $post = new BlogPost('foo', new Author('bar'));
  65. $post->setPublished();
  66. $post->addComment(new Comment(new Author('foo'), 'bar'));
  67. $post->addComment(new Comment(new Author('bar'), 'foo'));
  68. $serialized = $serializer->serialize($post, 'xml');
  69. $post2 = $serializer->deserialize($serialized, 'JMS\SerializerBundle\Tests\Fixtures\BlogPost', 'xml');
  70. $this->assertEquals($post, $post2);
  71. $serialized = $serializer->serialize($post, 'json');
  72. $post2 = $serializer->deserialize($serialized, 'JMS\SerializerBundle\Tests\Fixtures\BlogPost', 'json');
  73. $this->assertEquals($post, $post2);
  74. }
  75. public function testLifecycleCallbacks()
  76. {
  77. $serializer = $this->getSerializer();
  78. $object = new ObjectWithLifecycleCallbacks();
  79. $this->assertEquals(json_encode(array(
  80. 'name' => 'Foo Bar',
  81. )), $serialized = $serializer->serialize($object, 'json'));
  82. $this->assertAttributeEquals(null, 'name', $object);
  83. $deserializedObject = $serializer->deserialize($serialized, 'JMS\SerializerBundle\Tests\Fixtures\ObjectWithLifecycleCallbacks', 'json');
  84. $this->assertAttributeEquals('Foo', 'firstname', $deserializedObject);
  85. $this->assertAttributeEquals('Bar', 'lastname', $deserializedObject);
  86. $this->assertTrue($deserializedObject->preDeserializeCalled);
  87. }
  88. private function getSerializer($propertyNamingStrategy = null, $encoders = null, $customNormalizers = null)
  89. {
  90. if (null === $propertyNamingStrategy) {
  91. $propertyNamingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy());
  92. }
  93. if (null === $encoders) {
  94. $encoders = array(
  95. 'xml' => new XmlEncoder(),
  96. 'json' => new JsonEncoder(),
  97. );
  98. }
  99. if (null === $customNormalizers) {
  100. $customNormalizers = array(
  101. new ArrayCollectionNormalizer(),
  102. );
  103. }
  104. $exclusionStrategyFactory = new ExclusionStrategyFactory(array(
  105. 'ALL' => new AllExclusionStrategy(),
  106. 'NONE' => new NoneExclusionStrategy(),
  107. ));
  108. return new Serializer(
  109. new NativePhpTypeNormalizer(),
  110. new PropertyBasedNormalizer(new MetadataFactory(new AnnotationDriver(new AnnotationReader())), $propertyNamingStrategy, new UnserializeInstanceCreator(), $exclusionStrategyFactory),
  111. $customNormalizers,
  112. $encoders
  113. );
  114. }
  115. }