SerializerTest.php 4.5 KB

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