Вход Регистрация
Файл: payment/pay/qiwi/sdk/vendor/qiwi/bill-payments-php-sdk/tests/util/BillPaymentsTest.php
Строк: 320
<?php

/**
 * BillPaymentsTest.php
 *
 * @author    Yaroslav <yaroslav@wannabe.pro>
 * @copyright 2019 (c) QIWI JSC
 * @license   MIT https://raw.githubusercontent.com/QIWI-API/bill-payments-php-sdk/master/LICENSE
 */

namespace QiwiApiUtil;

use 
QiwiApiBillPaymentsException;
use 
QiwiApiTestCase;
use 
QiwiApiBillPayments;
use 
CurlCurl;
use 
Exception;
use 
ReflectionClass;

/**
 * Util test case without real API.
 * No needed configure.
 *
 * @package QiwiApiBillPaymentsTest
 */
class BillPaymentsTest extends TestCase
{


    
/**
     * Set up test case.
     *
     * @param string $method Method to call.
     * @param array  $state  State of curl after exec.
     *
     * @return void
     *
     * @throws ReflectionException
     */
    
protected function setMock($method, array $state=[])
    {
        
$mock $this->createMock(Curl::class);
        
$mock->expects($this->once())->method($method)->willReturnCallback(
            function () use (
$state) {
                foreach (
$state as $key => $value) {
                    
$this->billPayments->curl->$key $value;
                }

                return 
$this->billPayments->curl->error_code;
            }
        );
        
$class    = new ReflectionClass($this->billPayments);
        
$property $class->getProperty('internalCurl');
        
$property->setAccessible(true);
        
$property->setValue($this->billPayments$mock);
        
$property->setAccessible(false);

    }
//end setMock()


    /**
     * Request exception.
     *
     * @return void
     *
     * @throws ReflectionException
     * @throws BillPaymentsException
     */
    
public function testRequestException()
    {
        
$this->setMock('get', ['error' => true'error_code' => 500'error_message' => 'test']);
        
$this->setExpectedException(BillPaymentsException::class, 'test'500);
        
$this->billPayments->getBillInfo('');

    }
//end testRequestException()


