magento2-docker/dev/tests/integration/testsuite/Magento/PaypalGraphQl/PaypalExpressAbstractTest.php

218 lines
6.5 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\PaypalGraphQl;
use Magento\Customer\Helper\Address;
use Magento\Directory\Model\CountryFactory;
use Magento\Directory\Model\RegionFactory;
use Magento\Framework\Exception\LocalizedExceptionFactory;
use Magento\Framework\HTTP\Adapter\CurlFactory;
use Magento\Framework\Locale\ResolverInterface;
use Magento\Framework\Math\Random;
use Magento\GraphQl\Controller\GraphQl;
use Magento\GraphQl\Service\GraphQlRequest;
use Magento\Payment\Model\Method\Logger;
use Magento\Paypal\Model\Api\Nvp;
use Magento\Paypal\Model\Api\NvpFactory;
use Magento\Paypal\Model\Api\PayflowNvp;
use Magento\Paypal\Model\Api\AbstractApi;
use Magento\Paypal\Model\Api\ProcessableExceptionFactory;
use Magento\Quote\Model\Quote;
use Magento\Quote\Model\QuoteFactory;
use Magento\TestFramework\ObjectManager;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\Paypal\Model\Api\Type\Factory as ApiFactory;
use Psr\Log\LoggerInterface;
use Magento\Config\Model\Config;
use Magento\Framework\App\Config\ScopeConfigInterface;
/**
* Abstract class with common logic for Paypal GraphQl tests
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
abstract class PaypalExpressAbstractTest extends TestCase
{
/**
* @var AbstractApi|MockObject
*/
protected $nvpMock;
/**
* @var ObjectManager
*/
protected $objectManager;
/**
* @var GraphQl
*/
protected $graphqlController;
/**
* @var GraphQlRequest
*/
protected $graphQlRequest;
protected function setUp(): void
{
$this->objectManager = Bootstrap::getObjectManager();
$apiFactoryMock = $this->getMockBuilder(ApiFactory::class)
->disableOriginalConstructor()
->setMethods(['create'])
->getMock();
$apiFactoryMock->method('create')
->willReturnMap(
[
[Nvp::class, [], $this->getNvpMock(Nvp::class)],
[PayflowNvp::class, [], $this->getNvpMock(PayflowNvp::class)]
]
);
$this->objectManager->addSharedInstance($apiFactoryMock, ApiFactory::class);
$this->graphqlController = $this->objectManager->get(GraphQl::class);
$this->graphQlRequest = $this->objectManager->create(GraphQlRequest::class);
}
protected function tearDown(): void
{
$this->disablePaypalPaymentMethods();
$this->objectManager->removeSharedInstance(ApiFactory::class);
}
/**
* Get quote by reserved order id
*
* @param $reservedOrderId
* @return Quote
*/
protected function getQuoteByReservedOrderId($reservedOrderId): Quote
{
$quoteFactory = $this->objectManager->get(QuoteFactory::class);
/** @var Quote $quote */
$quote = $quoteFactory->create();
$quote->load($reservedOrderId, 'reserved_order_id');
return $quote;
}
/**
* Enables Paypal payment method by payment code
*
* @return void
*/
protected function enablePaymentMethod($methodCode): void
{
$config = $this->objectManager->get(Config::class);
$config->setScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT);
$paymentMethodActive = 'payment/' . $methodCode . '/active';
$config->setDataByPath($paymentMethodActive, '1');
$config->save();
}
/**
* Disables list of Paypal payment methods
*
* @return void
*/
protected function disablePaypalPaymentMethods(): void
{
$paypalMethods = [
'paypal_express',
'payflow_express',
'payflow_link'
];
$config = $this->objectManager->get(Config::class);
$config->setScope(ScopeConfigInterface::SCOPE_TYPE_DEFAULT);
foreach ($paypalMethods as $method) {
$paymentMethodActive = 'payment/' . $method . '/active';
$config->setDataByPath($paymentMethodActive, '0');
$config->save();
}
}
/**
* Get mock of Nvp class
*
* @param string $nvpClass
* @return AbstractApi|MockObject
*/
private function getNvpMock(string $nvpClass)
{
if (empty($this->nvpMock)) {
$constructorArgs = [
'customerAddress' => $this->objectManager->get(Address::class),
'logger' => $this->objectManager->get(LoggerInterface::class),
'customLogger' => $this->objectManager->get(Logger::class),
'localeResolver' => $this->objectManager->get(ResolverInterface::class),
'regionFactory' => $this->objectManager->get(RegionFactory::class),
'countryFactory' => $this->objectManager->get(CountryFactory::class),
'processableExceptionFactory' => $this->objectManager->get(ProcessableExceptionFactory::class),
'frameworkExceptionFactory' => $this->objectManager->get(LocalizedExceptionFactory::class),
'curlFactory' => $this->objectManager->get(CurlFactory::class),
];
if ($nvpClass === PayflowNvp::class) {
$constructorArgs += [
'mathRandom' => $this->objectManager->get(Random::class),
'nvpFactory' => $this->objectManager->get(NvpFactory::class)
];
}
$constructorArgs += ['data' => []];
$this->nvpMock = $this->getMockBuilder($nvpClass)
->setConstructorArgs($constructorArgs)
->setMethods(['call'])
->getMock();
}
return $this->nvpMock;
}
/**
* Get GraphQl query for creating Paypal token
*
* @param string $cartId
* @param string $paymentMethod
* @return string
*/
protected function getCreateTokenMutation(string $cartId, string $paymentMethod): string
{
return <<<QUERY
mutation {
createPaypalExpressToken(input: {
cart_id: "{$cartId}",
code: "{$paymentMethod}",
urls: {
return_url: "paypal/express/return/",
cancel_url: "paypal/express/cancel/"
success_url: "checkout/onepage/success/",
pending_url: "checkout/onepage/pending/"
}
express_button: true
})
{
__typename
token
paypal_urls{
start
edit
}
}
}
QUERY;
}
}