magento2-docker/dev/tests/integration/testsuite/Magento/Quote/Model/QuoteRepositoryTest.php

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());
}
}