231 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Quote\Model;
 | 
						|
 | 
						|
use Magento\Framework\Api\SearchCriteriaBuilder;
 | 
						|
use Magento\Quote\Api\CartRepositoryInterface;
 | 
						|
use Magento\Quote\Api\Data\AddressInterface;
 | 
						|
use Magento\Quote\Model\Quote\Address\Rate;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class QuoteValidatorTest.
 | 
						|
 *
 | 
						|
 * @magentoDbIsolation enabled
 | 
						|
 */
 | 
						|
class QuoteValidatorTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var QuoteValidator
 | 
						|
     */
 | 
						|
    private $quoteValidator;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->quoteValidator = Bootstrap::getObjectManager()->create(QuoteValidator::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitShippingAddressInvalid()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
        $this->expectExceptionMessage('Please check the shipping address information.');
 | 
						|
 | 
						|
        $quote = $this->getQuote();
 | 
						|
        $quote->getShippingAddress()->setPostcode('');
 | 
						|
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitCountryIsNotAllowed()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
        $this->expectExceptionMessage('Some addresses can\'t be used due to the configurations for specific countries.');
 | 
						|
 | 
						|
        /** @magentoConfigFixture does not allow to change the value for the website scope */
 | 
						|
        Bootstrap::getObjectManager()->get(
 | 
						|
            \Magento\Framework\App\Config\MutableScopeConfigInterface::class
 | 
						|
        )->setValue(
 | 
						|
            'general/country/allow',
 | 
						|
            'US',
 | 
						|
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
 | 
						|
        );
 | 
						|
        $quote = $this->getQuote();
 | 
						|
        $quote->getShippingAddress()->setCountryId('AF');
 | 
						|
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitShippingMethodInvalid()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
        $this->expectExceptionMessage('The shipping method is missing. Select the shipping method and try again.');
 | 
						|
 | 
						|
        $quote = $this->getQuote();
 | 
						|
        $quote->getShippingAddress()->setShippingMethod('NONE');
 | 
						|
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitBillingAddressInvalid()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
        $this->expectExceptionMessage('Please check the billing address information.');
 | 
						|
 | 
						|
        $quote = $this->getQuote();
 | 
						|
        $quote->getBillingAddress()->setTelephone('');
 | 
						|
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitPaymentMethodInvalid()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
        $this->expectExceptionMessage('Enter a valid payment method and try again.');
 | 
						|
 | 
						|
        $quote = $this->getQuote();
 | 
						|
        $quote->getPayment()->setMethod('');
 | 
						|
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoConfigFixture current_store sales/minimum_order/active 1
 | 
						|
     * @magentoConfigFixture current_store sales/minimum_order/amount 100
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitMinimumAmountInvalid()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
 | 
						|
        $quote = $this->getQuote();
 | 
						|
        $quote->getShippingAddress()
 | 
						|
            ->setBaseSubtotal(0);
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitWithoutMinimumOrderAmount()
 | 
						|
    {
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($this->getQuote());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoConfigFixture current_store sales/minimum_order/active 1
 | 
						|
     * @magentoConfigFixture current_store sales/minimum_order/amount 100
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmitWithMinimumOrderAmount()
 | 
						|
    {
 | 
						|
        $quote = $this->getQuote();
 | 
						|
        $quote->getShippingAddress()
 | 
						|
            ->setBaseSubtotal(200);
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Checks a case when the default website has country restrictions and the quote created
 | 
						|
     * for the another website with different country restrictions.
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Quote/Fixtures/quote_sec_website.php
 | 
						|
     * @magentoDbIsolation disabled
 | 
						|
     */
 | 
						|
    public function testValidateBeforeSubmit()
 | 
						|
    {
 | 
						|
        $quote = $this->getQuoteById('0000032134');
 | 
						|
        $this->quoteValidator->validateBeforeSubmit($quote);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return Quote
 | 
						|
     */
 | 
						|
    private function getQuote(): Quote
 | 
						|
    {
 | 
						|
        /** @var Quote $quote */
 | 
						|
        $quote = Bootstrap::getObjectManager()->create(Quote::class);
 | 
						|
 | 
						|
        /** @var AddressInterface $billingAddress */
 | 
						|
        $billingAddress = Bootstrap::getObjectManager()->create(AddressInterface::class);
 | 
						|
        $billingAddress->setFirstname('Joe')
 | 
						|
            ->setLastname('Doe')
 | 
						|
            ->setCountryId('US')
 | 
						|
            ->setRegion('TX')
 | 
						|
            ->setCity('Austin')
 | 
						|
            ->setStreet('1000 West Parmer Line')
 | 
						|
            ->setPostcode('11501')
 | 
						|
            ->setTelephone('123456789');
 | 
						|
        $quote->setBillingAddress($billingAddress);
 | 
						|
 | 
						|
        /** @var AddressInterface $shippingAddress */
 | 
						|
        $shippingAddress = Bootstrap::getObjectManager()->create(AddressInterface::class);
 | 
						|
        $shippingAddress->setFirstname('Joe')
 | 
						|
        ->setLastname('Doe')
 | 
						|
        ->setCountryId('US')
 | 
						|
        ->setRegion('TX')
 | 
						|
        ->setCity('Austin')
 | 
						|
        ->setStreet('1000 West Parmer Line')
 | 
						|
        ->setPostcode('11501')
 | 
						|
        ->setTelephone('123456789');
 | 
						|
        $quote->setShippingAddress($shippingAddress);
 | 
						|
 | 
						|
        $quote->getShippingAddress()
 | 
						|
            ->setShippingMethod('flatrate_flatrate')
 | 
						|
            ->setCollectShippingRates(true);
 | 
						|
        /** @var Rate $shippingRate */
 | 
						|
        $shippingRate = Bootstrap::getObjectManager()->create(Rate::class);
 | 
						|
        $shippingRate->setMethod('flatrate')
 | 
						|
            ->setCarrier('flatrate')
 | 
						|
            ->setPrice('5')
 | 
						|
            ->setCarrierTitle('Flat Rate')
 | 
						|
            ->setCode('flatrate_flatrate');
 | 
						|
        $quote->getShippingAddress()
 | 
						|
            ->addShippingRate($shippingRate);
 | 
						|
 | 
						|
        $quote->getPayment()->setMethod('CC');
 | 
						|
 | 
						|
        /** @var QuoteRepository $quoteRepository */
 | 
						|
        $quoteRepository = Bootstrap::getObjectManager()->create(QuoteRepository::class);
 | 
						|
        $quoteRepository->save($quote);
 | 
						|
 | 
						|
        return $quote;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets quote entity by reserved order id.
 | 
						|
     *
 | 
						|
     * @param string $reservedOrderId
 | 
						|
     * @return Quote
 | 
						|
     */
 | 
						|
    private function getQuoteById(string $reservedOrderId): Quote
 | 
						|
    {
 | 
						|
        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
 | 
						|
        $searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
 | 
						|
        $searchCriteria = $searchCriteriaBuilder->addFilter('reserved_order_id', $reservedOrderId)
 | 
						|
            ->create();
 | 
						|
 | 
						|
        /** @var CartRepositoryInterface $repository */
 | 
						|
        $repository = Bootstrap::getObjectManager()->get(CartRepositoryInterface::class);
 | 
						|
        $items = $repository->getList($searchCriteria)
 | 
						|
            ->getItems();
 | 
						|
 | 
						|
        return array_pop($items);
 | 
						|
    }
 | 
						|
}
 |