    /**
     * Requests live cycle 1 - create bill.
     *
     * @see https://developer.qiwi.com/ru/bill-payments/#create
     *
     * @return void
     *
     * @throws QiwiApiBillPaymentsException
     * @throws ReflectionException
     */
    
protected function subTestCreateBill()
    {
        
$this->setMock('put', ['error' => false'response' => json_encode(['payUrl' => 'https://oplata.qiwi.com/form/?invoice_uid=d875277b-6f0f-445d-8a83-f62c7c07be77'])]);
        
$bill            $this->billPayments->createBill(
            
$this->billId,
            
$this->fields
        
);
        
$testPayUrlQuery http_build_query(['successUrl' => $this->fields['successUrl']], '''&'PHP_QUERY_RFC3986);
        
$this->assertTrue(is_array($bill) && strpos($bill['payUrl'], $testPayUrlQuery) !== false'create bill');

    }
//end subTestCreateBill()


    /**
     * Requests live cycle 2 - get bill info.
     *
     * @see https://developer.qiwi.com/ru/bill-payments/#invoice-status
     *
     * @return void
     *
     * @throws QiwiApiBillPaymentsException
     * @throws ReflectionException
     */
    
protected function subTestGetBillInfo()
    {
        
$testFields = [
            
'customFields' => [
                
'apiClient'        => CLIENT_NAME,
                
'apiClientVersion' => CLIENT_VERSION,
            ],
        ];
        
$this->setMock('get', ['error' => false'response' => json_encode($testFields)]);
        
$bill $this->billPayments->getBillInfo($this->billId);
        
$this->assertArraySubset($testFields$bill'returns valid bill info');

    }
//end subTestGetBillInfo()


    /**
     * Requests live cycle 3 - cancel bill.
     *
     * @see https://developer.qiwi.com/ru/bill-payments/#cancel
     *
     * @return void
     *
     * @throws QiwiApiBillPaymentsException
     * @throws ReflectionException
     */
    
protected function subTestCancelBill()
    {
        
$this->setMock('post', ['error' => false'response' => '[]']);
        
$bill $this->billPayments->cancelBill($this->billId);
        
$this->assertTrue(is_array($bill), 'cancel unpaid bill');

    }
//end subTestCancelBill()


    /**
     * Requests life cycle without payment.
     *
     * @return void
     *
     * @throws QiwiApiBillPaymentsException
     * @throws ReflectionException
     */
    
public function testRequests()
    {
        
$this->subTestCreateBill();
        
$this->subTestGetBillInfo();
        
$this->subTestCancelBill();

    }
//end testRequests()


    /**
     * Refund bill.
     *
     * @see https://developer.qiwi.com/ru/bill-payments/#refund
     *
     * @return void
     *
     * @throws QiwiApiBillPaymentsException
     * @throws ReflectionException
     */
    
public function testRefund()
    {
        
$this->setMock('put', ['error' => false'response' => '[]']);
        
$billRefund $this->billPayments->refund(
            
$this->config['billIdForRefundTest'],
            
microtime(),
            
'0.01',
            
'RUB'
        
);
        
$this->assertTrue(is_array($billRefund), 'makes refund');

    }
//end testRefund()


    /**
     * Get refund info.
     *
     * @see https://developer.qiwi.com/ru/bill-payments/#refund-status
     *
     * @return void
     *
     * @throws QiwiApiBillPaymentsException
     * @throws ReflectionException
     */
    
public function testGetRefundInfo()
    {
        
$this->setMock('get', ['error' => false'response' => '[]']);
        
$billRefund $this->billPayments->getRefundInfo(
            
$this->config['billIdForGetRefundInfoTest'],
            
$this->config['billRefundIdForGetRefundInfoTest']
        );
        
$this->assertTrue(is_array($billRefund), 'gets refund info');

    }
//end testGetRefundInfo()


    /**
     * Create payment form.
     *
     * @see https://developer.qiwi.com/ru/bill-payments/#http
     *
     * @return void
     */
    
public function testCreatePaymentForm()
    {
        
$uri          BillPayments::CREATE_URI;
        
$amountString '200.34';
        
$amountNumber 200.345;
        
$query        http_build_query(
            [
                
'billId'       => $this->billId,
                
'publicKey'    => $this->config['merchantPublicKey'],
                
'amount'       => $amountString,
                
'successUrl'   => $this->fields['successUrl'],
                
'customFields' => [
                    
'apiClient'        => CLIENT_NAME,
                    
'apiClientVersion' => CLIENT_VERSION,
                ],
            ],
            
'',
            
'&',
            
PHP_QUERY_RFC3986
        
);
        
$testLink     $uri.'?'.$query;
        
$result       $this->billPayments->createPaymentForm(
            [
                
'publicKey'  => $this->config['merchantPublicKey'],
                
'amount'     => $amountNumber,
                
'billId'     => $this->billId,
                
'successUrl' => $this->fields['successUrl'],
            ]
        );
        
$this->assertEquals($testLink$result'creates payment form');

    }
//end testCreatePaymentForm()


    /**
     * Properties available by magic methods.
     *
     * @return void
     */
    
public function testProperties()
    {
        
$this->assertTrue(isset($this->billPayments->key), 'exists key attribute');
        
$this->billPayments->key 'test';
        
$this->setExpectedException(Exception::class, 'Not acceptable property key.');
        
$this->billPayments->key;

        
$this->assertTrue(isset($this->billPayments->curl), 'exists curl attribute');
        
$this->assertInstanceOf(Curl::class, $this->billPayments->curl'correct set curl attribute');
        
$this->setExpectedException(Exception::class, 'Not acceptable property curl.');
        
$this->billPayments->curl 'test';

        
//phpcs:disable Generic,Squiz.Commenting -- Because IDE helper doc block in line.
        /** @noinspection PhpUndefinedFieldInspection */
        
$this->assertFalse(isset($this->billPayments->qwerty), 'not exists attribute');
        
//phpcs:enable Generic,Squiz.Commenting
        
$this->setExpectedException(Exception::class, 'Undefined property qwerty.');
        
//phpcs:disable Generic,Squiz.Commenting -- Because IDE helper doc block in line.
        /** @noinspection PhpUndefinedFieldInspection */
        
$this->billPayments->qwerty 'test';
        
//phpcs:enable Generic,Squiz.Commenting

    
}//end testProperties()


    /**
     * Generate ID.
     *
     * @return void
     *
     * @throws Exception
     */
    
public function testGenerateId()
    {
        
$billId $this->billPayments->generateId();
        
$this->assertRegExp('/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i'$billId'UUID v4 format');

    }
//end testGenerateId()


    /**
     * Get life time.
     *
     * @return void
     *
     * @throws Exception
     */
    
public function testGetLifetimeByDay()
    {
        
$lifetime $this->billPayments->getLifetimeByDay();
        
$this->assertRegExp('/^([+-]?d{4}(?!d{2}b))((-?)((0[1-9]|1[0-2])(3([12]d|0[1-9]|3[01]))?|W([0-4]d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]d|[12]d{2}|3([0-5]d|6[1-6])))([Ts]((([01]d|2[0-3])((:?)[0-5]d)?|24:?00)([.,]d+(?!:))?)?(17[0-5]d([.,]d+)?)?([zZ]|([+-])([01]d|2[0-3]):?([0-5]d)?)?)?)?$/'$lifetime'ISO 8601 format');

    }
//end testGetLifetimeByDay()


    /**
     * CheckNotificationSignature.
     *
     * @see https://developer.qiwi.com/ru/bill-payments/#notification
     *
     * @return void
     */
    
public function testCheckNotificationSignature()
    {
        
$merchantSecret   'test-merchant-secret-for-signature-check';
        
$notificationData = [
            
'bill' => [
                
'siteId' => 'test',
                
'billId' => 'test_bill',
                
'amount' => [
                    
'value'    => 1,
                    
'currency' => 'RUB',
                ],
                
'status' => ['value' => 'PAID'],
            ],
        ];
        
$this->assertFalse(
            
$this->billPayments->checkNotificationSignature(
                
'foo',
                
$notificationData,
                
$merchantSecret
            
),
            
'should return false on wrong signature'
        
);
        
$this->assertTrue(
            
$this->billPayments->checkNotificationSignature(
                
'07e0ebb10916d97760c196034105d010607a6c6b7d72bfa1c3451448ac484a3b',
                
$notificationData,
                
$merchantSecret
            
),
            
'should return true on valid signature'
        
);

    }
//end testCheckNotificationSignature()


    /**
     * Get pay url.
     *
     * @return void
     */
    
public function testGetPayUrl()
    {
        
$bill   = ['payUrl' => 'https://oplata.qiwi.com/form/?invoice_uid=d875277b-6f0f-445d-8a83-f62c7c07be77'];
        
$payUrl $this->billPayments->getPayUrl($bill'http://test.ru/');
        
$this->assertEquals('https://oplata.qiwi.com/form/?invoice_uid=d875277b-6f0f-445d-8a83-f62c7c07be77&successUrl=http%3A%2F%2Ftest.ru%2F'$payUrl'witch success URL');

    }
//end testGetPayUrl()


}//end class
Онлайн: 0
Реклама