DateHandlerTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace JMS\Serializer\Tests\Handler;
  3. use JMS\Serializer\Handler\DateHandler;
  4. use JMS\Serializer\JsonDeserializationVisitor;
  5. use JMS\Serializer\SerializationContext;
  6. use JMS\Serializer\VisitorInterface;
  7. class DateHandlerTest extends \PHPUnit_Framework_TestCase
  8. {
  9. /**
  10. * @var DateHandler
  11. */
  12. private $handler;
  13. /**
  14. * @var \DateTimeZone
  15. */
  16. private $timezone;
  17. public function setUp()
  18. {
  19. $this->handler = new DateHandler();
  20. $this->timezone = new \DateTimeZone('UTC');
  21. }
  22. public function getParams()
  23. {
  24. return [
  25. [['Y-m-d']],
  26. [['Y-m-d', '', 'Y-m-d|']],
  27. [['Y-m-d', '', 'Y']],
  28. ];
  29. }
  30. /**
  31. * @dataProvider getParams
  32. * @param array $params
  33. */
  34. public function testSerializeDate(array $params)
  35. {
  36. $context = $this->getMockBuilder(SerializationContext::class)->getMock();
  37. $visitor = $this->getMockBuilder(VisitorInterface::class)->getMock();
  38. $visitor->method('visitString')->with('2017-06-18');
  39. $datetime = new \DateTime('2017-06-18 14:30:59', $this->timezone);
  40. $type = ['name' => 'DateTime', 'params' => $params];
  41. $this->handler->serializeDateTime($visitor, $datetime, $type, $context);
  42. }
  43. public function testTimePartGetsRemoved()
  44. {
  45. $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)
  46. ->disableOriginalConstructor()
  47. ->getMock();
  48. $type = ['name' => 'DateTime', 'params' => ['Y-m-d', '', 'Y-m-d|']];
  49. $this->assertEquals(
  50. \DateTime::createFromFormat('Y-m-d|', '2017-06-18', $this->timezone),
  51. $this->handler->deserializeDateTimeFromJson($visitor, '2017-06-18', $type)
  52. );
  53. }
  54. public function testTimePartGetsPreserved()
  55. {
  56. $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)
  57. ->disableOriginalConstructor()
  58. ->getMock();
  59. $expectedDateTime = \DateTime::createFromFormat('Y-m-d', '2017-06-18', $this->timezone);
  60. // if the test is executed exactly at midnight, it might not detect a possible failure since the time component will be "00:00:00
  61. // I know, this is a bit paranoid
  62. if ($expectedDateTime->format("H:i:s") === "00:00:00") {
  63. sleep(1);
  64. $expectedDateTime = \DateTime::createFromFormat('Y-m-d', '2017-06-18', $this->timezone);
  65. }
  66. // no custom deserialization format specified
  67. $type = ['name' => 'DateTime', 'params' => ['Y-m-d']];
  68. $this->assertEquals(
  69. $expectedDateTime,
  70. $this->handler->deserializeDateTimeFromJson($visitor, '2017-06-18', $type)
  71. );
  72. // custom deserialization format specified
  73. $type = ['name' => 'DateTime', 'params' => ['Y-m-d', '', 'Y-m-d']];
  74. $this->assertEquals(
  75. $expectedDateTime,
  76. $this->handler->deserializeDateTimeFromJson($visitor, '2017-06-18', $type)
  77. );
  78. }
  79. public function testTimeZoneGetsPreservedWithUnixTimestamp()
  80. {
  81. $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)
  82. ->disableOriginalConstructor()
  83. ->getMock();
  84. $timestamp = time();
  85. $timezone = 'Europe/Brussels';
  86. $type = ['name' => 'DateTime', 'params' => ['U', $timezone]];
  87. $expectedDateTime = \DateTime::createFromFormat('U', $timestamp);
  88. $expectedDateTime->setTimezone(new \DateTimeZone($timezone));
  89. $actualDateTime = $this->handler->deserializeDateTimeFromJson($visitor, $timestamp, $type);
  90. $this->assertEquals(
  91. $expectedDateTime->format(\DateTime::RFC3339),
  92. $actualDateTime->format(\DateTime::RFC3339)
  93. );
  94. }
  95. public function testImmutableTimeZoneGetsPreservedWithUnixTimestamp()
  96. {
  97. $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)
  98. ->disableOriginalConstructor()
  99. ->getMock();
  100. $timestamp = time();
  101. $timezone = 'Europe/Brussels';
  102. $type = ['name' => 'DateTimeImmutable', 'params' => ['U', $timezone]];
  103. $expectedDateTime = \DateTime::createFromFormat('U', $timestamp);
  104. $expectedDateTime->setTimezone(new \DateTimeZone($timezone));
  105. $actualDateTime = $this->handler->deserializeDateTimeImmutableFromJson($visitor, $timestamp, $type);
  106. $this->assertEquals(
  107. $expectedDateTime->format(\DateTime::RFC3339),
  108. $actualDateTime->format(\DateTime::RFC3339)
  109. );
  110. }
  111. }