magento2-docker/dev/tests/integration/testsuite/Magento/Paypal/Model/Api/PayflowNvpTest.php

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);
}
}