diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d6b0f9..5e87503 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.1] +### Changed +- Fixed handling the `date_get_last_errors` function returning `false` since PHP 8.2 when no errors occurred +- Updated `mocker/mockery` to `^1.3` + ## [1.3.0] ### Added - Allow library to work with different versions of `paysera/lib-object-wrapper` since `0.3.0` diff --git a/composer.json b/composer.json index ba766c2..fa8a1f6 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ }, "require-dev": { "phpunit/phpunit": "^6.5 || ^9.0", - "mockery/mockery": "^1.2", + "mockery/mockery": "^1.3", "ext-json": "*" }, "config": { diff --git a/src/Normalizer/DateTimeNormalizer.php b/src/Normalizer/DateTimeNormalizer.php index c1c1961..ab7bb75 100644 --- a/src/Normalizer/DateTimeNormalizer.php +++ b/src/Normalizer/DateTimeNormalizer.php @@ -54,7 +54,7 @@ public function denormalize($input, DenormalizationContext $context) throw new InvalidDataException('Provided date format is invalid'); } $dateErrors = date_get_last_errors(); - if ($dateErrors['warning_count'] > 0 || $dateErrors['error_count'] > 0) { + if ($dateErrors !== false && ($dateErrors['warning_count'] > 0 || $dateErrors['error_count'] > 0)) { throw new InvalidDataException('The parsed date was invalid'); } return $date->setTimezone($this->getLocalTimezone()); diff --git a/tests/DateTimeNormalizerFunctionalTest.php b/tests/DateTimeNormalizerFunctionalTest.php new file mode 100644 index 0000000..f50d2b1 --- /dev/null +++ b/tests/DateTimeNormalizerFunctionalTest.php @@ -0,0 +1,105 @@ +getGroupedNormalizerRegistryProvider(self::TIMESTAMP_FORMAT); + + $coreDenormalizer = new CoreDenormalizer($normalizerRegistryProvider); + $coreNormalizer = new CoreNormalizer($normalizerRegistryProvider, new TypeGuesser(), new DataFilter()); + + $timestamp = 1514808794; + + $dateTime = new DateTime('now', new DateTimeZone('Europe/Vilnius')); + $dateTime->setTimestamp($timestamp); + $normalized = $coreNormalizer->normalize($dateTime); + + $this->assertSame((string)$timestamp, $normalized); + + /** @var DateTimeImmutable $denormalized */ + $denormalized = $coreDenormalizer->denormalize($normalized, DateTimeImmutable::class); + $this->assertInstanceOf(DateTimeImmutable::class, $denormalized); + $this->assertSame($timestamp, $denormalized->getTimestamp()); + + /** @var DateTimeInterface $denormalized */ + $denormalized = $coreDenormalizer->denormalize($normalized, DateTimeInterface::class); + $this->assertInstanceOf(DateTimeImmutable::class, $denormalized); + $this->assertSame($timestamp, $denormalized->getTimestamp()); + + /** @var DateTime $denormalized */ + $denormalized = $coreDenormalizer->denormalize($normalized, DateTime::class); + $this->assertInstanceOf(DateTime::class, $denormalized); + $this->assertSame($timestamp, $denormalized->getTimestamp()); + } + + public function testDateTimeNormalizer() + { + $normalizerRegistryProvider = $this->getGroupedNormalizerRegistryProvider(self::DATETIME_FORMAT); + + $coreDenormalizer = new CoreDenormalizer($normalizerRegistryProvider); + $coreNormalizer = new CoreNormalizer($normalizerRegistryProvider, new TypeGuesser(), new DataFilter()); + + $timestamp = 1514808794; + + $dateTime = new DateTime('now', new DateTimeZone('Europe/Vilnius')); + $dateTime->setTimestamp($timestamp); + $expected = new DateTime('now', new DateTimeZone(date_default_timezone_get())); + $expected->setTimestamp($timestamp); + + $normalized = $coreNormalizer->normalize($dateTime); + + $this->assertSame($expected->format('Y-m-d\TH:i:sP'), $normalized); + + /** @var DateTimeImmutable $denormalized */ + $denormalized = $coreDenormalizer->denormalize($normalized, DateTimeImmutable::class); + $this->assertInstanceOf(DateTimeImmutable::class, $denormalized); + $this->assertSame($timestamp, $denormalized->getTimestamp()); + + /** @var DateTimeInterface $denormalized */ + $denormalized = $coreDenormalizer->denormalize($normalized, DateTimeInterface::class); + $this->assertInstanceOf(DateTimeImmutable::class, $denormalized); + $this->assertSame($timestamp, $denormalized->getTimestamp()); + + /** @var DateTime $denormalized */ + $denormalized = $coreDenormalizer->denormalize($normalized, DateTime::class); + $this->assertInstanceOf(DateTime::class, $denormalized); + $this->assertSame($timestamp, $denormalized->getTimestamp()); + } + + private function getGroupedNormalizerRegistryProvider(string $format) + { + $normalizerRegistryProvider = new GroupedNormalizerRegistryProvider(); + + $normalizerRegistryProvider->addNormalizer(new DateTimeNormalizer($format)); + $normalizerRegistryProvider->addNormalizer(new DateTimeImmutableNormalizer($format)); + + $normalizerRegistryProvider->addMixedTypeDenormalizer(new DateTimeNormalizer($format)); + $normalizerRegistryProvider->addMixedTypeDenormalizer(new DateTimeImmutableNormalizer($format)); + $normalizerRegistryProvider->addMixedTypeDenormalizer( + new DateTimeImmutableNormalizer($format), + DateTimeInterface::class + ); + + return $normalizerRegistryProvider; + } +}