784 lines
30 KiB
PHP
Executable File
784 lines
30 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
namespace Magento\Paypal\Model\Express;
|
|
|
|
use Magento\Checkout\Model\Type\Onepage;
|
|
use Magento\Directory\Model\CountryFactory;
|
|
use Magento\Framework\ObjectManagerInterface;
|
|
use Magento\Paypal\Model\Api\Nvp;
|
|
use Magento\Paypal\Model\Api\Type\Factory;
|
|
use Magento\Paypal\Model\Config;
|
|
use Magento\Paypal\Model\Info;
|
|
use Magento\Quote\Model\Quote;
|
|
use Magento\Quote\Model\Quote\Address;
|
|
use Magento\Quote\Model\ResourceModel\Quote\Collection;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class CheckoutTest extends TestCase
|
|
{
|
|
/**
|
|
* @var ObjectManagerInterface
|
|
*/
|
|
private $objectManager;
|
|
|
|
/**
|
|
* @var Info|MockObject
|
|
*/
|
|
private $paypalInfo;
|
|
|
|
/**
|
|
* @var Config|MockObject
|
|
*/
|
|
private $paypalConfig;
|
|
|
|
/**
|
|
* @var Factory|MockObject
|
|
*/
|
|
private $apiTypeFactory;
|
|
|
|
/**
|
|
* @var Nvp|MockObject
|
|
*/
|
|
private $api;
|
|
|
|
/**
|
|
* @var Checkout
|
|
*/
|
|
private $checkoutModel;
|
|
|
|
/**
|
|
* Set up
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
$this->objectManager = Bootstrap::getObjectManager();
|
|
|
|
$this->paypalInfo = $this->getMockBuilder(Info::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$this->paypalConfig = $this->getMockBuilder(Config::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$this->api = $this->getMockBuilder(Nvp::class)
|
|
->disableOriginalConstructor()
|
|
->setMethods(['call', 'getExportedShippingAddress', 'getExportedBillingAddress', 'getShippingRateCode'])
|
|
->getMock();
|
|
|
|
$this->api->expects($this->any())
|
|
->method('call')
|
|
->willReturn([]);
|
|
|
|
$this->apiTypeFactory = $this->getMockBuilder(Factory::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$this->apiTypeFactory->expects($this->any())
|
|
->method('create')
|
|
->willReturn($this->api);
|
|
}
|
|
|
|
/**
|
|
* Verify that api has set customer email.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_express.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testCheckoutStartWithBillingAddress()
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$paypalConfig = $this->getMockBuilder(Config::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$apiTypeFactory = $this->getMockBuilder(Factory::class)
|
|
->disableOriginalConstructor()
|
|
->setMethods(['create'])
|
|
->getMock();
|
|
|
|
$paypalInfo = $this->getMockBuilder(Info::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$checkoutModel = $this->objectManager->create(
|
|
Checkout::class,
|
|
[
|
|
'params' => ['quote' => $quote, 'config' => $paypalConfig],
|
|
'apiTypeFactory' => $apiTypeFactory,
|
|
'paypalInfo' => $paypalInfo
|
|
]
|
|
);
|
|
|
|
$api = $this->getMockBuilder(Nvp::class)
|
|
->disableOriginalConstructor()
|
|
->setMethods(['callSetExpressCheckout'])
|
|
->getMock();
|
|
|
|
$api->expects($this->any())
|
|
->method('callSetExpressCheckout')
|
|
->willReturn(null);
|
|
|
|
$apiTypeFactory->expects($this->any())
|
|
->method('create')
|
|
->willReturn($api);
|
|
|
|
$checkoutModel->start(
|
|
'return',
|
|
'cancel',
|
|
false
|
|
);
|
|
|
|
$this->assertEquals('test@com.com', $api->getBillingAddress()->getEmail());
|
|
}
|
|
|
|
/**
|
|
* Verify that an order placed with an existing customer can re-use the customer addresses.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_express_with_customer.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testPrepareCustomerQuote()
|
|
{
|
|
/** @var Quote $quote */
|
|
$quote = $this->getFixtureQuote();
|
|
$quote->setCheckoutMethod(Onepage::METHOD_CUSTOMER); // to dive into _prepareCustomerQuote() on switch
|
|
$quote->getShippingAddress()->setSameAsBilling(0);
|
|
$quote->setReservedOrderId(null);
|
|
$customer = $this->objectManager->create(\Magento\Customer\Model\Customer::class)->load(1);
|
|
$customer->setDefaultBilling(false)
|
|
->setDefaultShipping(false)
|
|
->save();
|
|
|
|
/** @var \Magento\Customer\Model\Session $customerSession */
|
|
$customerSession = $this->objectManager->get(\Magento\Customer\Model\Session::class);
|
|
$customerSession->loginById(1);
|
|
$checkout = $this->getCheckout($quote);
|
|
$checkout->place('token');
|
|
|
|
/** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerService */
|
|
$customerService = $this->objectManager->get(\Magento\Customer\Api\CustomerRepositoryInterface::class);
|
|
$customer = $customerService->getById($quote->getCustomerId());
|
|
|
|
$this->assertEquals(1, $quote->getCustomerId());
|
|
$this->assertCount(2, $customer->getAddresses());
|
|
|
|
$this->assertEquals(1, $quote->getBillingAddress()->getCustomerAddressId());
|
|
$this->assertEquals(2, $quote->getShippingAddress()->getCustomerAddressId());
|
|
|
|
$order = $checkout->getOrder();
|
|
$this->assertEquals(1, $order->getBillingAddress()->getCustomerAddressId());
|
|
$this->assertEquals(2, $order->getShippingAddress()->getCustomerAddressId());
|
|
}
|
|
|
|
/**
|
|
* Verify that after placing the order, addresses are associated with the order and the quote is a guest quote.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_express.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
* @param string $accountEmail
|
|
* @param string $expected
|
|
* @dataProvider placeGuestQuoteDataProvider
|
|
*/
|
|
public function testPlaceGuestQuote($accountEmail, $expected)
|
|
{
|
|
/** @var Quote $quote */
|
|
$quote = $this->getFixtureQuote();
|
|
$quote->setCheckoutMethod(Onepage::METHOD_GUEST); // to dive into _prepareGuestQuote() on switch
|
|
$quote->getShippingAddress()->setSameAsBilling(0);
|
|
$quote->setReservedOrderId(null);
|
|
|
|
/* Simulate data returned from PayPal containing email as well
|
|
as email entered at checkout step */
|
|
$quote->getBillingAddress()->setEmail('paypal_account@email.com');
|
|
$quote->getBillingAddress()->setOrigData('email', $accountEmail);
|
|
|
|
$checkout = $this->getCheckout($quote);
|
|
$checkout->place('token');
|
|
|
|
$this->assertNull($quote->getCustomerId());
|
|
$this->assertTrue($quote->getCustomerIsGuest());
|
|
$this->assertEquals(
|
|
\Magento\Customer\Model\GroupManagement::NOT_LOGGED_IN_ID,
|
|
$quote->getCustomerGroupId()
|
|
);
|
|
|
|
$this->assertEquals($expected, $quote->getCustomerEmail());
|
|
$this->assertNotEmpty($quote->getBillingAddress());
|
|
$this->assertNotEmpty($quote->getShippingAddress());
|
|
$this->assertEquals($quote->getBillingAddress()->getFirstname(), $quote->getCustomerFirstname());
|
|
$this->assertEquals($quote->getBillingAddress()->getLastname(), $quote->getCustomerLastname());
|
|
|
|
$order = $checkout->getOrder();
|
|
$this->assertNotEmpty($order->getBillingAddress());
|
|
$this->assertNotEmpty($order->getShippingAddress());
|
|
$this->assertEquals($quote->getBillingAddress()->getFirstname(), $order->getCustomerFirstname());
|
|
$this->assertEquals($quote->getBillingAddress()->getLastname(), $order->getCustomerLastname());
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function placeGuestQuoteDataProvider(): array
|
|
{
|
|
return [
|
|
'case with account email absent' => [null, 'paypal_account@email.com'],
|
|
'case with account email present' => ['magento_account@email.com', 'magento_account@email.com'],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Place the order as guest when `Automatic Assignment to Customer Group` is enabled.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_express.php
|
|
* @magentoConfigFixture current_store customer/create_account/auto_group_assign 1
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testPlaceGuestQuoteAutomaticAssignmentEnabled(): void
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$quote->setCheckoutMethod(Onepage::METHOD_GUEST);
|
|
$quote->getShippingAddress()->setSameAsBilling(0);
|
|
$quote->setReservedOrderId(null);
|
|
|
|
$checkout = $this->getCheckout($quote);
|
|
$checkout->place('token');
|
|
|
|
$order = $checkout->getOrder();
|
|
$this->assertNotEmpty($order->getRealOrderId());
|
|
}
|
|
|
|
/**
|
|
* @param Quote $quote
|
|
* @return Checkout
|
|
*/
|
|
protected function getCheckout(Quote $quote)
|
|
{
|
|
return $this->objectManager->create(
|
|
Checkout::class,
|
|
[
|
|
'params' => [
|
|
'config' => $this->getMockBuilder(Config::class)
|
|
->disableOriginalConstructor()
|
|
->getMock(),
|
|
'quote' => $quote,
|
|
]
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Verify that an order placed with an existing customer can re-use the customer addresses.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_payment_express_with_customer.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testReturnFromPaypal()
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$this->checkoutModel = $this->objectManager->create(
|
|
Checkout::class,
|
|
[
|
|
'params' => ['quote' => $quote, 'config' => $this->paypalConfig],
|
|
'apiTypeFactory' => $this->apiTypeFactory,
|
|
'paypalInfo' => $this->paypalInfo
|
|
]
|
|
);
|
|
|
|
$prefix = 'exported';
|
|
$exportedBillingAddress = $this->getExportedAddressFixture($quote->getBillingAddress()->getData(), $prefix);
|
|
$this->api->expects($this->any())
|
|
->method('getExportedBillingAddress')
|
|
->willReturn($exportedBillingAddress);
|
|
|
|
$exportedShippingAddress = $this->getExportedAddressFixture($quote->getShippingAddress()->getData(), $prefix);
|
|
$this->api->expects($this->any())
|
|
->method('getExportedShippingAddress')
|
|
->willReturn($exportedShippingAddress);
|
|
|
|
$this->paypalInfo->expects($this->once())->method('importToPayment')->with($this->api, $quote->getPayment());
|
|
|
|
$quote->getPayment()->setAdditionalInformation(Checkout::PAYMENT_INFO_BUTTON, 1);
|
|
|
|
$this->checkoutModel->returnFromPaypal('token');
|
|
|
|
$billingAddress = $quote->getBillingAddress();
|
|
$this->assertStringContainsString($prefix, $billingAddress->getFirstname());
|
|
$this->assertEquals('note', $billingAddress->getCustomerNote());
|
|
|
|
$shippingAddress = $quote->getShippingAddress();
|
|
$this->assertTrue((bool)$shippingAddress->getSameAsBilling());
|
|
$this->assertNull($shippingAddress->getPrefix());
|
|
$this->assertNull($shippingAddress->getMiddlename());
|
|
$this->assertNull($shippingAddress->getSuffix());
|
|
$this->assertTrue($shippingAddress->getShouldIgnoreValidation());
|
|
$this->assertStringContainsString('exported', $shippingAddress->getFirstname());
|
|
$paymentAdditionalInformation = $quote->getPayment()->getAdditionalInformation();
|
|
$this->assertArrayHasKey(Checkout::PAYMENT_INFO_TRANSPORT_SHIPPING_METHOD, $paymentAdditionalInformation);
|
|
$this->assertArrayHasKey(Checkout::PAYMENT_INFO_TRANSPORT_PAYER_ID, $paymentAdditionalInformation);
|
|
$this->assertArrayHasKey(Checkout::PAYMENT_INFO_TRANSPORT_TOKEN, $paymentAdditionalInformation);
|
|
$this->assertTrue($quote->getPayment()->hasMethod());
|
|
$this->assertTrue($quote->getTotalsCollectedFlag());
|
|
}
|
|
|
|
/**
|
|
* The case when handling address data from Paypal button.
|
|
* System's address fields are replacing from export Paypal data.
|
|
* Billing and Shipping address are the same
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_payment_express_with_customer.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testReturnFromPaypalButton()
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$quote->getShippingAddress()->setShippingMethod('');
|
|
|
|
$this->prepareCheckoutModel($quote);
|
|
$quote->getPayment()->setAdditionalInformation(Checkout::PAYMENT_INFO_BUTTON, 1);
|
|
|
|
$this->checkoutModel->returnFromPaypal('token');
|
|
|
|
$shippingAddress = $quote->getShippingAddress();
|
|
$billingAddress = $quote->getBillingAddress();
|
|
$exportedShippingData = $this->getExportedData()['shipping'];
|
|
|
|
$this->assertEquals([$exportedShippingData['street']], $shippingAddress->getStreet());
|
|
$this->assertEquals($exportedShippingData['firstname'], $shippingAddress->getFirstname());
|
|
$this->assertEquals($exportedShippingData['city'], $shippingAddress->getCity());
|
|
$this->assertEquals($exportedShippingData['telephone'], $shippingAddress->getTelephone());
|
|
$this->assertEquals($exportedShippingData['email'], $shippingAddress->getEmail());
|
|
|
|
$this->assertEquals('flatrate_flatrate', $shippingAddress->getShippingMethod());
|
|
|
|
$this->assertEquals([$exportedShippingData['street']], $billingAddress->getStreet());
|
|
$this->assertEquals($exportedShippingData['firstname'], $billingAddress->getFirstname());
|
|
$this->assertEquals($exportedShippingData['city'], $billingAddress->getCity());
|
|
$this->assertEquals($exportedShippingData['telephone'], $billingAddress->getTelephone());
|
|
$this->assertEquals($exportedShippingData['email'], $billingAddress->getEmail());
|
|
}
|
|
|
|
/**
|
|
* The case when handling address data from Paypal button.
|
|
* System's address fields are replacing from export Paypal data.
|
|
* Billing and Shipping address are different
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_payment_express_with_customer.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testReturnFromPaypalButtonWithReturnBillingAddress()
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$this->paypalConfig->expects($this->exactly(2))
|
|
->method('getValue')
|
|
->with('requireBillingAddress')
|
|
->willReturn(1);
|
|
$this->prepareCheckoutModel($quote);
|
|
$quote->getPayment()->setAdditionalInformation(Checkout::PAYMENT_INFO_BUTTON, 1);
|
|
|
|
$this->checkoutModel->returnFromPaypal('token');
|
|
|
|
$shippingAddress = $quote->getShippingAddress();
|
|
$billingAddress = $quote->getBillingAddress();
|
|
$exportedBillingData = $this->getExportedData()['billing'];
|
|
$exportedShippingData = $this->getExportedData()['shipping'];
|
|
|
|
$this->assertEquals([$exportedShippingData['street']], $shippingAddress->getStreet());
|
|
$this->assertEquals($exportedShippingData['firstname'], $shippingAddress->getFirstname());
|
|
$this->assertEquals($exportedShippingData['city'], $shippingAddress->getCity());
|
|
$this->assertEquals($exportedShippingData['telephone'], $shippingAddress->getTelephone());
|
|
$this->assertEquals($exportedShippingData['email'], $shippingAddress->getEmail());
|
|
|
|
$this->assertEquals([$exportedBillingData['street']], $billingAddress->getStreet());
|
|
$this->assertEquals($exportedBillingData['firstname'], $billingAddress->getFirstname());
|
|
$this->assertEquals($exportedBillingData['city'], $billingAddress->getCity());
|
|
$this->assertEquals($exportedBillingData['telephone'], $billingAddress->getTelephone());
|
|
$this->assertEquals($exportedBillingData['email'], $billingAddress->getEmail());
|
|
}
|
|
|
|
/**
|
|
* The case when handling address data from the checkout.
|
|
* System's address fields are not replacing from export PayPal data.
|
|
* Billing and Shipping address are the same
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_payment_express_with_customer.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testReturnFromPaypalIfCheckout()
|
|
{
|
|
$prefix = 'exported';
|
|
$quote = $this->getFixtureQuote();
|
|
$this->prepareCheckoutModel($quote, $prefix);
|
|
$quote->getPayment()->setAdditionalInformation(Checkout::PAYMENT_INFO_BUTTON, 0);
|
|
|
|
$originalShippingAddress = $quote->getShippingAddress();
|
|
$originalBillingAddress = $quote->getBillingAddress();
|
|
|
|
$this->checkoutModel->returnFromPaypal('token');
|
|
|
|
$shippingAddress = $quote->getShippingAddress();
|
|
$billingAddress = $quote->getBillingAddress();
|
|
|
|
$this->assertEquals($originalShippingAddress->getStreet(), $shippingAddress->getStreet());
|
|
$this->assertEquals($originalShippingAddress->getFirstname(), $shippingAddress->getFirstname());
|
|
$this->assertEquals($originalShippingAddress->getCity(), $shippingAddress->getCity());
|
|
$this->assertEquals($originalShippingAddress->getTelephone(), $shippingAddress->getTelephone());
|
|
|
|
$this->assertEquals($originalBillingAddress->getStreet(), $billingAddress->getStreet());
|
|
$this->assertEquals($originalBillingAddress->getFirstname(), $billingAddress->getFirstname());
|
|
$this->assertEquals($originalBillingAddress->getCity(), $billingAddress->getCity());
|
|
$this->assertEquals($originalBillingAddress->getTelephone(), $billingAddress->getTelephone());
|
|
}
|
|
|
|
/**
|
|
* The case when handling address data from the checkout.
|
|
* System's address fields are replacing billing address from export PayPal data.
|
|
* Billing and Shipping address are different
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_payment_express_with_customer.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testReturnFromPaypalIfCheckoutWithReturnBillingAddress()
|
|
{
|
|
$prefix = 'exported';
|
|
$quote = $this->getFixtureQuote();
|
|
$this->paypalConfig->expects($this->exactly(2))
|
|
->method('getValue')
|
|
->with('requireBillingAddress')
|
|
->willReturn(1);
|
|
$this->prepareCheckoutModel($quote, $prefix);
|
|
$quote->getPayment()->setAdditionalInformation(Checkout::PAYMENT_INFO_BUTTON, 0);
|
|
|
|
$originalShippingAddress = $quote->getShippingAddress();
|
|
|
|
$this->checkoutModel->returnFromPaypal('token');
|
|
|
|
$shippingAddress = $quote->getShippingAddress();
|
|
$billingAddress = $quote->getBillingAddress();
|
|
$exportedBillingData = $this->getExportedData()['billing'];
|
|
|
|
$this->assertEquals($originalShippingAddress->getStreet(), $shippingAddress->getStreet());
|
|
$this->assertEquals($originalShippingAddress->getFirstname(), $shippingAddress->getFirstname());
|
|
$this->assertEquals($originalShippingAddress->getCity(), $shippingAddress->getCity());
|
|
$this->assertEquals($originalShippingAddress->getTelephone(), $shippingAddress->getTelephone());
|
|
|
|
$this->assertEquals([$prefix . $exportedBillingData['street']], $billingAddress->getStreet());
|
|
$this->assertEquals($prefix . $exportedBillingData['firstname'], $billingAddress->getFirstname());
|
|
$this->assertEquals($prefix . $exportedBillingData['city'], $billingAddress->getCity());
|
|
$this->assertEquals($prefix . $exportedBillingData['telephone'], $billingAddress->getTelephone());
|
|
}
|
|
|
|
/**
|
|
* Test case when customer doesn't have either billing or shipping addresses.
|
|
* Customer add virtual product to quote and place order using PayPal Express method.
|
|
* After return from PayPal quote billing address have to be updated by PayPal Express address.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/virtual_quote_with_empty_billing_address.php
|
|
* @magentoConfigFixture current_store payment/paypal_express/active 1
|
|
* @magentoDbIsolation enabled
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testReturnFromPayPalForCustomerWithEmptyAddresses(): void
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$this->prepareCheckoutModel($quote);
|
|
$quote->getPayment()->setAdditionalInformation(Checkout::PAYMENT_INFO_BUTTON, 0);
|
|
|
|
$this->checkoutModel->returnFromPaypal('token');
|
|
|
|
$billingAddress = $quote->getBillingAddress();
|
|
|
|
$this->performQuoteAddressAssertions($billingAddress, $this->getExportedData()['billing']);
|
|
}
|
|
|
|
/**
|
|
* Test case when customer doesn't have either billing or shipping addresses.
|
|
* Customer add virtual product to quote and place order using PayPal Express method.
|
|
* Default store country is in PayPal Express allowed specific country list.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/virtual_quote_with_empty_billing_address.php
|
|
* @magentoConfigFixture current_store payment/paypal_express/active 1
|
|
* @magentoConfigFixture current_store payment/paypal_express/allowspecific 1
|
|
* @magentoConfigFixture current_store payment/paypal_express/specificcountry US,GB
|
|
* @magentoConfigFixture current_store general/country/default US
|
|
*
|
|
* @magentoDbIsolation enabled
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testPaymentValidationWithAllowedSpecificCountry(): void
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$this->prepareCheckoutModel($quote);
|
|
|
|
$quote->getPayment()->getMethodInstance()->validate();
|
|
}
|
|
|
|
/**
|
|
* Test case when customer doesn't have either billing or shipping addresses.
|
|
* Customer add virtual product to quote and place order using PayPal Express method.
|
|
* PayPal Express allowed specific country list doesn't contain default store country.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/virtual_quote_with_empty_billing_address.php
|
|
* @magentoConfigFixture current_store payment/paypal_express/active 1
|
|
* @magentoConfigFixture current_store payment/paypal_express/allowspecific 1
|
|
* @magentoConfigFixture current_store payment/paypal_express/specificcountry US,GB
|
|
* @magentoConfigFixture current_store general/country/default CA
|
|
*
|
|
* @magentoDbIsolation enabled
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testPaymentValidationWithAllowedSpecificCountryNegative(): void
|
|
{
|
|
$this->expectException(\Magento\Framework\Exception\LocalizedException::class);
|
|
$this->expectExceptionMessage(
|
|
'You can\'t use the payment type you selected to make payments to the billing country.'
|
|
);
|
|
|
|
$quote = $this->getFixtureQuote();
|
|
$this->prepareCheckoutModel($quote);
|
|
$quote->getPayment()->getMethodInstance()->validate();
|
|
}
|
|
|
|
/**
|
|
* Performs quote address assertions.
|
|
*
|
|
* @param Address $address
|
|
* @param array $expected
|
|
* @return void
|
|
*/
|
|
private function performQuoteAddressAssertions(Address $address, array $expected): void
|
|
{
|
|
foreach ($expected as $key => $item) {
|
|
$methodName = 'get' . ucfirst($key);
|
|
if ($key === 'street') {
|
|
$item = [$item];
|
|
}
|
|
|
|
$this->assertEquals($item, $address->$methodName(), 'The "' . $key . '" does not match.');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize a checkout model mock.
|
|
*
|
|
* @param Quote $quote
|
|
*/
|
|
private function prepareCheckoutModel(Quote $quote, $prefix = '')
|
|
{
|
|
$this->checkoutModel = $this->objectManager->create(
|
|
Checkout::class,
|
|
[
|
|
'params' => ['quote' => $quote, 'config' => $this->paypalConfig],
|
|
'apiTypeFactory' => $this->apiTypeFactory,
|
|
'paypalInfo' => $this->paypalInfo
|
|
]
|
|
);
|
|
|
|
$exportedBillingAddress = $this->getExportedAddressFixture($this->getExportedData()['billing'], $prefix);
|
|
$this->api->method('getExportedBillingAddress')
|
|
->willReturn($exportedBillingAddress);
|
|
|
|
$exportedShippingAddress = $this->getExportedAddressFixture($this->getExportedData()['shipping'], $prefix);
|
|
$this->api->method('getExportedShippingAddress')
|
|
->willReturn($exportedShippingAddress);
|
|
|
|
$this->api->method('getShippingRateCode')
|
|
->willReturn('flatrate_flatrate Flat Rate - Fixed');
|
|
|
|
$this->paypalInfo->method('importToPayment')
|
|
->with($this->api, $quote->getPayment());
|
|
}
|
|
|
|
/**
|
|
* A Paypal response stub.
|
|
*
|
|
* @return array
|
|
*/
|
|
private function getExportedData(): array
|
|
{
|
|
return [
|
|
'shipping' => [
|
|
'email' => 'customer@example.com',
|
|
'firstname' => 'John',
|
|
'lastname' => 'Doe',
|
|
'country' => 'US',
|
|
'region' => 'Colorado',
|
|
'region_id' => '13',
|
|
'city' => 'Denver',
|
|
'street' => '66 Pearl St',
|
|
'postcode' => '80203',
|
|
'telephone' => '555-555-555',
|
|
],
|
|
'billing' => [
|
|
'email' => 'customer@example.com',
|
|
'firstname' => 'Jane',
|
|
'lastname' => 'Doe',
|
|
'country' => 'US',
|
|
'region' => 'Texas',
|
|
'region_id' => '13',
|
|
'city' => 'Austin',
|
|
'street' => '1100 Congress Ave',
|
|
'postcode' => '78701',
|
|
'telephone' => '555-555-555'
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Verify that guest customer quota has set type of checkout.
|
|
*
|
|
* @magentoDataFixture Magento/Paypal/_files/quote_payment_express.php
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDbIsolation enabled
|
|
*/
|
|
public function testGuestReturnFromPaypal()
|
|
{
|
|
$quote = $this->getFixtureQuote();
|
|
$paypalConfig = $this->getMockBuilder(Config::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
|
|
$apiTypeFactory = $this->getMockBuilder(Factory::class)
|
|
->disableOriginalConstructor()
|
|
->setMethods(['create'])
|
|
->getMock();
|
|
|
|
$paypalInfo = $this->getMockBuilder(Info::class)
|
|
->disableOriginalConstructor()
|
|
->setMethods(['importToPayment'])
|
|
->getMock();
|
|
|
|
$checkoutModel = $this->objectManager->create(
|
|
Checkout::class,
|
|
[
|
|
'params' => ['quote' => $quote, 'config' => $paypalConfig],
|
|
'apiTypeFactory' => $apiTypeFactory,
|
|
'paypalInfo' => $paypalInfo
|
|
]
|
|
);
|
|
|
|
$api = $this->getMockBuilder(Nvp::class)
|
|
->disableOriginalConstructor()
|
|
->setMethods(['call', 'getExportedShippingAddress', 'getExportedBillingAddress'])
|
|
->getMock();
|
|
|
|
$apiTypeFactory->expects($this->any())
|
|
->method('create')
|
|
->willReturn($api);
|
|
|
|
$exportedBillingAddress = $this->getExportedAddressFixture($quote->getBillingAddress()->getData());
|
|
$api->expects($this->any())
|
|
->method('getExportedBillingAddress')
|
|
->willReturn($exportedBillingAddress);
|
|
|
|
$exportedShippingAddress = $this->getExportedAddressFixture($quote->getShippingAddress()->getData());
|
|
$api->expects($this->any())
|
|
->method('getExportedShippingAddress')
|
|
->willReturn($exportedShippingAddress);
|
|
|
|
$this->addCountryFactory($api);
|
|
$data = [
|
|
'COUNTRYCODE' => $quote->getShippingAddress()->getCountryId(),
|
|
'STATE' => 'unknown'
|
|
];
|
|
$api->method('call')
|
|
->willReturn($data);
|
|
|
|
$paypalInfo->expects($this->once())
|
|
->method('importToPayment')
|
|
->with($api, $quote->getPayment());
|
|
|
|
$quote->getPayment()->setAdditionalInformation(Checkout::PAYMENT_INFO_BUTTON, 1);
|
|
|
|
$checkoutModel->returnFromPaypal('token');
|
|
|
|
$this->assertEquals(Onepage::METHOD_GUEST, $quote->getCheckoutMethod());
|
|
}
|
|
|
|
/**
|
|
* Prepare fixture for exported address.
|
|
*
|
|
* @param array $addressData
|
|
* @param string $prefix
|
|
* @return \Magento\Framework\DataObject
|
|
*/
|
|
private function getExportedAddressFixture(array $addressData, string $prefix = ''): \Magento\Framework\DataObject
|
|
{
|
|
$addressDataKeys = [
|
|
'country',
|
|
'firstname',
|
|
'lastname',
|
|
'street',
|
|
'city',
|
|
'telephone',
|
|
'postcode',
|
|
'region',
|
|
'region_id',
|
|
'email',
|
|
];
|
|
$result = [];
|
|
foreach ($addressDataKeys as $key) {
|
|
if (isset($addressData[$key])) {
|
|
$result[$key] = $prefix . $addressData[$key];
|
|
}
|
|
}
|
|
|
|
$fixture = new \Magento\Framework\DataObject($result);
|
|
$fixture->setExportedKeys($addressDataKeys);
|
|
$fixture->setData('note', 'note');
|
|
|
|
return $fixture;
|
|
}
|
|
|
|
/**
|
|
* Gets quote.
|
|
*
|
|
* @return Quote
|
|
*/
|
|
private function getFixtureQuote(): Quote
|
|
{
|
|
/** @var Collection $quoteCollection */
|
|
$quoteCollection = $this->objectManager->create(Collection::class);
|
|
|
|
return $quoteCollection->getLastItem();
|
|
}
|
|
|
|
/**
|
|
* Adds countryFactory to a mock.
|
|
*
|
|
* @param MockObject $api
|
|
* @return void
|
|
* @throws \ReflectionException
|
|
*/
|
|
private function addCountryFactory(MockObject $api): void
|
|
{
|
|
$reflection = new \ReflectionClass($api);
|
|
$property = $reflection->getProperty('_countryFactory');
|
|
$property->setAccessible(true);
|
|
$property->setValue($api, $this->objectManager->get(CountryFactory::class));
|
|
}
|
|
}
|