282 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			9.2 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\FilterBuilder;
 | 
						|
use Magento\Framework\Api\SearchCriteria;
 | 
						|
use Magento\Framework\Api\SearchCriteriaBuilder;
 | 
						|
use Magento\Framework\ObjectManagerInterface;
 | 
						|
use Magento\Quote\Api\CartRepositoryInterface;
 | 
						|
use Magento\Quote\Api\Data\AddressInterfaceFactory;
 | 
						|
use Magento\Quote\Api\Data\CartExtension;
 | 
						|
use Magento\Quote\Api\Data\CartInterface;
 | 
						|
use Magento\Quote\Api\Data\CartInterfaceFactory;
 | 
						|
use Magento\Quote\Api\Data\CartItemInterfaceFactory;
 | 
						|
use Magento\Quote\Api\Data\CartSearchResultsInterface;
 | 
						|
use Magento\Quote\Api\Data\ShippingAssignmentInterface;
 | 
						|
use Magento\Quote\Api\Data\ShippingInterface;
 | 
						|
use Magento\Quote\Model\Quote\Address as QuoteAddress;
 | 
						|
use Magento\Store\Api\StoreRepositoryInterface;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap as BootstrapHelper;
 | 
						|
use Magento\TestFramework\Quote\Model\GetQuoteByReservedOrderId;
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test for quote repository
 | 
						|
 *
 | 
						|
 * @see \Magento\Quote\Model\QuoteRepository
 | 
						|
 * @magentoDbIsolation enabled
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class QuoteRepositoryTest extends TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var ObjectManagerInterface
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CartRepositoryInterface
 | 
						|
     */
 | 
						|
    private $quoteRepository;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var SearchCriteriaBuilder
 | 
						|
     */
 | 
						|
    private $searchCriteriaBuilder;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var FilterBuilder
 | 
						|
     */
 | 
						|
    private $filterBuilder;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var GetQuoteByReservedOrderId
 | 
						|
     */
 | 
						|
    private $getQuoteByReservedOrderId;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var StoreRepositoryInterface
 | 
						|
     */
 | 
						|
    private $storeRepository;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var AddressInterfaceFactory
 | 
						|
     */
 | 
						|
    private $addressFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CartInterfaceFactory
 | 
						|
     */
 | 
						|
    private $quoteFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CartItemInterfaceFactory
 | 
						|
     */
 | 
						|
    private $itemFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CartInterface|null
 | 
						|
     */
 | 
						|
    private $quote;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        parent::setUp();
 | 
						|
 | 
						|
        $this->objectManager = BootstrapHelper::getObjectManager();
 | 
						|
        $this->quoteRepository = $this->objectManager->create(CartRepositoryInterface::class);
 | 
						|
        $this->searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
 | 
						|
        $this->filterBuilder = $this->objectManager->get(FilterBuilder::class);
 | 
						|
        $this->getQuoteByReservedOrderId = $this->objectManager->get(GetQuoteByReservedOrderId::class);
 | 
						|
        $this->storeRepository = $this->objectManager->get(StoreRepositoryInterface::class);
 | 
						|
        $this->addressFactory = $this->objectManager->get(AddressInterfaceFactory::class);
 | 
						|
        $this->quoteFactory = $this->objectManager->get(CartInterfaceFactory::class);
 | 
						|
        $this->itemFactory = $this->objectManager->get(CartItemInterfaceFactory::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        if ($this->quote instanceof CartInterface) {
 | 
						|
            $this->quoteRepository->delete($this->quote);
 | 
						|
        }
 | 
						|
 | 
						|
        parent::tearDown();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests that quote saved with custom store id has same store id after getting via repository.
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/quote.php
 | 
						|
     * @magentoDataFixture Magento/Store/_files/second_store.php
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testGetQuoteWithCustomStoreId(): void
 | 
						|
    {
 | 
						|
        $secondStoreCode = 'fixture_second_store';
 | 
						|
        $reservedOrderId = 'test01';
 | 
						|
        $secondStore = $this->storeRepository->get($secondStoreCode);
 | 
						|
        $quote = $this->getQuoteByReservedOrderId->execute($reservedOrderId);
 | 
						|
        $quote->setStoreId($secondStore->getId());
 | 
						|
        $this->quoteRepository->save($quote);
 | 
						|
        $savedQuote = $this->quoteRepository->get($quote->getId());
 | 
						|
        $this->assertEquals(
 | 
						|
            $secondStore->getId(),
 | 
						|
            $savedQuote->getStoreId(),
 | 
						|
            'Quote store id should be equal with store id value in DB'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/quote.php
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testGetList(): void
 | 
						|
    {
 | 
						|
        $searchCriteria = $this->getSearchCriteria('test01');
 | 
						|
        $searchResult = $this->quoteRepository->getList($searchCriteria);
 | 
						|
        $this->performAssertions($searchResult);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/quote.php
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testGetListDoubleCall(): void
 | 
						|
    {
 | 
						|
        $searchCriteria1 = $this->getSearchCriteria('test01');
 | 
						|
        $searchCriteria2 = $this->getSearchCriteria('test02');
 | 
						|
        $searchResult = $this->quoteRepository->getList($searchCriteria1);
 | 
						|
        $this->performAssertions($searchResult);
 | 
						|
        $searchResult = $this->quoteRepository->getList($searchCriteria2);
 | 
						|
        $this->assertEmpty($searchResult->getItems());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testSaveWithNotExistingCustomerAddress(): void
 | 
						|
    {
 | 
						|
        $addressData = include __DIR__ . '/../../Sales/_files/address_data.php';
 | 
						|
        $billingAddress = $this->addressFactory->create(['data' => $addressData]);
 | 
						|
        $billingAddress->setAddressType(QuoteAddress::ADDRESS_TYPE_BILLING)->setCustomerAddressId('not_existing');
 | 
						|
        $shippingAddress = $this->addressFactory->create(['data' => $addressData]);
 | 
						|
        $shippingAddress->setAddressType(QuoteAddress::ADDRESS_TYPE_SHIPPING)->setCustomerAddressId('not_existing');
 | 
						|
        $shipping = $this->objectManager->get(ShippingInterface::class);
 | 
						|
        $shipping->setAddress($shippingAddress);
 | 
						|
        $shippingAssignment = $this->objectManager->get(ShippingAssignmentInterface::class);
 | 
						|
        $shippingAssignment->setItems([]);
 | 
						|
        $shippingAssignment->setShipping($shipping);
 | 
						|
        $extensionAttributes = $this->objectManager->get(CartExtension::class);
 | 
						|
        $extensionAttributes->setShippingAssignments([$shippingAssignment]);
 | 
						|
        $this->quote = $this->quoteFactory->create();
 | 
						|
        $this->quote->setStoreId(1)
 | 
						|
            ->setIsActive(true)
 | 
						|
            ->setIsMultiShipping(0)
 | 
						|
            ->setBillingAddress($billingAddress)
 | 
						|
            ->setShippingAddress($shippingAddress)
 | 
						|
            ->setExtensionAttributes($extensionAttributes)
 | 
						|
            ->save();
 | 
						|
        $this->quoteRepository->save($this->quote);
 | 
						|
        $this->assertNull($this->quote->getBillingAddress()->getCustomerAddressId());
 | 
						|
        $this->assertNull(
 | 
						|
            $this->quote->getExtensionAttributes()
 | 
						|
                ->getShippingAssignments()[0]
 | 
						|
                ->getShipping()
 | 
						|
                ->getAddress()
 | 
						|
                ->getCustomerAddressId()
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Catalog/_files/multiple_products.php
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testSaveQuoteWithItems(): void
 | 
						|
    {
 | 
						|
        $items = $this->prepareQuoteItems(['simple1', 'simple2']);
 | 
						|
        $this->quote = $this->quoteFactory->create();
 | 
						|
        $this->quote->setItems($items);
 | 
						|
        $this->quoteRepository->save($this->quote);
 | 
						|
        $this->assertCount(2, $this->quote->getItemsCollection());
 | 
						|
        $this->assertEquals(2, $this->quote->getItemsCount());
 | 
						|
        $this->assertEquals(2, $this->quote->getItemsQty());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepare quote items by products sku.
 | 
						|
     *
 | 
						|
     * @param array $productsSku
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function prepareQuoteItems(array $productsSku): array
 | 
						|
    {
 | 
						|
        $items = [];
 | 
						|
        foreach ($productsSku as $sku) {
 | 
						|
            $item = $this->itemFactory->create();
 | 
						|
            $item->setSku($sku)->setQty(1);
 | 
						|
            $items[] = $item;
 | 
						|
        }
 | 
						|
 | 
						|
        return $items;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get search criteria
 | 
						|
     *
 | 
						|
     * @param string $filterValue
 | 
						|
     * @return SearchCriteria
 | 
						|
     */
 | 
						|
    private function getSearchCriteria(string $filterValue): SearchCriteria
 | 
						|
    {
 | 
						|
        $filters = [];
 | 
						|
        $filters[] = $this->filterBuilder->setField('reserved_order_id')
 | 
						|
            ->setConditionType('=')
 | 
						|
            ->setValue($filterValue)
 | 
						|
            ->create();
 | 
						|
        $this->searchCriteriaBuilder->addFilters($filters);
 | 
						|
 | 
						|
        return $this->searchCriteriaBuilder->create();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Perform assertions
 | 
						|
     *
 | 
						|
     * @param CartSearchResultsInterface $searchResult
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    private function performAssertions(CartSearchResultsInterface $searchResult): void
 | 
						|
    {
 | 
						|
        $expectedExtensionAttributes = [
 | 
						|
            'firstname' => 'firstname',
 | 
						|
            'lastname' => 'lastname',
 | 
						|
            'email' => 'admin@example.com',
 | 
						|
        ];
 | 
						|
        $items = $searchResult->getItems();
 | 
						|
        $actualQuote = array_pop($items);
 | 
						|
        $testAttribute = $actualQuote->getExtensionAttributes()->getQuoteTestAttribute();
 | 
						|
        $this->assertInstanceOf(CartInterface::class, $actualQuote);
 | 
						|
        $this->assertEquals('test01', $actualQuote->getReservedOrderId());
 | 
						|
        $this->assertEquals($expectedExtensionAttributes['firstname'], $testAttribute->getFirstName());
 | 
						|
        $this->assertEquals($expectedExtensionAttributes['lastname'], $testAttribute->getLastName());
 | 
						|
        $this->assertEquals($expectedExtensionAttributes['email'], $testAttribute->getEmail());
 | 
						|
    }
 | 
						|
}
 |