Skip to content

Commit a25b7f5

Browse files
OkspenAndrii Krasnoholovets
andauthored
AC-282: fix date_get_last_errors() returning false (#7)
* AC-282: fix date_get_last_errors() returning false * AC-282: mockery/mockery:^1.3 --------- Co-authored-by: Andrii Krasnoholovets <andrii.krasnoholovets@paysera.net>
1 parent 6948328 commit a25b7f5

File tree

4 files changed

+112
-2
lines changed

4 files changed

+112
-2
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [1.3.1]
8+
### Changed
9+
- Fixed handling the `date_get_last_errors` function returning `false` since PHP 8.2 when no errors occurred
10+
- Updated `mocker/mockery` to `^1.3`
11+
712
## [1.3.0]
813
### Added
914
- Allow library to work with different versions of `paysera/lib-object-wrapper` since `0.3.0`

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
},
2020
"require-dev": {
2121
"phpunit/phpunit": "^6.5 || ^9.0",
22-
"mockery/mockery": "^1.2",
22+
"mockery/mockery": "^1.3",
2323
"ext-json": "*"
2424
},
2525
"config": {

src/Normalizer/DateTimeNormalizer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public function denormalize($input, DenormalizationContext $context)
5454
throw new InvalidDataException('Provided date format is invalid');
5555
}
5656
$dateErrors = date_get_last_errors();
57-
if ($dateErrors['warning_count'] > 0 || $dateErrors['error_count'] > 0) {
57+
if ($dateErrors !== false && ($dateErrors['warning_count'] > 0 || $dateErrors['error_count'] > 0)) {
5858
throw new InvalidDataException('The parsed date was invalid');
5959
}
6060
return $date->setTimezone($this->getLocalTimezone());
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Paysera\Component\Normalization\Tests;
5+
6+
use DateTime;
7+
use DateTimeImmutable;
8+
use DateTimeInterface;
9+
use DateTimeZone;
10+
use Mockery\Adapter\Phpunit\MockeryTestCase;
11+
use Paysera\Component\Normalization\CoreDenormalizer;
12+
use Paysera\Component\Normalization\CoreNormalizer;
13+
use Paysera\Component\Normalization\DataFilter;
14+
use Paysera\Component\Normalization\Normalizer\DateTimeImmutableNormalizer;
15+
use Paysera\Component\Normalization\Normalizer\DateTimeNormalizer;
16+
use Paysera\Component\Normalization\Registry\GroupedNormalizerRegistryProvider;
17+
use Paysera\Component\Normalization\TypeGuesser;
18+
19+
class DateTimeNormalizerFunctionalTest extends MockeryTestCase
20+
{
21+
const TIMESTAMP_FORMAT = 'U';
22+
const DATETIME_FORMAT = 'Y-m-d\TH:i:sP';
23+
24+
public function testDateTimeNormalizerWithTimestampFormat()
25+
{
26+
$normalizerRegistryProvider = $this->getGroupedNormalizerRegistryProvider(self::TIMESTAMP_FORMAT);
27+
28+
$coreDenormalizer = new CoreDenormalizer($normalizerRegistryProvider);
29+
$coreNormalizer = new CoreNormalizer($normalizerRegistryProvider, new TypeGuesser(), new DataFilter());
30+
31+
$timestamp = 1514808794;
32+
33+
$dateTime = new DateTime('now', new DateTimeZone('Europe/Vilnius'));
34+
$dateTime->setTimestamp($timestamp);
35+
$normalized = $coreNormalizer->normalize($dateTime);
36+
37+
$this->assertSame((string)$timestamp, $normalized);
38+
39+
/** @var DateTimeImmutable $denormalized */
40+
$denormalized = $coreDenormalizer->denormalize($normalized, DateTimeImmutable::class);
41+
$this->assertInstanceOf(DateTimeImmutable::class, $denormalized);
42+
$this->assertSame($timestamp, $denormalized->getTimestamp());
43+
44+
/** @var DateTimeInterface $denormalized */
45+
$denormalized = $coreDenormalizer->denormalize($normalized, DateTimeInterface::class);
46+
$this->assertInstanceOf(DateTimeImmutable::class, $denormalized);
47+
$this->assertSame($timestamp, $denormalized->getTimestamp());
48+
49+
/** @var DateTime $denormalized */
50+
$denormalized = $coreDenormalizer->denormalize($normalized, DateTime::class);
51+
$this->assertInstanceOf(DateTime::class, $denormalized);
52+
$this->assertSame($timestamp, $denormalized->getTimestamp());
53+
}
54+
55+
public function testDateTimeNormalizer()
56+
{
57+
$normalizerRegistryProvider = $this->getGroupedNormalizerRegistryProvider(self::DATETIME_FORMAT);
58+
59+
$coreDenormalizer = new CoreDenormalizer($normalizerRegistryProvider);
60+
$coreNormalizer = new CoreNormalizer($normalizerRegistryProvider, new TypeGuesser(), new DataFilter());
61+
62+
$timestamp = 1514808794;
63+
64+
$dateTime = new DateTime('now', new DateTimeZone('Europe/Vilnius'));
65+
$dateTime->setTimestamp($timestamp);
66+
$expected = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
67+
$expected->setTimestamp($timestamp);
68+
69+
$normalized = $coreNormalizer->normalize($dateTime);
70+
71+
$this->assertSame($expected->format('Y-m-d\TH:i:sP'), $normalized);
72+
73+
/** @var DateTimeImmutable $denormalized */
74+
$denormalized = $coreDenormalizer->denormalize($normalized, DateTimeImmutable::class);
75+
$this->assertInstanceOf(DateTimeImmutable::class, $denormalized);
76+
$this->assertSame($timestamp, $denormalized->getTimestamp());
77+
78+
/** @var DateTimeInterface $denormalized */
79+
$denormalized = $coreDenormalizer->denormalize($normalized, DateTimeInterface::class);
80+
$this->assertInstanceOf(DateTimeImmutable::class, $denormalized);
81+
$this->assertSame($timestamp, $denormalized->getTimestamp());
82+
83+
/** @var DateTime $denormalized */
84+
$denormalized = $coreDenormalizer->denormalize($normalized, DateTime::class);
85+
$this->assertInstanceOf(DateTime::class, $denormalized);
86+
$this->assertSame($timestamp, $denormalized->getTimestamp());
87+
}
88+
89+
private function getGroupedNormalizerRegistryProvider(string $format)
90+
{
91+
$normalizerRegistryProvider = new GroupedNormalizerRegistryProvider();
92+
93+
$normalizerRegistryProvider->addNormalizer(new DateTimeNormalizer($format));
94+
$normalizerRegistryProvider->addNormalizer(new DateTimeImmutableNormalizer($format));
95+
96+
$normalizerRegistryProvider->addMixedTypeDenormalizer(new DateTimeNormalizer($format));
97+
$normalizerRegistryProvider->addMixedTypeDenormalizer(new DateTimeImmutableNormalizer($format));
98+
$normalizerRegistryProvider->addMixedTypeDenormalizer(
99+
new DateTimeImmutableNormalizer($format),
100+
DateTimeInterface::class
101+
);
102+
103+
return $normalizerRegistryProvider;
104+
}
105+
}

0 commit comments

Comments
 (0)