229 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Paypal\Controller;
 | 
						|
 | 
						|
use Magento\Checkout\Model\Session;
 | 
						|
use Magento\Framework\Session\Generic as GenericSession;
 | 
						|
use Magento\Paypal\Model\Api\Nvp;
 | 
						|
use Magento\Paypal\Model\Api\Type\Factory as ApiFactory;
 | 
						|
use Magento\Paypal\Model\Session as PaypalSession;
 | 
						|
use Magento\Quote\Model\Quote;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests of Paypal Express actions
 | 
						|
 *
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class ExpressTest extends \Magento\TestFramework\TestCase\AbstractController
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/quote.php
 | 
						|
     * @magentoDataFixture Magento/Paypal/_files/quote_payment.php
 | 
						|
     */
 | 
						|
    public function testReviewAction()
 | 
						|
    {
 | 
						|
        $quote = Bootstrap::getObjectManager()->create(Quote::class);
 | 
						|
        $quote->load('test01', 'reserved_order_id');
 | 
						|
        Bootstrap::getObjectManager()->get(
 | 
						|
            Session::class
 | 
						|
        )->setQuoteId(
 | 
						|
            $quote->getId()
 | 
						|
        );
 | 
						|
 | 
						|
        $this->dispatch('paypal/express/review');
 | 
						|
 | 
						|
        $html = $this->getResponse()->getBody();
 | 
						|
        $this->assertStringContainsString('Simple Product', $html);
 | 
						|
        $this->assertStringContainsString('Review', $html);
 | 
						|
        $this->assertStringContainsString('/paypal/express/placeOrder/', $html);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Paypal/_files/quote_payment_express.php
 | 
						|
     * @magentoConfigFixture current_store paypal/general/business_account merchant_2012050718_biz@example.com
 | 
						|
     */
 | 
						|
    public function testCancelAction()
 | 
						|
    {
 | 
						|
        $quote = $this->_objectManager->create(Quote::class);
 | 
						|
        $quote->load('100000002', 'reserved_order_id');
 | 
						|
        $order = $this->_objectManager->create(\Magento\Sales\Model\Order::class);
 | 
						|
        $order->load('100000002', 'increment_id');
 | 
						|
        $session = $this->_objectManager->get(Session::class);
 | 
						|
        $session->setLoadInactive(true);
 | 
						|
        $session->setLastRealOrderId(
 | 
						|
            $order->getRealOrderId()
 | 
						|
        )->setLastOrderId(
 | 
						|
            $order->getId()
 | 
						|
        )->setLastQuoteId(
 | 
						|
            $order->getQuoteId()
 | 
						|
        )->setQuoteId(
 | 
						|
            $order->getQuoteId()
 | 
						|
        );
 | 
						|
        /** @var $paypalSession PaypalSession */
 | 
						|
        $paypalSession = $this->_objectManager->get(PaypalSession::class); // @phpstan-ignore-line
 | 
						|
        $paypalSession->setExpressCheckoutToken('token');
 | 
						|
 | 
						|
        $this->dispatch('paypal/express/cancel');
 | 
						|
 | 
						|
        $order->load('100000002', 'increment_id');
 | 
						|
        $this->assertEquals('canceled', $order->getState());
 | 
						|
        $this->assertEquals($session->getQuote()->getGrandTotal(), $quote->getGrandTotal());
 | 
						|
        $this->assertEquals($session->getQuote()->getItemsCount(), $quote->getItemsCount());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test ensures only that customer data was copied to quote correctly.
 | 
						|
     *
 | 
						|
     * Note that test does not verify communication during remote calls to PayPal.
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/quote.php
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testStartActionCustomerToQuote()
 | 
						|
    {
 | 
						|
        $fixtureCustomerId = 1;
 | 
						|
        $fixtureCustomerEmail = 'customer@example.com';
 | 
						|
        $fixtureCustomerFirstname = 'John';
 | 
						|
        $fixtureQuoteReserveId = 'test01';
 | 
						|
 | 
						|
        /** Preconditions */
 | 
						|
        /** @var \Magento\Customer\Model\Session $customerSession */
 | 
						|
        $customerSession = $this->_objectManager->get(\Magento\Customer\Model\Session::class);
 | 
						|
        /** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository */
 | 
						|
        $customerRepository = $this->_objectManager->get(\Magento\Customer\Api\CustomerRepositoryInterface::class);
 | 
						|
        $customerData = $customerRepository->getById($fixtureCustomerId);
 | 
						|
        $customerSession->setCustomerDataObject($customerData);
 | 
						|
 | 
						|
        /** @var Quote $quote */
 | 
						|
        $quote = $this->_objectManager->create(Quote::class);
 | 
						|
        $quote->load($fixtureQuoteReserveId, 'reserved_order_id');
 | 
						|
 | 
						|
        /** @var Session $checkoutSession */
 | 
						|
        $checkoutSession = $this->_objectManager->get(Session::class);
 | 
						|
        $checkoutSession->setQuoteId($quote->getId());
 | 
						|
 | 
						|
        /** Preconditions check */
 | 
						|
        $this->assertNotEquals(
 | 
						|
            $fixtureCustomerEmail,
 | 
						|
            $quote->getCustomerEmail(),
 | 
						|
            "Precondition failed: customer email in quote is invalid."
 | 
						|
        );
 | 
						|
        $this->assertNotEquals(
 | 
						|
            $fixtureCustomerFirstname,
 | 
						|
            $quote->getCustomerFirstname(),
 | 
						|
            "Precondition failed: customer first name in quote is invalid."
 | 
						|
        );
 | 
						|
 | 
						|
        /** Execute SUT */
 | 
						|
        $this->dispatch('paypal/express/start');
 | 
						|
 | 
						|
        /** Check if customer data was copied to quote correctly */
 | 
						|
        /** @var Quote $updatedQuote */
 | 
						|
        $updatedQuote = $this->_objectManager->create(Quote::class);
 | 
						|
        $updatedQuote->load($fixtureQuoteReserveId, 'reserved_order_id');
 | 
						|
        $this->assertEquals(
 | 
						|
            $fixtureCustomerEmail,
 | 
						|
            $updatedQuote->getCustomer()->getEmail(),
 | 
						|
            "Customer email in quote is invalid."
 | 
						|
        );
 | 
						|
        $this->assertEquals(
 | 
						|
            $fixtureCustomerFirstname,
 | 
						|
            $updatedQuote->getCustomer()->getFirstname(),
 | 
						|
            "Customer first name in quote is invalid."
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test return action with configurable product.
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Paypal/_files/quote_express_configurable.php
 | 
						|
     */
 | 
						|
    public function testReturnAction()
 | 
						|
    {
 | 
						|
        $quote = $this->_objectManager->create(Quote::class);
 | 
						|
        $quote->load('test_cart_with_configurable', 'reserved_order_id');
 | 
						|
 | 
						|
        $payment = $quote->getPayment();
 | 
						|
        $payment->setMethod(\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS)
 | 
						|
            ->setAdditionalInformation(\Magento\Paypal\Model\Express\Checkout::PAYMENT_INFO_TRANSPORT_PAYER_ID, 123);
 | 
						|
 | 
						|
        $quote->save();
 | 
						|
 | 
						|
        $this->_objectManager->removeSharedInstance(Session::class);
 | 
						|
        $session = $this->_objectManager->get(Session::class);
 | 
						|
        $session->setQuoteId($quote->getId());
 | 
						|
 | 
						|
        $nvpMethods = [
 | 
						|
            'setToken',
 | 
						|
            'setPayerId',
 | 
						|
            'setAmount',
 | 
						|
            'setPaymentAction',
 | 
						|
            'setNotifyUrl',
 | 
						|
            'setInvNum',
 | 
						|
            'setCurrencyCode',
 | 
						|
            'setPaypalCart',
 | 
						|
            'setIsLineItemsEnabled',
 | 
						|
            'setAddress',
 | 
						|
            'setBillingAddress',
 | 
						|
            'callDoExpressCheckoutPayment',
 | 
						|
            'callGetExpressCheckoutDetails',
 | 
						|
            'getExportedBillingAddress'
 | 
						|
        ];
 | 
						|
 | 
						|
        $nvpMock = $this->getMockBuilder(Nvp::class)
 | 
						|
            ->setMethods($nvpMethods)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        foreach ($nvpMethods as $method) {
 | 
						|
            $nvpMock->method($method)
 | 
						|
                ->willReturnSelf();
 | 
						|
        }
 | 
						|
 | 
						|
        $apiFactoryMock = $this->getMockBuilder(ApiFactory::class)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->setMethods(['create'])
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        $apiFactoryMock->method('create')
 | 
						|
            ->with(Nvp::class)
 | 
						|
            ->willReturn($nvpMock);
 | 
						|
 | 
						|
        $this->_objectManager->addSharedInstance($apiFactoryMock, ApiFactory::class);
 | 
						|
 | 
						|
        $sessionMock = $this->getMockBuilder(GenericSession::class)
 | 
						|
            ->setMethods(['getExpressCheckoutToken'])
 | 
						|
            ->setConstructorArgs(
 | 
						|
                [
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\App\Request\Http::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\Session\SidResolverInterface::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\Session\Config\ConfigInterface::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\Session\SaveHandlerInterface::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\Session\ValidatorInterface::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\Session\StorageInterface::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\Stdlib\CookieManagerInterface::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\Stdlib\Cookie\CookieMetadataFactory::class),
 | 
						|
                    $this->_objectManager->get(\Magento\Framework\App\State::class),
 | 
						|
                ]
 | 
						|
            )
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        $sessionMock->method('getExpressCheckoutToken')
 | 
						|
            ->willReturn(true);
 | 
						|
 | 
						|
        // @phpstan-ignore-next-line
 | 
						|
        $this->_objectManager->addSharedInstance($sessionMock, PaypalSession::class);
 | 
						|
 | 
						|
        $this->dispatch('paypal/express/returnAction');
 | 
						|
        $this->assertRedirect($this->stringContains('checkout/onepage/success'));
 | 
						|
 | 
						|
        $this->_objectManager->removeSharedInstance(ApiFactory::class);
 | 
						|
        // @phpstan-ignore-next-line
 | 
						|
        $this->_objectManager->removeSharedInstance(PaypalSession::class);
 | 
						|
    }
 | 
						|
}
 |