mirror of
https://git.yoomoney.ru/scm/sdk/yookassa-sdk-php.git
synced 2026-08-25 14:58:02 +00:00
2313 lines
81 KiB
PHP
2313 lines
81 KiB
PHP
<?php
|
||
/*
|
||
* The MIT License
|
||
*
|
||
* Copyright (c) 2026 "YooMoney", NBСO LLC
|
||
*
|
||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
* of this software and associated documentation files (the "Software"), to deal
|
||
* in the Software without restriction, including without limitation the rights
|
||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
* copies of the Software, and to permit persons to whom the Software is
|
||
* furnished to do so, subject to the following conditions:
|
||
*
|
||
* The above copyright notice and this permission notice shall be included in
|
||
* all copies or substantial portions of the Software.
|
||
*
|
||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
* THE SOFTWARE.
|
||
*/
|
||
|
||
namespace Tests\YooKassa\Client;
|
||
|
||
use DateTime;
|
||
use Exception;
|
||
use InvalidArgumentException;
|
||
use PHPUnit\Framework\TestCase;
|
||
use PHPUnit_Framework_MockObject_MockObject;
|
||
use ReflectionMethod;
|
||
use YooKassa\Client;
|
||
use YooKassa\Common\Exceptions\ApiConnectionException;
|
||
use YooKassa\Common\Exceptions\ApiException;
|
||
use YooKassa\Common\Exceptions\AuthorizeException;
|
||
use YooKassa\Common\Exceptions\BadApiRequestException;
|
||
use YooKassa\Common\Exceptions\ExtensionNotFoundException;
|
||
use YooKassa\Common\Exceptions\ForbiddenException;
|
||
use YooKassa\Common\Exceptions\InternalServerError;
|
||
use YooKassa\Common\Exceptions\JsonException;
|
||
use YooKassa\Common\Exceptions\NotFoundException;
|
||
use YooKassa\Common\Exceptions\ResponseProcessingException;
|
||
use YooKassa\Common\Exceptions\TooManyRequestsException;
|
||
use YooKassa\Common\Exceptions\UnauthorizedException;
|
||
use YooKassa\Common\LoggerWrapper;
|
||
use YooKassa\Helpers\Random;
|
||
use YooKassa\Helpers\StringObject;
|
||
use YooKassa\Model\Deal\DealType;
|
||
use YooKassa\Model\Deal\FeeMoment;
|
||
use YooKassa\Model\PaymentMethodType;
|
||
use YooKassa\Model\PersonalData\PersonalDataType;
|
||
use YooKassa\Model\ReceiptCustomer;
|
||
use YooKassa\Model\ReceiptItem;
|
||
use YooKassa\Model\ReceiptType;
|
||
use YooKassa\Model\SafeDeal;
|
||
use YooKassa\Model\Settlement;
|
||
use YooKassa\Request\Deals\CreateDealRequest;
|
||
use YooKassa\Request\Deals\CreateDealResponse;
|
||
use YooKassa\Request\Deals\DealResponse;
|
||
use YooKassa\Request\Deals\DealsRequest;
|
||
use YooKassa\Request\Deals\DealsResponse;
|
||
use YooKassa\Request\Payments\CreatePaymentResponse;
|
||
use YooKassa\Request\Payments\CreatePaymentRequest;
|
||
use YooKassa\Request\Payments\Payment\CancelResponse;
|
||
use YooKassa\Request\Payments\Payment\CreateCaptureRequest;
|
||
use YooKassa\Request\Payments\Payment\CreateCaptureResponse;
|
||
use YooKassa\Request\Payments\PaymentResponse;
|
||
use YooKassa\Request\Payments\PaymentsRequest;
|
||
use YooKassa\Request\Payments\PaymentsResponse;
|
||
use YooKassa\Request\Payouts\CreatePayoutRequest;
|
||
use YooKassa\Request\Payouts\CreatePayoutResponse;
|
||
use YooKassa\Request\Payouts\PayoutResponse;
|
||
use YooKassa\Request\Payouts\SbpBanksResponse;
|
||
use YooKassa\Request\PersonalData\CreatePersonalDataRequest;
|
||
use YooKassa\Request\PersonalData\PersonalDataResponse;
|
||
use YooKassa\Request\Receipts\AbstractReceiptResponse;
|
||
use YooKassa\Request\Receipts\CreatePostReceiptRequest;
|
||
use YooKassa\Request\Refunds\CreateRefundRequest;
|
||
use YooKassa\Request\Refunds\CreateRefundResponse;
|
||
use YooKassa\Request\Refunds\RefundResponse;
|
||
use YooKassa\Request\Refunds\RefundsRequest;
|
||
use YooKassa\Request\Refunds\RefundsResponse;
|
||
use YooKassa\Request\SelfEmployed\SelfEmployedRequest;
|
||
use YooKassa\Request\SelfEmployed\SelfEmployedResponse;
|
||
|
||
class ClientTest extends TestCase
|
||
{
|
||
public function testCreatePayment()
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPaymentFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreatePaymentResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPaymentFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment(array(
|
||
'amount' => array(
|
||
'value' => 123,
|
||
'currency' => 'USD',
|
||
),
|
||
'payment_token' => Random::str(36),
|
||
), 123);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreatePaymentResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
* @throws Exception
|
||
*/
|
||
public function testInvalidCreatePayment($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->createPayment($payment, 123);
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider paymentsListDataProvider
|
||
* @param mixed $request
|
||
* @throws ApiException
|
||
* @throws ResponseProcessingException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
*/
|
||
public function testPaymentsList($request)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('getPaymentsFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPayments($request);
|
||
|
||
$this->assertTrue($response instanceof PaymentsResponse);
|
||
}
|
||
|
||
public function paymentsListDataProvider()
|
||
{
|
||
return array(
|
||
array(null),
|
||
array(PaymentsRequest::builder()->build()),
|
||
array(array(
|
||
'account_id' => 12,
|
||
))
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
*/
|
||
public function testInvalidPaymentsList($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$payments = PaymentsRequest::builder()->build();
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->getPayments($payments);
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider paymentInfoDataProvider
|
||
* @param mixed $paymentId
|
||
* @param string $exceptionClassName
|
||
* @throws ApiException
|
||
* @throws ResponseProcessingException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
*/
|
||
public function testGetPaymentInfo($paymentId, $exceptionClassName = null)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($exceptionClassName !== null ? self::never() : self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('paymentInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
|
||
if ($exceptionClassName !== null) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPaymentInfo($paymentId);
|
||
|
||
self::assertTrue($response instanceof PaymentResponse);
|
||
}
|
||
|
||
public function paymentInfoDataProvider()
|
||
{
|
||
return array(
|
||
array(null, '\InvalidArgumentException'),
|
||
array(Random::str(36)),
|
||
array(new StringObject(Random::str(36))),
|
||
array(true, '\InvalidArgumentException'),
|
||
array(false, '\InvalidArgumentException'),
|
||
array(0, '\InvalidArgumentException'),
|
||
array(1, '\InvalidArgumentException'),
|
||
array(0.1, '\InvalidArgumentException'),
|
||
array(Random::str(35), '\InvalidArgumentException'),
|
||
array(Random::str(37), '\InvalidArgumentException'),
|
||
array(new DateTime(), '\InvalidArgumentException'),
|
||
array(array(), '\InvalidArgumentException'),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
* @throws Exception
|
||
*/
|
||
public function testInvalidGetPaymentInfo($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->getPaymentInfo(Random::str(36));
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
public function testCapturePayment()
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('capturePaymentFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$capturePaymentRequest = array(
|
||
'amount' => array(
|
||
'value' => 123,
|
||
'currency' => 'EUR',
|
||
)
|
||
);
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->capturePayment($capturePaymentRequest, '1ddd77af-0bd7-500d-895b-c475c55fdefc', 123);
|
||
|
||
$this->assertTrue($response instanceof CreateCaptureResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('capturePaymentFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$capturePaymentRequest = CreateCaptureRequest::builder()->setAmount(10)->build();
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->capturePayment($capturePaymentRequest, '1ddd77af-0bd7-500d-895b-c475c55fdefc');
|
||
|
||
$this->assertTrue($response instanceof CreateCaptureResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":123}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->capturePayment($capturePaymentRequest, '1ddd77af-0bd7-500d-895b-c475c55fdefc', 123);
|
||
self::fail('Exception not thrown');
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
}
|
||
|
||
try {
|
||
$apiClient->capturePayment($capturePaymentRequest, null, 123);
|
||
} catch (InvalidArgumentException $e) {
|
||
// it's ok
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
* @throws Exception
|
||
*/
|
||
public function testInvalidCapturePayment($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$capturePaymentRequest = CreateCaptureRequest::builder()->setAmount(10)->build();
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->capturePayment($capturePaymentRequest, '1ddd77af-0bd7-500d-895b-c475c55fdefc', 123);
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider paymentInfoDataProvider
|
||
* @param mixed $paymentId
|
||
* @param string|null $exceptionClassName
|
||
*/
|
||
public function testPaymentIdCapturePayment($paymentId, $exceptionClassName = null)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($exceptionClassName === null ? self::once() : self::never())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('capturePaymentFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$capturePaymentRequest = array(
|
||
'amount' => array(
|
||
'value' => 123,
|
||
'currency' => 'EUR',
|
||
)
|
||
);
|
||
|
||
if ($exceptionClassName !== null) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->capturePayment($capturePaymentRequest, $paymentId, 123);
|
||
|
||
self::assertTrue($response instanceof CreateCaptureResponse);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider paymentInfoDataProvider
|
||
* @param mixed $paymentId
|
||
* @param string $exceptionClassName
|
||
*/
|
||
public function testCancelPayment($paymentId, $exceptionClassName = null)
|
||
{
|
||
$invalid = $exceptionClassName !== null;
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($invalid ? self::never() : self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('cancelPaymentFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
if ($invalid) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->cancelPayment($paymentId, 123);
|
||
|
||
$this->assertTrue($response instanceof CancelResponse);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
*/
|
||
public function testInvalidCancelPayment($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->cancelPayment(Random::str(36));
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider refundsDataProvider
|
||
* @param mixed $refundsRequest
|
||
*/
|
||
public function testGetRefunds($refundsRequest)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects(self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('refundsInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getRefunds($refundsRequest);
|
||
|
||
$this->assertTrue($response instanceof RefundsResponse);
|
||
}
|
||
|
||
public function refundsDataProvider()
|
||
{
|
||
return array(
|
||
array(null),
|
||
array(RefundsRequest::builder()->build()),
|
||
array(array(
|
||
'account_id' => 123,
|
||
)),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
*/
|
||
public function testInvalidGetRefunds($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$refundsRequest = RefundsRequest::builder()->build();
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->getRefunds($refundsRequest);
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
public function testCreateRefund()
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createRefundFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$refundRequest = CreateRefundRequest::builder()->setPaymentId('1ddd77af-0bd7-500d-895b-c475c55fdefc')->setAmount(123)->build();
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createRefund($refundRequest, 123);
|
||
|
||
$this->assertTrue($response instanceof CreateRefundResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createRefundFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$refundRequest = array(
|
||
'payment_id' => '1ddd77af-0bd7-500d-895b-c475c55fdefc',
|
||
'amount' => array(
|
||
'value' => 321,
|
||
'currency' => 'RUB',
|
||
)
|
||
);
|
||
|
||
$apiClient = new Client();
|
||
|
||
$response = $apiClient
|
||
->setMaxRequestAttempts(2)
|
||
->setRetryTimeout(1000)
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createRefund($refundRequest);
|
||
|
||
$this->assertTrue($response instanceof CreateRefundResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createRefund($refundRequest, 123);
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
return;
|
||
}
|
||
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
* @throws Exception
|
||
*/
|
||
public function testInvalidCreateRefund($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$refundRequest = CreateRefundRequest::builder()->setPaymentId('1ddd77af-0bd7-500d-895b-c475c55fdefc')->setAmount(123)->build();
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->createRefund($refundRequest, 123);
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider paymentInfoDataProvider
|
||
*
|
||
* @param mixed $refundId
|
||
* @param string $exceptionClassName
|
||
* @throws ApiException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws ResponseProcessingException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
*/
|
||
public function testRefundInfo($refundId, $exceptionClassName = null)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($exceptionClassName === null ? self::once() : self::never())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('refundInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
if ($exceptionClassName !== null) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getRefundInfo($refundId);
|
||
|
||
$this->assertTrue($response instanceof RefundResponse);
|
||
|
||
try {
|
||
$apiClient->getRefundInfo(null);
|
||
} catch (InvalidArgumentException $e) {
|
||
// it's ok
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
/**
|
||
* @dataProvider errorResponseDataProvider
|
||
* @param $httpCode
|
||
* @param $errorResponse
|
||
* @param $requiredException
|
||
* @throws Exception
|
||
*/
|
||
public function testInvalidRefundInfo($httpCode, $errorResponse, $requiredException)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$errorResponse,
|
||
array('http_code' => $httpCode)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setApiClient($curlClientStub)->setAuth('shopId', 'shopPassword');
|
||
try {
|
||
$apiClient->getRefundInfo(Random::str(36));
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf($requiredException, $e);
|
||
return;
|
||
}
|
||
self::fail('Exception not thrown');
|
||
}
|
||
|
||
public function testApiException()
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'unknown response here',
|
||
array('http_code' => 444)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\ApiException');
|
||
|
||
$apiClient = new Client();
|
||
$apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment, 123);
|
||
}
|
||
|
||
public function testBadRequestException()
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"description": "error_msg", "code": "error_code", "parameter_name": "parameter_name"}',
|
||
array('http_code' => 400)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\BadApiRequestException');
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment, 123);
|
||
}
|
||
|
||
public function testTechnicalErrorException()
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"description": "error_msg", "code": "error_code"}',
|
||
array('http_code' => 500)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\InternalServerError');
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment, 123);
|
||
}
|
||
|
||
public function testUnauthorizedException()
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"description": "error_msg"}',
|
||
array('http_code' => 401)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\UnauthorizedException');
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment, 123);
|
||
}
|
||
|
||
public function testForbiddenException()
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"description": "error_msg","error_code": "error_code", "parameter_name": "parameter_name", "operation_name": "operation_name"}',
|
||
array('http_code' => 403)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\ForbiddenException');
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment, 123);
|
||
}
|
||
|
||
public function testNotFoundException()
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"description": "error_msg","error_code": "error_code", "parameter_name": "parameter_name", "operation_name": "operation_name"}',
|
||
array('http_code' => 404)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\NotFoundException');
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPaymentInfo(Random::str(36));
|
||
}
|
||
|
||
public function testToManyRequestsException()
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"description": "error_msg","error_code": "error_code", "parameter_name": "parameter_name", "operation_name": "operation_name"}',
|
||
array('http_code' => 429)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\TooManyRequestsException');
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPaymentInfo(Random::str(36));
|
||
}
|
||
|
||
public function testAnotherExceptions()
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{}',
|
||
array('http_code' => 322)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPaymentInfo(Random::str(36));
|
||
|
||
self::assertNull($response);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{}',
|
||
array('http_code' => 402)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
|
||
$this->expectException('YooKassa\Common\Exceptions\ApiException');
|
||
|
||
$apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPaymentInfo(Random::str(36));
|
||
}
|
||
|
||
public function testConfig()
|
||
{
|
||
$apiClient = new Client();
|
||
$apiClient->setConfig(array(
|
||
'url' => 'test'
|
||
));
|
||
|
||
$this->assertEquals(array('url' => 'test'), $apiClient->getConfig());
|
||
}
|
||
|
||
public function testSetLogger()
|
||
{
|
||
$wrapped = new ArrayLogger();
|
||
$logger = new LoggerWrapper($wrapped);
|
||
|
||
$apiClient = new Client();
|
||
$apiClient->setLogger($logger);
|
||
|
||
$clientMock = $this->getMockBuilder('YooKassa\Client\ApiClientInterface')
|
||
->setMethods(array('setLogger', 'setConfig', 'call', 'setShopId', 'getUserAgent', 'setBearerToken', 'setShopPassword', 'setAdvancedCurlOptions'))
|
||
->disableOriginalConstructor()
|
||
->getMock();
|
||
$expectedLoggers = array();
|
||
$clientMock->expects(self::exactly(3))->method('setLogger')->willReturnCallback(function ($logger) use (&$expectedLoggers) {
|
||
$expectedLoggers[] = $logger;
|
||
});
|
||
$clientMock->expects(self::once())->method('setConfig')->willReturn($clientMock);
|
||
|
||
$apiClient->setApiClient($clientMock);
|
||
self::assertSame($expectedLoggers[0], $logger);
|
||
|
||
$apiClient->setLogger($wrapped);
|
||
$apiClient->setLogger(function ($level, $log, $context = array()) use ($wrapped) {
|
||
$wrapped->log($level, $log, $context);
|
||
});
|
||
}
|
||
|
||
public function testDecodeInvalidData()
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects(self::any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"invalid":"json"',
|
||
array('http_code' => 200)
|
||
));
|
||
$this->expectException('YooKassa\Common\Exceptions\JsonException');
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPaymentInfo(Random::str(36));
|
||
}
|
||
|
||
public function testEncodeMultibyteData()
|
||
{
|
||
$instance = new TestClient();
|
||
|
||
$value = array('hello' => 'Привет', 'olleh' => 'سلام');
|
||
$result = $instance->encode($value);
|
||
|
||
self::assertTrue(strpos($result, 'Привет') !== false);
|
||
self::assertTrue(strpos($result, 'سلام') !== false);
|
||
}
|
||
|
||
public function testEncodeInvalidData()
|
||
{
|
||
$instance = new TestClient();
|
||
|
||
if (version_compare(PHP_VERSION, '5.5') >= 0) {
|
||
$value = array('test' => 'test', 'val' => null);
|
||
$value['val'] = &$value;
|
||
try {
|
||
$instance->encode($value);
|
||
self::fail('Exception not thrown');
|
||
} catch (JsonException $e) {
|
||
self::assertEquals(JSON_ERROR_RECURSION, $e->getCode());
|
||
self::assertEquals('Failed serialize json. Unknown error', $e->getMessage());
|
||
}
|
||
|
||
$value = array('test' => iconv('utf-8', 'windows-1251', 'абвгдеёжз'));
|
||
try {
|
||
$instance->encode($value);
|
||
self::fail('Exception not thrown');
|
||
} catch (JsonException $e) {
|
||
self::assertEquals(JSON_ERROR_UTF8, $e->getCode());
|
||
self::assertEquals(
|
||
'Failed serialize json. Malformed UTF-8 characters, possibly incorrectly encoded',
|
||
$e->getMessage()
|
||
);
|
||
}
|
||
} else {
|
||
$value = array('test' => iconv('utf-8', 'windows-1251', 'абвгдеёжз'));
|
||
$decoded = json_decode(json_encode($value), true);
|
||
self::assertNotSame($decoded, $value);
|
||
}
|
||
}
|
||
|
||
public function testCreatePaymentErrors()
|
||
{
|
||
$payment = CreatePaymentRequest::builder()
|
||
->setAmount(123)
|
||
->setPaymentToken(Random::str(36))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPaymentErrorsGeneralFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayment($payment);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreatePaymentResponse);
|
||
self::assertEquals("canceled", $response->getStatus());
|
||
self::assertEquals("general_decline", $response->getCancellationDetails()->getReason());
|
||
}
|
||
|
||
/**
|
||
* @throws ApiException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws ResponseProcessingException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
* @throws ApiConnectionException
|
||
* @throws AuthorizeException
|
||
*/
|
||
public function testCreateReceipt()
|
||
{
|
||
// Create Receipt via object
|
||
$receipt = $this->createReceiptViaObject();
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createReceiptFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createReceipt($receipt);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof AbstractReceiptResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createReceiptFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
// Create Receipt via array
|
||
$receipt = $this->createReceiptViaArray();
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createReceipt($receipt, 123);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof AbstractReceiptResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createReceipt($receipt, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createReceipt($receipt, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @return array
|
||
*/
|
||
private function createReceiptViaArray()
|
||
{
|
||
return array(
|
||
'customer' => array(
|
||
'full_name' => 'Иванов Иван Иванович',
|
||
'inn' => '6321341814',
|
||
'email' => 'johndoe@yoomoney.ru',
|
||
'phone' => '79000000000'
|
||
),
|
||
'items' => array(
|
||
array(
|
||
'description' => 'string',
|
||
'quantity' => 1,
|
||
'amount' => array(
|
||
'value' => '10.00',
|
||
'currency' => 'RUB'
|
||
),
|
||
'vat_code' => 1,
|
||
'payment_subject' => 'commodity',
|
||
'payment_mode' => 'full_prepayment',
|
||
'product_code' => '00 00 00 01 00 21 FA 41 00 23 05 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 AB 00',
|
||
'country_of_origin_code' => 'RU',
|
||
'customs_declaration_number' => '10714040/140917/0090376',
|
||
'excise' => '20.00'
|
||
)
|
||
),
|
||
'tax_system_code' => 1,
|
||
'type' => 'payment',
|
||
'send' => true,
|
||
'settlements' => array(
|
||
array(
|
||
'type' => 'cashless',
|
||
'amount' => array(
|
||
'value' => '10.00',
|
||
'currency' => 'RUB'
|
||
)
|
||
)
|
||
),
|
||
'payment_id' => '1da5c87d-0984-50e8-a7f3-8de646dd9ec9'
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @return CreatePostReceiptRequest
|
||
*/
|
||
private function createReceiptViaObject()
|
||
{
|
||
$customer = new ReceiptCustomer(array(
|
||
'full_name' => 'Иванов Иван Иванович',
|
||
'inn' => '6321341814',
|
||
'email' => 'johndoe@yoomoney.ru',
|
||
'phone' => '79000000000'
|
||
));
|
||
$settlement = new Settlement(array(
|
||
'type' => 'cashless',
|
||
'amount' => array(
|
||
'value' => '10.00',
|
||
'currency' => 'RUB'
|
||
)
|
||
));
|
||
$receiptItem = new ReceiptItem(array(
|
||
'description' => 'string',
|
||
'quantity' => 1,
|
||
'amount' => array(
|
||
'value' => '10.00',
|
||
'currency' => 'RUB'
|
||
),
|
||
'vat_code' => 1,
|
||
'payment_subject' => 'commodity',
|
||
'payment_mode' => 'full_prepayment',
|
||
'product_code' => '00 00 00 01 00 21 FA 41 00 23 05 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 AB 00',
|
||
'country_of_origin_code' => 'RU',
|
||
'customs_declaration_number' => '10714040/140917/0090376',
|
||
'excise' => '20.00'
|
||
));
|
||
|
||
return CreatePostReceiptRequest::builder()
|
||
->setCustomer($customer)
|
||
->setType(ReceiptType::PAYMENT)
|
||
->setObjectId('1da5c87d-0984-50e8-a7f3-8de646dd9ec9', ReceiptType::PAYMENT)
|
||
->setSend(true)
|
||
->setSettlements(array($settlement))
|
||
->setOnBehalfOf('545665')
|
||
->setItems(array($receiptItem))
|
||
->build();
|
||
}
|
||
|
||
public function testCreateDeal()
|
||
{
|
||
$deal = CreateDealRequest::builder()
|
||
->setType(DealType::SAFE_DEAL)
|
||
->setFeeMoment(FeeMoment::PAYMENT_SUCCEEDED)
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createDealFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createDeal($deal);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreateDealResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createDealFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createDeal(array(
|
||
'type' => 'safe_deal',
|
||
'fee_moment' => 'payment_succeeded',
|
||
'description' => Random::str(36),
|
||
), 123);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreateDealResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createDeal($deal, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createDeal($deal, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @dataProvider dealInfoDataProvider
|
||
* @param mixed $dealId
|
||
* @param string $exceptionClassName
|
||
* @throws ApiException
|
||
* @throws ResponseProcessingException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
* @throws ExtensionNotFoundException
|
||
*/
|
||
public function testGetDealInfo($dealId, $exceptionClassName = null)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($exceptionClassName !== null ? self::never() : self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('dealInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
|
||
if ($exceptionClassName !== null) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getDealInfo($dealId);
|
||
|
||
self::assertTrue($response instanceof DealResponse);
|
||
}
|
||
|
||
public function dealInfoDataProvider()
|
||
{
|
||
return array(
|
||
array(null, '\InvalidArgumentException'),
|
||
array(Random::str(36)),
|
||
array(new StringObject(Random::str(36))),
|
||
array(true, '\InvalidArgumentException'),
|
||
array(false, '\InvalidArgumentException'),
|
||
array(0, '\InvalidArgumentException'),
|
||
array(1, '\InvalidArgumentException'),
|
||
array(0.1, '\InvalidArgumentException'),
|
||
array(Random::str(35), '\InvalidArgumentException'),
|
||
array(Random::str(51), '\InvalidArgumentException'),
|
||
array(new DateTime(), '\InvalidArgumentException'),
|
||
array(array(), '\InvalidArgumentException'),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider dealsDataProvider
|
||
* @param mixed $dealsRequest
|
||
*/
|
||
public function testGetDeals($dealsRequest)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects(self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('dealsInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getDeals($dealsRequest);
|
||
|
||
$this->assertTrue($response instanceof DealsResponse);
|
||
}
|
||
|
||
public function dealsDataProvider()
|
||
{
|
||
return array(
|
||
array(null),
|
||
array(DealsRequest::builder()->build()),
|
||
array(array(
|
||
'status' => 'closed',
|
||
)),
|
||
);
|
||
}
|
||
|
||
public function testCreatePayout()
|
||
{
|
||
$payout = CreatePayoutRequest::builder()
|
||
->setAmount(array('value' => '320', 'currency' => 'RUB'))
|
||
->setPayoutDestinationData(array(
|
||
'type' => PaymentMethodType::YOO_MONEY,
|
||
'account_number' => '41001614575714'
|
||
))
|
||
->setDescription('Выплата по заказу №37')
|
||
->setMetadata(array('order_id' => '37'))
|
||
->setDeal(array('id' => 'dl-285e5ee7-0022-5000-8000-01516a44b147'))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPayoutFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayout($payout);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreatePayoutResponse);
|
||
|
||
$payout = CreatePayoutRequest::builder()
|
||
->setAmount(array('value' => '320', 'currency' => 'RUB'))
|
||
->setPayoutToken('<Синоним банковской карты>')
|
||
->setDescription('Выплата по заказу №37')
|
||
->setMetadata(array('order_id' => '37'))
|
||
->setDeal(array('id' => 'dl-285e5ee7-0022-5000-8000-01516a44b147'))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPayoutFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayout($payout);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreatePayoutResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPayoutFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayout(array(
|
||
'amount' => array('value' => '320', 'currency' => 'RUB'),
|
||
'description' => 'Выплата по заказу №37',
|
||
'payout_token' => '<Синоним банковской карты>',
|
||
'deal' => array('id' => 'dl-285e5ee7-0022-5000-8000-01516a44b147'),
|
||
'metadata' => array('order_id' => '37'),
|
||
), 123);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof CreatePayoutResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayout($payout, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayout($payout, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPayout(array(
|
||
'amount' => array('value' => '320', 'currency' => 'RUB'),
|
||
'description' => 'Выплата по заказу №37',
|
||
'payout_token' => '<Синоним банковской карты>',
|
||
'payout_destination_data' => array('type' => 'bank_card', 'card' => array('number' => '1234567890123456')),
|
||
'deal' => array('id' => 'dl-285e5ee7-0022-5000-8000-01516a44b147'),
|
||
'metadata' => array('order_id' => '37'),
|
||
), 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @dataProvider payoutInfoDataProvider
|
||
* @param mixed $payoutId
|
||
* @param string $exceptionClassName
|
||
* @throws ApiException
|
||
* @throws ResponseProcessingException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
* @throws ExtensionNotFoundException
|
||
*/
|
||
public function testGetPayoutInfo($payoutId, $exceptionClassName = null)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($exceptionClassName !== null ? self::never() : self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('payoutInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
|
||
if ($exceptionClassName !== null) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPayoutInfo($payoutId);
|
||
|
||
self::assertTrue($response instanceof PayoutResponse);
|
||
}
|
||
|
||
public function payoutInfoDataProvider()
|
||
{
|
||
return array(
|
||
array(null, '\InvalidArgumentException'),
|
||
array(Random::str(36)),
|
||
array(new StringObject(Random::str(36))),
|
||
array(true, '\InvalidArgumentException'),
|
||
array(false, '\InvalidArgumentException'),
|
||
array(0, '\InvalidArgumentException'),
|
||
array(1, '\InvalidArgumentException'),
|
||
array(0.1, '\InvalidArgumentException'),
|
||
array(Random::str(35), '\InvalidArgumentException'),
|
||
array(Random::str(51), '\InvalidArgumentException'),
|
||
array(new DateTime(), '\InvalidArgumentException'),
|
||
array(array(), '\InvalidArgumentException'),
|
||
);
|
||
}
|
||
|
||
public function testCreatePersonalData()
|
||
{
|
||
$personalData = CreatePersonalDataRequest::builder()
|
||
->setType(PersonalDataType::SBP_PAYOUT_RECIPIENT)
|
||
->setLastName('Иванов')
|
||
->setFirstName('Иван')
|
||
->setMiddleName('Иванович')
|
||
->setMetadata(array('recipient_id' => '37'))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPersonalDataFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPersonalData($personalData);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof PersonalDataResponse);
|
||
|
||
$personalData = CreatePersonalDataRequest::builder()
|
||
->setType(PersonalDataType::SBP_PAYOUT_RECIPIENT)
|
||
->setLastName('Иванов')
|
||
->setFirstName('Иван')
|
||
->setMiddleName('Иванович')
|
||
->setMetadata(array('recipient_id' => '37'))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPersonalDataFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPersonalData($personalData);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof PersonalDataResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createPersonalDataFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPersonalData(array(
|
||
'type' => 'sbp_payout_recipient',
|
||
'last_name' => 'Иванов',
|
||
'first_name' => 'Иван',
|
||
'middle_name' => 'Иванович',
|
||
'metadata' => array('recipient_id' => '37'),
|
||
), 123);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof PersonalDataResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPersonalData($personalData, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPersonalData($personalData, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createPersonalData(array(
|
||
'type' => 'sbp_payout_recipient',
|
||
'last_name' => 'Иванов',
|
||
'first_name' => 'Иван',
|
||
'middle_name' => 'Иванович',
|
||
'metadata' => array('recipient_id' => '37'),
|
||
), 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @dataProvider personalDataInfoDataProvider
|
||
* @param mixed $personalDataId
|
||
* @param string $exceptionClassName
|
||
* @throws ApiException
|
||
* @throws ResponseProcessingException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
* @throws ExtensionNotFoundException
|
||
*/
|
||
public function testGetPersonalDataInfo($personalDataId, $exceptionClassName = null)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($exceptionClassName !== null ? self::never() : self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('personalDataInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
|
||
if ($exceptionClassName !== null) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPersonalDataInfo($personalDataId);
|
||
|
||
self::assertTrue($response instanceof PersonalDataResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getPersonalDataInfo($personalDataId);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
public function personalDataInfoDataProvider()
|
||
{
|
||
return array(
|
||
array(null, '\InvalidArgumentException'),
|
||
array(Random::str(36)),
|
||
array(new StringObject(Random::str(36))),
|
||
array(true, '\InvalidArgumentException'),
|
||
array(false, '\InvalidArgumentException'),
|
||
array(0, '\InvalidArgumentException'),
|
||
array(1, '\InvalidArgumentException'),
|
||
array(0.1, '\InvalidArgumentException'),
|
||
array(Random::str(35), '\InvalidArgumentException'),
|
||
array(Random::str(51), '\InvalidArgumentException'),
|
||
array(new DateTime(), '\InvalidArgumentException'),
|
||
array(array(), '\InvalidArgumentException'),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider paymentsListDataProvider
|
||
*
|
||
* @throws ApiException
|
||
* @throws ResponseProcessingException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
* @throws ExtensionNotFoundException
|
||
*/
|
||
public function testSbpBanksList()
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('getSbpBanksFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getSbpBanks();
|
||
|
||
$this->assertTrue($response instanceof SbpBanksResponse);
|
||
}
|
||
|
||
|
||
public function testCreateSelfEmployed()
|
||
{
|
||
$selfEmployed = SelfEmployedRequest::builder()
|
||
->setItn('123456789012')
|
||
->setPhone('79001002030')
|
||
->setConfirmation(array('type' => 'redirect'))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createSelfEmployedFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createSelfEmployed($selfEmployed);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof SelfEmployedResponse);
|
||
|
||
$selfEmployed = SelfEmployedRequest::builder()
|
||
->setItn('123456789012')
|
||
->setPhone('79001002030')
|
||
->setConfirmation(array('type' => 'redirect'))
|
||
->build();
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createSelfEmployedFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createSelfEmployed($selfEmployed);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof SelfEmployedResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('createSelfEmployedFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createSelfEmployed(array(
|
||
'itn' => '123456789012',
|
||
'phone' => '79001002030',
|
||
'confirmation' => array('type' => 'redirect'),
|
||
), 123);
|
||
|
||
self::assertSame($curlClientStub, $apiClient->getApiClient());
|
||
self::assertTrue($response instanceof SelfEmployedResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createSelfEmployed($selfEmployed, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ApiException $e) {
|
||
self::assertInstanceOf('YooKassa\Common\Exceptions\ResponseProcessingException', $e);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createSelfEmployed($selfEmployed, 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted"}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->createSelfEmployed(array(
|
||
'itn' => '123456789012',
|
||
'phone' => '79001002030',
|
||
'confirmation' => array('type' => 'redirect'),
|
||
), 123);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @dataProvider selfEmployedInfoDataProvider
|
||
*
|
||
* @param mixed $selfEmployedId
|
||
* @param string $exceptionClassName
|
||
*
|
||
* @throws ApiException
|
||
* @throws ResponseProcessingException
|
||
* @throws BadApiRequestException
|
||
* @throws ForbiddenException
|
||
* @throws InternalServerError
|
||
* @throws NotFoundException
|
||
* @throws TooManyRequestsException
|
||
* @throws UnauthorizedException
|
||
* @throws ExtensionNotFoundException
|
||
*/
|
||
public function testGetSelfEmployedInfo($selfEmployedId, $exceptionClassName = null)
|
||
{
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($exceptionClassName !== null ? self::never() : self::once())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
$this->getFixtures('selfEmployedInfoFixtures.json'),
|
||
array('http_code' => 200)
|
||
));
|
||
|
||
$apiClient = new Client();
|
||
|
||
if ($exceptionClassName !== null) {
|
||
$this->expectException($exceptionClassName);
|
||
}
|
||
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getSelfEmployedInfo($selfEmployedId);
|
||
|
||
self::assertTrue($response instanceof SelfEmployedResponse);
|
||
|
||
$curlClientStub = $this->getCurlClientStub();
|
||
$curlClientStub
|
||
->expects($this->any())
|
||
->method('sendRequest')
|
||
->willReturn(array(
|
||
array('Header-Name' => 'HeaderValue'),
|
||
'{"type":"error","code":"request_accepted","retry_after":1800}',
|
||
array('http_code' => 202)
|
||
));
|
||
|
||
try {
|
||
$apiClient->setRetryTimeout(0);
|
||
$response = $apiClient
|
||
->setApiClient($curlClientStub)
|
||
->setAuth('shopId', 'shopPassword')
|
||
->getSelfEmployedInfo($selfEmployedId);
|
||
self::fail('Исключение не было выброшено');
|
||
} catch (ResponseProcessingException $e) {
|
||
self::assertEquals(Client::DEFAULT_DELAY, $e->retryAfter);
|
||
return;
|
||
}
|
||
}
|
||
|
||
public function selfEmployedInfoDataProvider()
|
||
{
|
||
return array(
|
||
array(null, '\InvalidArgumentException'),
|
||
array(Random::str(36)),
|
||
array(new StringObject(Random::str(36))),
|
||
array(true, '\InvalidArgumentException'),
|
||
array(false, '\InvalidArgumentException'),
|
||
array(0, '\InvalidArgumentException'),
|
||
array(1, '\InvalidArgumentException'),
|
||
array(0.1, '\InvalidArgumentException'),
|
||
array(Random::str(35), '\InvalidArgumentException'),
|
||
array(Random::str(51), '\InvalidArgumentException'),
|
||
array(new DateTime(), '\InvalidArgumentException'),
|
||
array(array(), '\InvalidArgumentException'),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @return PHPUnit_Framework_MockObject_MockObject
|
||
*/
|
||
public function getCurlClientStub()
|
||
{
|
||
$clientStub = $this->getMockBuilder('YooKassa\Client\CurlClient')
|
||
->setMethods(array('sendRequest'))
|
||
->getMock();
|
||
|
||
return $clientStub;
|
||
}
|
||
|
||
public function errorResponseDataProvider()
|
||
{
|
||
return array(
|
||
array(NotFoundException::HTTP_CODE, '{}', 'YooKassa\Common\Exceptions\NotFoundException'),
|
||
array(BadApiRequestException::HTTP_CODE, '{}', 'YooKassa\Common\Exceptions\BadApiRequestException'),
|
||
array(BadApiRequestException::HTTP_CODE, '{}', 'YooKassa\Common\Exceptions\BadApiRequestException'),
|
||
array(ForbiddenException::HTTP_CODE, '{}', 'YooKassa\Common\Exceptions\ForbiddenException'),
|
||
array(UnauthorizedException::HTTP_CODE, '{}', 'YooKassa\Common\Exceptions\UnauthorizedException'),
|
||
array(TooManyRequestsException::HTTP_CODE, '{}', 'YooKassa\Common\Exceptions\TooManyRequestsException'),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @return bool|string
|
||
*/
|
||
private function getFixtures($fileName)
|
||
{
|
||
return file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'fixtures' . DIRECTORY_SEPARATOR . $fileName);
|
||
}
|
||
}
|
||
|
||
class ArrayLogger
|
||
{
|
||
private $lastLog;
|
||
|
||
public function log($level, $message, $context)
|
||
{
|
||
$this->lastLog = array($level, $message, $context);
|
||
}
|
||
|
||
public function getLastLog()
|
||
{
|
||
return $this->lastLog;
|
||
}
|
||
}
|
||
|
||
class TestClient extends Client
|
||
{
|
||
public function encode($data)
|
||
{
|
||
$refl = new ReflectionMethod($this, 'encodeData');
|
||
if (PHP_VERSION_ID < 80100) {
|
||
$refl->setAccessible(true);
|
||
}
|
||
return $refl->invoke($this, $data);
|
||
}
|
||
}
|