138 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Paypal\Model\Api;
 | 
						|
 | 
						|
use Magento\Framework\Api\SearchCriteriaBuilder;
 | 
						|
use Magento\Framework\App\ProductMetadataInterface;
 | 
						|
use Magento\Framework\HTTP\Adapter\Curl;
 | 
						|
use Magento\Framework\HTTP\Adapter\CurlFactory;
 | 
						|
use Magento\Framework\ObjectManagerInterface;
 | 
						|
use Magento\Paypal\Model\CartFactory;
 | 
						|
use Magento\Paypal\Model\Config;
 | 
						|
use Magento\Quote\Model\Quote;
 | 
						|
use Magento\Quote\Model\QuoteRepository;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use PHPUnit\Framework\MockObject_MockObject as MockObject;
 | 
						|
 | 
						|
/**
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class PayflowNvpTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var PayflowNvp
 | 
						|
     */
 | 
						|
    private $nvpApi;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ObjectManagerInterface
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var Curl|MockObject
 | 
						|
     */
 | 
						|
    private $httpClient;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
 | 
						|
        /** @var CurlFactory|MockObject $httpFactory */
 | 
						|
        $httpFactory = $this->getMockBuilder(CurlFactory::class)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        $this->httpClient = $this->getMockBuilder(Curl::class)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
        $httpFactory->method('create')
 | 
						|
            ->willReturn($this->httpClient);
 | 
						|
 | 
						|
        $this->nvpApi = $this->objectManager->create(PayflowNvp::class, [
 | 
						|
            'curlFactory' => $httpFactory
 | 
						|
        ]);
 | 
						|
 | 
						|
        /** @var ProductMetadataInterface|MockObject $productMetadata */
 | 
						|
        $productMetadata = $this->getMockBuilder(ProductMetadataInterface::class)
 | 
						|
            ->getMock();
 | 
						|
        $productMetadata->method('getEdition')
 | 
						|
            ->willReturn('');
 | 
						|
 | 
						|
        /** @var Config $config */
 | 
						|
        $config = $this->objectManager->get(Config::class);
 | 
						|
        $config->setMethodCode(Config::METHOD_WPP_PE_EXPRESS);
 | 
						|
 | 
						|
        $refObject = new \ReflectionObject($config);
 | 
						|
        $refProperty = $refObject->getProperty('productMetadata');
 | 
						|
        $refProperty->setAccessible(true);
 | 
						|
        $refProperty->setValue($config, $productMetadata);
 | 
						|
 | 
						|
        $this->nvpApi->setConfigObject($config);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Checks a case when items and discount are present in the request.
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Paypal/_files/quote_payflowpro.php
 | 
						|
     * @magentoDbIsolation disabled
 | 
						|
     */
 | 
						|
    public function testRequestLineItems()
 | 
						|
    {
 | 
						|
        $quote = $this->getQuote('100000015');
 | 
						|
        /** @var CartFactory $cartFactory */
 | 
						|
        $cartFactory = $this->objectManager->get(CartFactory::class);
 | 
						|
        $cart = $cartFactory->create(['salesModel' => $quote]);
 | 
						|
 | 
						|
        $request = 'TENDER=P&AMT=52.14&FREIGHTAMT=0.00&TAXAMT=0.00&'
 | 
						|
            . 'L_NAME0=Simple 1&L_QTY0=1&L_COST0=7.69&'
 | 
						|
            . 'L_NAME1=Simple 2&L_QTY1=2&L_COST1=9.69&'
 | 
						|
            . 'L_NAME2=Simple 3&L_QTY2=3&L_COST2=11.69&'
 | 
						|
            . 'L_NAME3=Discount&L_QTY3=1&L_COST3=-10.00&'
 | 
						|
            . 'TRXTYPE=A&ACTION=S&BUTTONSOURCE=Magento_2_';
 | 
						|
 | 
						|
        $this->httpClient->method('write')
 | 
						|
            ->with(
 | 
						|
                'POST',
 | 
						|
                'https://payflowpro.paypal.com/transaction',
 | 
						|
                '1.1',
 | 
						|
                ['PAYPAL-NVP: Y'],
 | 
						|
                self::equalTo($request)
 | 
						|
            );
 | 
						|
 | 
						|
        $this->httpClient->method('read')
 | 
						|
            ->willReturn("HTTP/1.1 200 OK\r\nConnection: close\r\n\r\nRESULT=0&RESPMSG=Approved");
 | 
						|
 | 
						|
        $this->nvpApi->setAmount($quote->getBaseGrandTotal());
 | 
						|
        $this->nvpApi->setPaypalCart($cart);
 | 
						|
        $this->nvpApi->setQuote($quote);
 | 
						|
        $this->nvpApi->setIsLineItemsEnabled(true);
 | 
						|
        $this->nvpApi->callSetExpressCheckout();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets quote by reserved order id.
 | 
						|
     *
 | 
						|
     * @param string $reservedOrderId
 | 
						|
     * @return Quote
 | 
						|
     */
 | 
						|
    private function getQuote($reservedOrderId)
 | 
						|
    {
 | 
						|
        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
 | 
						|
        $searchCriteriaBuilder = $this->objectManager->create(SearchCriteriaBuilder::class);
 | 
						|
        $searchCriteria = $searchCriteriaBuilder->addFilter('reserved_order_id', $reservedOrderId)
 | 
						|
            ->create();
 | 
						|
        /** @var QuoteRepository $quoteRepository */
 | 
						|
        $quoteRepository = $this->objectManager->get(QuoteRepository::class);
 | 
						|
        $items = $quoteRepository->getList($searchCriteria)
 | 
						|
            ->getItems();
 | 
						|
        return array_pop($items);
 | 
						|
    }
 | 
						|
}
 |