183 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Checkout\Api;
 | 
						|
 | 
						|
use Magento\Checkout\Api\Data\ShippingInformationInterface;
 | 
						|
use Magento\Checkout\Api\Data\ShippingInformationInterfaceFactory;
 | 
						|
use Magento\Customer\Api\CustomerRepositoryInterface;
 | 
						|
use Magento\Framework\Api\SearchCriteriaBuilder;
 | 
						|
use Magento\Framework\Exception\InputException;
 | 
						|
use Magento\Framework\Exception\LocalizedException;
 | 
						|
use Magento\Framework\Exception\NoSuchEntityException;
 | 
						|
use Magento\Quote\Api\CartRepositoryInterface;
 | 
						|
use Magento\Quote\Api\Data\ShippingAssignmentInterface;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
use Magento\Quote\Model\QuoteIdMask;
 | 
						|
use Magento\Quote\Model\QuoteIdMaskFactory;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test GuestShippingInformationManagement API.
 | 
						|
 */
 | 
						|
class GuestShippingInformationManagementTest extends TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var GuestShippingInformationManagementInterface
 | 
						|
     */
 | 
						|
    private $management;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CartRepositoryInterface
 | 
						|
     */
 | 
						|
    private $cartRepo;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CustomerRepositoryInterface
 | 
						|
     */
 | 
						|
    private $customerRepo;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ShippingInformationInterfaceFactory
 | 
						|
     */
 | 
						|
    private $shippingFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var SearchCriteriaBuilder
 | 
						|
     */
 | 
						|
    private $searchCriteria;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var QuoteIdMaskFactory
 | 
						|
     */
 | 
						|
    private $maskFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->management = $objectManager->get(GuestShippingInformationManagementInterface::class);
 | 
						|
        $this->cartRepo = $objectManager->get(CartRepositoryInterface::class);
 | 
						|
        $this->customerRepo = $objectManager->get(CustomerRepositoryInterface::class);
 | 
						|
        $this->shippingFactory = $objectManager->get(ShippingInformationInterfaceFactory::class);
 | 
						|
        $this->searchCriteria = $objectManager->get(SearchCriteriaBuilder::class);
 | 
						|
        $this->maskFactory = $objectManager->get(QuoteIdMaskFactory::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test using another address for quote.
 | 
						|
     *
 | 
						|
     * @param bool $swapShipping Whether to swap shipping or billing addresses.
 | 
						|
     * @return void
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/quote.php
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer_with_addresses.php
 | 
						|
     * @dataProvider getAddressesVariation
 | 
						|
     */
 | 
						|
    public function testDifferentAddresses(bool $swapShipping): void
 | 
						|
    {
 | 
						|
        $carts = $this->cartRepo->getList(
 | 
						|
            $this->searchCriteria->addFilter('reserved_order_id', 'test01')->create()
 | 
						|
        )->getItems();
 | 
						|
        $cart = array_pop($carts);
 | 
						|
        $otherCustomer = $this->customerRepo->get('customer_with_addresses@test.com');
 | 
						|
        $otherAddresses = $otherCustomer->getAddresses();
 | 
						|
        $otherAddress = array_pop($otherAddresses);
 | 
						|
 | 
						|
        //Setting invalid IDs.
 | 
						|
        /** @var ShippingAssignmentInterface $shippingAssignment */
 | 
						|
        $shippingAssignment = $cart->getExtensionAttributes()->getShippingAssignments()[0];
 | 
						|
        $shippingAddress = $shippingAssignment->getShipping()->getAddress();
 | 
						|
        $billingAddress = $cart->getBillingAddress();
 | 
						|
        if ($swapShipping) {
 | 
						|
            $address = $shippingAddress;
 | 
						|
        } else {
 | 
						|
            $address = $billingAddress;
 | 
						|
        }
 | 
						|
        $address->setCustomerAddressId($otherAddress->getId());
 | 
						|
        $address->setCustomerId($otherCustomer->getId());
 | 
						|
        $address->setId(null);
 | 
						|
        /** @var ShippingInformationInterface $shippingInformation */
 | 
						|
        $shippingInformation = $this->shippingFactory->create();
 | 
						|
        $shippingInformation->setBillingAddress($billingAddress);
 | 
						|
        $shippingInformation->setShippingAddress($shippingAddress);
 | 
						|
        $shippingInformation->setShippingMethodCode('flatrate');
 | 
						|
        /** @var QuoteIdMask $idMask */
 | 
						|
        $idMask = $this->maskFactory->create();
 | 
						|
        $idMask->load($cart->getId(), 'quote_id');
 | 
						|
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            sprintf(
 | 
						|
                'The shipping information was unable to be saved. Error: "Invalid customer address id %s"',
 | 
						|
                $address->getCustomerAddressId()
 | 
						|
            )
 | 
						|
        );
 | 
						|
        $this->expectException(InputException::class);
 | 
						|
        $this->management->saveAddressInformation($idMask->getMaskedId(), $shippingInformation);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test save address information with customer custom address attribute for quote
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     *
 | 
						|
     * @throws LocalizedException
 | 
						|
     * @throws NoSuchEntityException
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/quote.php
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer_address_with_custom_text_attribute.php
 | 
						|
     */
 | 
						|
    public function testSaveAddressInformationWithCustomerCustomAddressAttribute(): void
 | 
						|
    {
 | 
						|
        $carts = $this->cartRepo->getList(
 | 
						|
            $this->searchCriteria->addFilter('reserved_order_id', 'test01')->create()
 | 
						|
        )->getItems();
 | 
						|
        $currentQuote = array_pop($carts);
 | 
						|
        $guestCustomer = $this->customerRepo->get('JohnDoe@mail.com');
 | 
						|
 | 
						|
        $customerCustomAddressAttribute = $guestCustomer->getCustomAttributes();
 | 
						|
 | 
						|
        /** @var ShippingAssignmentInterface $shippingAssignment */
 | 
						|
        $shippingAssignment = $currentQuote->getExtensionAttributes()->getShippingAssignments()[0];
 | 
						|
        $shippingAddress = $shippingAssignment->getShipping()->getAddress();
 | 
						|
        $billingAddress = $currentQuote->getBillingAddress();
 | 
						|
 | 
						|
        if ($customerCustomAddressAttribute) {
 | 
						|
            $shippingAddress->setCustomAttributes($customerCustomAddressAttribute);
 | 
						|
            $billingAddress->setCustomAttributes($customerCustomAddressAttribute);
 | 
						|
        }
 | 
						|
 | 
						|
        /** @var ShippingInformationInterface $shippingInformation */
 | 
						|
        $shippingInformation = $this->shippingFactory->create();
 | 
						|
        $shippingInformation->setBillingAddress($billingAddress);
 | 
						|
        $shippingInformation->setShippingAddress($shippingAddress);
 | 
						|
        $shippingInformation->setShippingMethodCode('flatrate');
 | 
						|
        $shippingInformation->setShippingCarrierCode('flatrate');
 | 
						|
        /** @var QuoteIdMask $idMask */
 | 
						|
        $idMask = $this->maskFactory->create();
 | 
						|
        $idMask->load($currentQuote->getId(), 'quote_id');
 | 
						|
 | 
						|
        $paymentDetails = $this->management->saveAddressInformation($idMask->getMaskedId(), $shippingInformation);
 | 
						|
        $this->assertNotEmpty($paymentDetails);
 | 
						|
        $this->assertEquals($currentQuote->getGrandTotal(), $paymentDetails->getTotals()->getSubtotal());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Different variations for addresses test.
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getAddressesVariation(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'Shipping address swap' => [true],
 | 
						|
            'Billing address swap' => [false]
 | 
						|
        ];
 | 
						|
    }
 | 
						|
}
 |