Skip to content

Commit 859d4ca

Browse files
author
Mikhail Bakulin
authored
Merge pull request #3 from DoclerLabs/remove-specific-payload-handling-in-response-handler
Removed data key handling from ResponseHandler when handling payload
2 parents b51a5bc + 9f58a02 commit 859d4ca

File tree

5 files changed

+55
-38
lines changed

5 files changed

+55
-38
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
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.0.0] - 2020-08-31
8+
### Changed
9+
- The response handling in `ResponseHandler`: Removed "data" key handling when handling payload.
10+
711
## [2.0.1] - 2020-08-24
812
### Fixed
913
- The superkey "data" handling in ResponseHandler.

src/Response/Handler/ResponseHandler.php

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use DoclerLabs\ApiClientBase\Json\JsonException;
1212
use DoclerLabs\ApiClientBase\Response\Response;
1313
use Psr\Http\Message\ResponseInterface;
14+
use Psr\Http\Message\StreamInterface;
1415

1516
class ResponseHandler implements ResponseHandlerInterface
1617
{
@@ -28,45 +29,47 @@ class ResponseHandler implements ResponseHandlerInterface
2829
*/
2930
public function handle(ResponseInterface $response): Response
3031
{
31-
$statusCode = $response->getStatusCode();
32-
$body = $response->getBody();
33-
$headers = $response->getHeaders();
32+
$statusCode = $response->getStatusCode();
33+
$body = $response->getBody();
34+
$headers = $response->getHeaders();
35+
$isResponseBodyEmpty = $this->isResponseBodyEmpty($body);
36+
$responseBody = '';
37+
38+
if (!$isResponseBodyEmpty) {
39+
$responseBody = (string)$body;
40+
}
3441

3542
if ($statusCode >= 200 && $statusCode < 300) {
36-
if ($body === null || (int)$body->getSize() === 0) {
37-
return new Response($statusCode, [], $headers);
43+
if ($isResponseBodyEmpty) {
44+
return new Response($statusCode, $headers);
3845
}
3946

40-
$payload = Json::decode($body->__toString(), true, 512, self::JSON_OPTIONS);
47+
$decodedPayload = Json::decode($responseBody, true, 512, self::JSON_OPTIONS);
4148

42-
if (isset($payload['data']) && count(array_keys($payload)) === 1) {
43-
$payload = $payload['data'];
44-
}
45-
46-
return new Response($statusCode, $payload, $headers);
47-
}
48-
49-
$errorPayload = '';
50-
if ($body !== null) {
51-
$errorPayload = (string)$body;
49+
return new Response($statusCode, $headers, $decodedPayload);
5250
}
5351

5452
if ($statusCode === 400) {
55-
throw new BadRequestResponseException($errorPayload);
53+
throw new BadRequestResponseException($responseBody);
5654
}
5755

5856
if ($statusCode === 401) {
59-
throw new UnauthorizedResponseException($errorPayload);
57+
throw new UnauthorizedResponseException($responseBody);
6058
}
6159

6260
if ($statusCode === 403) {
63-
throw new ForbiddenResponseException($errorPayload);
61+
throw new ForbiddenResponseException($responseBody);
6462
}
6563

6664
if ($statusCode === 404) {
67-
throw new NotFoundResponseException($errorPayload);
65+
throw new NotFoundResponseException($responseBody);
6866
}
6967

70-
throw new UnexpectedResponseException($statusCode, $errorPayload);
68+
throw new UnexpectedResponseException($statusCode, $responseBody);
69+
}
70+
71+
private function isResponseBodyEmpty(StreamInterface $responseBody = null): bool
72+
{
73+
return $responseBody === null || (int)$responseBody->getSize() === 0;
7174
}
7275
}

src/Response/Response.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,30 @@ class Response
88
private $statusCode;
99

1010
/** @var array */
11-
private $payload;
11+
private $headers;
1212

1313
/** @var array */
14-
private $headers;
14+
private $payload;
1515

16-
public function __construct(int $statusCode, array $payload = [], array $headers = [])
16+
public function __construct(int $statusCode, array $headers = [], $payload = null)
1717
{
1818
$this->statusCode = $statusCode;
19-
$this->payload = $payload;
2019
$this->headers = $headers;
20+
$this->payload = $payload;
2121
}
2222

2323
public function getStatusCode(): int
2424
{
2525
return $this->statusCode;
2626
}
2727

28-
public function getPayload(): array
28+
public function getHeaders(): array
2929
{
30-
return $this->payload;
30+
return $this->headers;
3131
}
3232

33-
public function getHeaders(): array
33+
public function getPayload()
3434
{
35-
return $this->headers;
35+
return $this->payload;
3636
}
37-
}
37+
}

