183 lines
5.9 KiB
PHP
Executable File
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);
|
|
}
|
|
}
|