Skip to content

Commit 60a9059

Browse files
authored
Merge pull request #20 from DoclerLabs/fix-date-time-query-serialization
fix: `DateTimeInterface` serialization in `QuerySerializer`
2 parents 637b8fe + 92b2219 commit 60a9059

File tree

3 files changed

+131
-0
lines changed

3 files changed

+131
-0
lines changed

CHANGELOG.md

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

7+
## [3.2.1] - 2020-11-24
8+
### Fixed
9+
- `DateTimeInterface` serialization in `QuerySerializer`
10+
711
## [3.2.0] - 2020-11-10
812
### Added
913
- Query parameters which implement `JsonSerializable` will be converted accordingly.

src/Output/Copy/Serializer/QuerySerializer.php

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace DoclerLabs\ApiClientGenerator\Output\Copy\Serializer;
44

5+
use DateTimeInterface;
56
use DoclerLabs\ApiClientGenerator\Output\Copy\Request\RequestInterface;
67
use DoclerLabs\ApiClientGenerator\Output\Copy\Schema\SerializableInterface;
78
use JsonSerializable;
@@ -15,6 +16,8 @@ public function serializeRequest(RequestInterface $request): string
1516
foreach ($request->getRawQueryParameters() as $name => $value) {
1617
if ($value === null) {
1718
continue;
19+
} elseif ($value instanceof DateTimeInterface) {
20+
$value = $value->format(DateTimeInterface::RFC3339);
1821
} elseif ($value instanceof SerializableInterface) {
1922
$value = $value->toArray();
2023
} elseif ($value instanceof JsonSerializable) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DoclerLabs\ApiClientGenerator\Test\Unit\Output\Copy\Serializer;
6+
7+
use DateTimeImmutable;
8+
use DateTimeInterface;
9+
use DateTimeZone;
10+
use DoclerLabs\ApiClientGenerator\Output\Copy\Request\RequestInterface;
11+
use DoclerLabs\ApiClientGenerator\Output\Copy\Schema\SerializableInterface;
12+
use DoclerLabs\ApiClientGenerator\Output\Copy\Serializer\QuerySerializer;
13+
use JsonSerializable;
14+
use PHPUnit\Framework\TestCase;
15+
16+
class QuerySerializerTest extends TestCase
17+
{
18+
private QuerySerializer $sut;
19+
20+
protected function setUp(): void
21+
{
22+
$this->sut = new QuerySerializer();
23+
}
24+
25+
/**
26+
* @dataProvider dataProvider
27+
*/
28+
public function testSerialization(array $rawQueryParameters, array $expected): void
29+
{
30+
$request = $this->createMock(RequestInterface::class);
31+
$request->expects(self::once())
32+
->method('getRawQueryParameters')
33+
->willReturn($rawQueryParameters);
34+
35+
parse_str($this->sut->serializeRequest($request), $actual);
36+
self::assertSame(
37+
$expected,
38+
$actual
39+
);
40+
}
41+
42+
public function dataProvider(): array
43+
{
44+
$serializable = $this->createMock(SerializableInterface::class);
45+
$serializable->expects(self::once())
46+
->method('toArray')
47+
->willReturn($serialized = ['foo' => 'bar']);
48+
49+
$jsonSerializable = $this->createMock(JsonSerializable::class);
50+
$jsonSerializable->expects(self::once())
51+
->method('jsonSerialize')
52+
->willReturn($jsonSerialized = ['bar' => 'foo']);
53+
54+
return [
55+
'DateTime' => [
56+
[
57+
'dateTime' => $dateTime = new DateTimeImmutable(
58+
'2020-11-24 01:02:03',
59+
new DateTimeZone('Europe/Luxembourg')
60+
),
61+
],
62+
[
63+
'dateTime' => $dateTime->format(DateTimeInterface::RFC3339),
64+
],
65+
],
66+
'Nullable' => [
67+
[
68+
'nullable' => null,
69+
],
70+
[],
71+
],
72+
'Integer' => [
73+
[
74+
'integer' => $integer = 11,
75+
],
76+
[
77+
'integer' => (string)$integer,
78+
],
79+
],
80+
'String' => [
81+
[
82+
'string' => $string = 'simple string',
83+
],
84+
[
85+
'string' => $string,
86+
],
87+
],
88+
'Float' => [
89+
[
90+
'float' => $float = 42.13,
91+
],
92+
[
93+
'float' => (string)$float,
94+
],
95+
],
96+
'Boolean' => [
97+
[
98+
'booleanTrue' => $booleanTrue = true,
99+
'booleanFalse' => $booleanFalse = false,
100+
],
101+
[
102+
'booleanTrue' => (string)(int)$booleanTrue,
103+
'booleanFalse' => (string)(int)$booleanFalse,
104+
],
105+
],
106+
'Serializable interface' => [
107+
[
108+
'serializable' => $serializable,
109+
],
110+
[
111+
'serializable' => $serialized,
112+
],
113+
],
114+
'JsonSerializable interface' => [
115+
[
116+
'jsonSerializable' => $jsonSerializable,
117+
],
118+
[
119+
'jsonSerializable' => $jsonSerialized,
120+
],
121+
],
122+
];
123+
}
124+
}

0 commit comments

Comments
 (0)