SerializerTest.php 3.9 KB

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