152 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Usps\Api;
 | 
						|
 | 
						|
use Magento\Catalog\Model\Product\Type;
 | 
						|
use Magento\Framework\HTTP\AsyncClient\Response;
 | 
						|
use Magento\Framework\HTTP\AsyncClientInterface;
 | 
						|
use Magento\Quote\Api\Data\AddressInterface;
 | 
						|
use Magento\Quote\Api\Data\AddressInterfaceFactory;
 | 
						|
use Magento\Quote\Api\Data\CartItemInterface;
 | 
						|
use Magento\Quote\Api\Data\CartItemInterfaceFactory;
 | 
						|
use Magento\Quote\Api\Data\ShippingMethodInterface;
 | 
						|
use Magento\Quote\Api\GuestCartItemRepositoryInterface;
 | 
						|
use Magento\Quote\Api\GuestCartManagementInterface;
 | 
						|
use Magento\Quote\Api\GuestCouponManagementInterface;
 | 
						|
use Magento\Quote\Api\GuestShipmentEstimationInterface;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\TestFramework\HTTP\AsyncClientInterfaceMock;
 | 
						|
use Magento\TestFramework\ObjectManager;
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
 | 
						|
/**
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class GuestCouponManagementTest extends TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var GuestCouponManagementInterface
 | 
						|
     */
 | 
						|
    private $management;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ObjectManager
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var AsyncClientInterfaceMock
 | 
						|
     */
 | 
						|
    private $httpClient;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->management = $this->objectManager->get(GuestCouponManagementInterface::class);
 | 
						|
        $this->httpClient = $this->objectManager->get(AsyncClientInterface::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Checks a case when coupon is applied for a guest cart and USPS Priority Mail 1-Day configured as free method.
 | 
						|
     *
 | 
						|
     * @magentoConfigFixture default_store carriers/usps/active 1
 | 
						|
     * @magentoConfigFixture default_store carriers/usps/free_method 1
 | 
						|
     * @magentoDataFixture Magento/Usps/Fixtures/cart_rule_coupon_free_shipping.php
 | 
						|
     * @magentoDataFixture Magento/Quote/_files/is_salable_product.php
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testFreeShippingWithCoupon(): void
 | 
						|
    {
 | 
						|
        $couponCode = 'IMPHBR852R61';
 | 
						|
        $cartId = $this->createGuestCart();
 | 
						|
 | 
						|
        //phpcs:disable
 | 
						|
        $this->httpClient->nextResponses(
 | 
						|
            [
 | 
						|
                new Response(200, [], file_get_contents(__DIR__ . '/../Fixtures/rates_response.xml'))
 | 
						|
            ]
 | 
						|
        );
 | 
						|
        //phpcs:enable
 | 
						|
 | 
						|
        self::assertTrue($this->management->set($cartId, $couponCode));
 | 
						|
 | 
						|
        $methods = $this->estimateShipping($cartId);
 | 
						|
        $methods = $this->filterFreeShippingMethods($methods);
 | 
						|
        self::assertEquals(['Fixed', 'Priority Mail 1-Day'], $methods);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Creates guest shopping cart.
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    private function createGuestCart(): string
 | 
						|
    {
 | 
						|
        /** @var GuestCartManagementInterface $cartManagement */
 | 
						|
        $cartManagement = $this->objectManager->get(GuestCartManagementInterface::class);
 | 
						|
        $cartId = $cartManagement->createEmptyCart();
 | 
						|
 | 
						|
        /** @var CartItemInterfaceFactory $cartItemFactory */
 | 
						|
        $cartItemFactory = $this->objectManager->get(CartItemInterfaceFactory::class);
 | 
						|
 | 
						|
        /** @var CartItemInterface $cartItem */
 | 
						|
        $cartItem = $cartItemFactory->create();
 | 
						|
        $cartItem->setQuoteId($cartId);
 | 
						|
        $cartItem->setQty(1);
 | 
						|
        $cartItem->setSku('simple-99');
 | 
						|
        $cartItem->setProductType(Type::TYPE_SIMPLE);
 | 
						|
 | 
						|
        /** @var GuestCartItemRepositoryInterface $itemRepository */
 | 
						|
        $itemRepository = $this->objectManager->get(GuestCartItemRepositoryInterface::class);
 | 
						|
        $itemRepository->save($cartItem);
 | 
						|
 | 
						|
        return $cartId;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Estimates shipment for guest cart.
 | 
						|
     *
 | 
						|
     * @param string $cartId
 | 
						|
     * @return array ShippingMethodInterface[]
 | 
						|
     */
 | 
						|
    private function estimateShipping(string $cartId): array
 | 
						|
    {
 | 
						|
        $addressFactory = $this->objectManager->get(AddressInterfaceFactory::class);
 | 
						|
        /** @var AddressInterface $address */
 | 
						|
        $address = $addressFactory->create();
 | 
						|
        $address->setCountryId('US');
 | 
						|
        $address->setRegionId(12);
 | 
						|
        $address->setPostcode(90230);
 | 
						|
 | 
						|
        /** @var GuestShipmentEstimationInterface $estimation */
 | 
						|
        $estimation = $this->objectManager->get(GuestShipmentEstimationInterface::class);
 | 
						|
        return $estimation->estimateByExtendedAddress($cartId, $address);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Filters free shipping methods.
 | 
						|
     *
 | 
						|
     * @param array $methods
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function filterFreeShippingMethods(array $methods): array
 | 
						|
    {
 | 
						|
        $result = [];
 | 
						|
        /** @var ShippingMethodInterface $method */
 | 
						|
        foreach ($methods as $method) {
 | 
						|
            if ($method->getAmount() == 0) {
 | 
						|
                $result[] = $method->getMethodTitle();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
}
 |