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

183 lines
5.9 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 NvpTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Nvp
*/
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(Nvp::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_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 with FPT (Fixed Product Tax) are present in the request.
*
* @magentoConfigFixture current_store tax/weee/enable 1
* @magentoConfigFixture current_store tax/weee/include_in_subtotal 0
* @magentoDataFixture Magento/Paypal/_files/quote_with_fpt.php
*/
public function testRequestTotalsAndLineItemsWithFPT()
{
$quote = $this->getQuote('100000016');
/** @var CartFactory $cartFactory */
$cartFactory = $this->objectManager->get(CartFactory::class);
$cart = $cartFactory->create(['salesModel' => $quote]);
$request = 'PAYMENTACTION=Authorization&AMT=112.70'
. '&SHIPPINGAMT=0.00&ITEMAMT=112.70&TAXAMT=0.00'
. '&L_NAME0=Simple+Product+FPT&L_QTY0=1&L_AMT0=100.00'
. '&L_NAME1=FPT&L_QTY1=1&L_AMT1=12.70'
. '&METHOD=SetExpressCheckout&VERSION=72.0&BUTTONSOURCE=Magento_2_';
$this->httpClient->method('write')
->with(
'POST',
'https://api-3t.paypal.com/nvp',
'1.1',
[],
$this->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();
}
/**
* Test that the refund request to Paypal sends the correct data
*
* @magentoDataFixture Magento/Paypal/_files/order_express_with_tax.php
*/
public function testCallRefundTransaction()
{
/** @var \Magento\Sales\Model\Order $order */
$order = $this->objectManager->create(\Magento\Sales\Model\Order::class);
$order->loadByIncrementId('100000001');
/** @var \Magento\Sales\Model\Order\Payment $payment */
$payment = $order->getPayment();
$this->nvpApi->setPayment(
$payment
)->setTransactionId(
'fooTransactionId'
)->setAmount(
$payment->formatAmount($order->getBaseGrandTotal())
)->setCurrencyCode(
$order->getBaseCurrencyCode()
)->setRefundType(
Config::REFUND_TYPE_PARTIAL
);
$httpQuery = 'TRANSACTIONID=fooTransactionId&REFUNDTYPE=Partial'
.'&CURRENCYCODE=USD&AMT=145.98&METHOD=RefundTransaction'
.'&VERSION=72.0&BUTTONSOURCE=Magento_2_';
$this->httpClient->expects($this->once())->method('write')
->with(
'POST',
'https://api-3t.paypal.com/nvp',
'1.1',
[],
$httpQuery
);
$this->httpClient->method('read')->willReturn('');
$this->nvpApi->callRefundTransaction();
}
/**
* 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);
}
}