Skip to content

Commit d00bd99

Browse files
authored
Merge pull request #22 from veewee/janvernieuwe-serializer-improvements
Janvernieuwe serializer improvements
2 parents cbc2adc + 7cb114a commit d00bd99

4 files changed

Lines changed: 92 additions & 20 deletions

File tree

psalm.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
<projectFiles>
1010
<directory name="src" />
1111
<directory name="examples" />
12+
<directory name="static-analysis" />
1213
<ignoreFiles>
13-
<directory name="vendor" />
1414
<directory name="tests" />
15+
<directory name="vendor" />
1516
</ignoreFiles>
1617
</projectFiles>
1718
<stubs>

src/Transport/Serializer/SerializerTransport.php

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use Phpro\HttpTools\Request\Request;
88
use Phpro\HttpTools\Request\RequestInterface;
9-
use Phpro\HttpTools\Serializer\SerializerException;
109
use Phpro\HttpTools\Serializer\SerializerInterface;
1110
use Phpro\HttpTools\Transport\TransportInterface;
1211

@@ -57,20 +56,19 @@ public function withOutputType(string $output): self
5756

5857
public function __invoke(RequestInterface $request)
5958
{
60-
if (!$this->outputType) {
61-
throw SerializerException::noDeserializeTypeSpecified();
59+
$response = ($this->transport)(
60+
new Request(
61+
$request->method(),
62+
$request->uri(),
63+
$request->uriParameters(),
64+
null === $request->body() ? '' : $this->serializer->serialize($request->body())
65+
)
66+
);
67+
68+
if (null === $this->outputType) {
69+
return;
6270
}
6371

64-
return $this->serializer->deserialize(
65-
($this->transport)(
66-
new Request(
67-
$request->method(),
68-
$request->uri(),
69-
$request->uriParameters(),
70-
$this->serializer->serialize($request->body())
71-
)
72-
),
73-
$this->outputType
74-
);
72+
return $this->serializer->deserialize($response, $this->outputType);
7573
}
7674
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Phpro\HttpTools\StaticAnalysis\Transport\Serializer;
6+
7+
use Phpro\HttpTools\Request\Request;
8+
use Phpro\HttpTools\Serializer\SerializerInterface;
9+
use Phpro\HttpTools\Transport\Serializer\SerializerTransport;
10+
use Phpro\HttpTools\Transport\TransportInterface;
11+
12+
final class Foo
13+
{
14+
}
15+
16+
/**
17+
* @param SerializerTransport<Foo, null> $x
18+
*
19+
* @return null
20+
*/
21+
function testEmptySerializer(SerializerTransport $x)
22+
{
23+
return $x(new Request('GET', '/', [], new Foo()));
24+
}
25+
26+
/**
27+
* @param SerializerTransport<Foo, Foo> $x
28+
*/
29+
function testTargetSerializer(SerializerTransport $x): Foo
30+
{
31+
return $x(new Request('GET', '/', [], new Foo()));
32+
}
33+
34+
/**
35+
* @param TransportInterface<string, string> $transport
36+
*/
37+
function test(SerializerInterface $serializer, TransportInterface $transport): void
38+
{
39+
/** @var SerializerTransport<Foo, null> $serializerTransport */
40+
$serializerTransport = new SerializerTransport($serializer, $transport);
41+
42+
testEmptySerializer($serializerTransport);
43+
44+
testTargetSerializer($serializerTransport->withOutputType(Foo::class));
45+
}

tests/Unit/Transport/Serializer/SerializerTransportTest.php

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use Http\Message\RequestMatcher\CallbackRequestMatcher;
88
use Http\Mock\Client;
9-
use Phpro\HttpTools\Serializer\SerializerException;
109
use Phpro\HttpTools\Serializer\SymfonySerializer;
1110
use Phpro\HttpTools\Test\UseHttpToolsFactories;
1211
use Phpro\HttpTools\Test\UseMockClient;
@@ -68,13 +67,42 @@ public function it_can_serialize_request_and_deserialize_response_body_and_trans
6867
}
6968

7069
/** @test */
71-
public function it_can_not_serialize_requests_if_the_output_value_is_not_known(): void
70+
public function it_can_handle_requests_without_request_object(): void
7271
{
7372
$valueObject = new SomeValueObject('Hello', 'World');
73+
$jsonData = Json\encode($data = ['x' => 'Hello', 'y' => 'World']);
74+
$request = $this->createToolsRequest('GET', '/', []);
75+
76+
$this->client->on(
77+
new CallbackRequestMatcher(
78+
fn (RequestInterface $httpRequest): bool => '' === (string) $httpRequest->getBody()
79+
),
80+
$this->createResponse()->withBody($this->createStream($jsonData))
81+
);
82+
83+
$transport = $this->transport->withOutputType(SomeValueObject::class);
84+
$result = $transport($request);
85+
86+
self::assertEquals($valueObject, $result);
87+
}
88+
89+
/** @test */
90+
public function it_can_handle_requests_without_response_type(): void
91+
{
92+
$valueObject = new SomeValueObject('Hello', 'World');
93+
$jsonData = Json\encode($data = ['x' => 'Hello', 'y' => 'World']);
7494
$request = $this->createToolsRequest('GET', '/', [], $valueObject);
7595

76-
$this->expectException(SerializerException::class);
77-
$this->expectExceptionMessage(SerializerException::noDeserializeTypeSpecified()->getMessage());
78-
($this->transport)($request);
96+
$this->client->on(
97+
new CallbackRequestMatcher(
98+
fn (RequestInterface $httpRequest): bool => (string) $httpRequest->getBody() === $jsonData
99+
),
100+
$this->createResponse()->withBody($this->createStream($jsonData))
101+
);
102+
103+
$transport = $this->transport;
104+
$result = $transport($request);
105+
106+
self::assertEquals(null, $result);
79107
}
80108
}

0 commit comments

Comments
 (0)