test/suite/unit/Response/Handler/ResponseHandlerTest.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ResponseHandlerTest extends TestCase
2020
{
2121
/**
2222
* @covers ::handle
23+
* @covers ::isResponseBodyEmpty
2324
*/
2425
public function testResponse()
2526
{
@@ -59,6 +60,7 @@ public function testResponse()
5960

6061
/**
6162
* @covers ::handle
63+
* @covers ::isResponseBodyEmpty
6264
*/
6365
public function testResponseWithDataAndExtraFields()
6466
{
@@ -98,6 +100,7 @@ public function testResponseWithDataAndExtraFields()
98100

99101
/**
100102
* @covers ::handle
103+
* @covers ::isResponseBodyEmpty
101104
*/
102105
public function testResponseWithData()
103106
{
@@ -107,7 +110,7 @@ public function testResponseWithData()
107110
$testRawBody = '{"data":{"test-key":"test-value"}}';
108111
$testHeaders = ['X-Foo' => 'bar'];
109112
$testBodySize = 10;
110-
$expectedBody = ['test-key' => 'test-value'];
113+
$expectedBody = ['data' => ['test-key' => 'test-value']];
111114
$expectedHeaders = $testHeaders;
112115

113116
$stream = $this->createMock(StreamInterface::class);
@@ -131,12 +134,13 @@ public function testResponseWithData()
131134

132135
$result = $handler->handle($response);
133136

134-
self::assertEquals($expectedBody, $result->getPayload());
135137
self::assertEquals($expectedHeaders, $result->getHeaders());
138+
self::assertEquals($expectedBody, $result->getPayload());
136139
}
137140

138141
/**
139142
* @covers ::handle
143+
* @covers ::isResponseBodyEmpty
140144
*/
141145
public function testResponseEmpty()
142146
{
@@ -157,12 +161,13 @@ public function testResponseEmpty()
157161

158162
$result = $handler->handle($response);
159163

160-
self::assertEquals([], $result->getPayload());
161164
self::assertEquals([], $result->getHeaders());
165+
self::assertNull($result->getPayload());
162166
}
163167

164168
/**
165169
* @covers ::handle
170+
* @covers ::isResponseBodyEmpty
166171
*/
167172
public function testResponseEmptyWhenBodySizeIsEmpty()
168173
{
@@ -189,13 +194,14 @@ public function testResponseEmptyWhenBodySizeIsEmpty()
189194

190195
$result = $handler->handle($response);
191196

192-
self::assertEquals([], $result->getPayload());
193197
self::assertEquals([], $result->getHeaders());
198+
self::assertNull($result->getPayload());
194199
}
195200

196201
/**
197202
* @dataProvider exceptionsDataProvider
198203
* @covers ::handle
204+
* @covers ::isResponseBodyEmpty
199205
*/
200206
public function testHttpError(int $testStatusCode, string $exceptionClassName)
201207
{
@@ -207,9 +213,13 @@ public function testHttpError(int $testStatusCode, string $exceptionClassName)
207213
->willReturn($testStatusCode);
208214

209215
$body = $this->createMock(StreamInterface::class);
216+
$body->expects(self::once())
217+
->method('getSize')
218+
->willReturn(20);
219+
210220
$body->expects(self::once())
211221
->method('__toString')
212-
->willReturn('');
222+
->willReturn(json_encode(['error' => 'something went wrong']));
213223

214224
$response->expects(self::once())
215225
->method('getBody')

test/suite/unit/Response/ResponseTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ public function testFilled()
3535
{
3636
$body = ['foo'];
3737
$headers = ['bar'];
38-
$responseData = new Response(2000, $body, $headers);
38+
$responseData = new Response(2000, $headers, $body);
3939

4040
self::assertSame(2000, $responseData->getStatusCode());
41-
self::assertSame($body, $responseData->getPayload());
4241
self::assertSame($headers, $responseData->getHeaders());
42+
self::assertSame($body, $responseData->getPayload());
4343
}
44-
}
44+
}

0 commit comments

Comments
 (0)