diff --git a/.gitignore b/.gitignore index 0e22d4b..c7050eb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ /bin composer.lock composer.phar +coverage.xml +test-report.xml phpunit.xml .idea .DS_Store diff --git a/lib/RetailCrm/Client/AbstractLoader.php b/lib/RetailCrm/Client/AbstractLoader.php index c9c2905..c021a1a 100755 --- a/lib/RetailCrm/Client/AbstractLoader.php +++ b/lib/RetailCrm/Client/AbstractLoader.php @@ -29,8 +29,13 @@ use RetailCrm\Http\Client; */ abstract class AbstractLoader { + /** @var string|null */ protected $siteCode; + + /** @var \RetailCrm\Http\Client */ protected $client; + + /** @var string */ protected $crmUrl; /** diff --git a/lib/RetailCrm/Http/Client.php b/lib/RetailCrm/Http/Client.php index 3bb043e..f0c2840 100755 --- a/lib/RetailCrm/Http/Client.php +++ b/lib/RetailCrm/Http/Client.php @@ -75,7 +75,7 @@ class Client * * @return ApiResponse */ - public function makeRequest( + public function makeRawRequest( $path, $method, array $parameters = [], @@ -119,7 +119,7 @@ class Client curl_setopt($curlHandler, CURLOPT_POST, true); if ('/files/upload' == $path) { - curl_setopt($curlHandler, CURLOPT_POSTFIELDS, $parameters['file']); + curl_setopt($curlHandler, CURLOPT_POSTFIELDS, file_get_contents($parameters['file'])); } else { curl_setopt($curlHandler, CURLOPT_POSTFIELDS, $parameters); } @@ -143,4 +143,29 @@ class Client return new ApiResponse($statusCode, $responseBody); } + + /** + * Make HTTP request and deserialize JSON body (throws exception otherwise) + * + * @param string $path request url + * @param string $method (default: 'GET') + * @param array $parameters (default: array()) + * @param bool $fullPath (default: false) + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + * + * @throws \InvalidArgumentException + * @throws CurlException + * @throws InvalidJsonException + * + * @return ApiResponse + */ + public function makeRequest( + $path, + $method, + array $parameters = [], + $fullPath = false + ) { + return $this->makeRawRequest($path, $method, $parameters, $fullPath)->asJsonResponse(); + } } diff --git a/lib/RetailCrm/Methods/V5/Files.php b/lib/RetailCrm/Methods/V5/Files.php index b891f74..bc711ec 100644 --- a/lib/RetailCrm/Methods/V5/Files.php +++ b/lib/RetailCrm/Methods/V5/Files.php @@ -150,7 +150,7 @@ trait Files public function fileDownload($id) { /* @noinspection PhpUndefinedMethodInspection */ - return $this->client->makeRequest( + return $this->client->makeRawRequest( sprintf('/files/%s/download', $id), "GET" ); diff --git a/lib/RetailCrm/Response/ApiResponse.php b/lib/RetailCrm/Response/ApiResponse.php index f5e6efa..34e6118 100644 --- a/lib/RetailCrm/Response/ApiResponse.php +++ b/lib/RetailCrm/Response/ApiResponse.php @@ -51,9 +51,17 @@ class ApiResponse implements \ArrayAccess { $this->statusCode = (int) $statusCode; $this->rawResponse = $responseBody; + } - if (!empty($responseBody)) { - $response = json_decode($responseBody, true); + /** + * Deserialize JSON from raw response body + * + * @return $this + */ + public function asJsonResponse() + { + if (!empty($this->rawResponse)) { + $response = json_decode($this->rawResponse, true); if (!$response && JSON_ERROR_NONE !== ($error = json_last_error())) { throw new InvalidJsonException( @@ -64,6 +72,8 @@ class ApiResponse implements \ArrayAccess $this->response = $response; } + + return $this; } /** diff --git a/tests/RetailCrm/Tests/Http/ClientTest.php b/tests/RetailCrm/Tests/Http/ClientTest.php index 5caa9f1..dd68d82 100644 --- a/tests/RetailCrm/Tests/Http/ClientTest.php +++ b/tests/RetailCrm/Tests/Http/ClientTest.php @@ -93,6 +93,22 @@ class ClientTest extends TestCase $response = $client->makeRequest('/orders', Client::METHOD_GET); static::assertInstanceOf('RetailCrm\Response\ApiResponse', $response); + static::assertNotEmpty($response->getResponseBody()); + static::assertNotEmpty($response->getResponse()); + static::assertEquals(200, $response->getStatusCode()); + } + + /** + * @group client + */ + public function testRequestSuccessNoDeserialization() + { + $client = static::getClient(); + $response = $client->makeRawRequest('/orders', Client::METHOD_GET); + + static::assertInstanceOf('RetailCrm\Response\ApiResponse', $response); + static::assertNotEmpty($response->getResponseBody()); + static::assertEmpty($response->getResponse()); static::assertEquals(200, $response->getStatusCode()); } }