314 lines
11 KiB
PHP
Executable File
314 lines
11 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Checkout\Model;
|
|
|
|
use Magento\Catalog\Api\Data\ProductTierPriceInterface;
|
|
use Magento\Catalog\Api\ProductRepositoryInterface;
|
|
use Magento\Catalog\Model\Product\Attribute\Source\Status;
|
|
use Magento\Customer\Api\CustomerRepositoryInterface;
|
|
use Magento\Customer\Model\Session as CustomerSession;
|
|
use Magento\Framework\ObjectManagerInterface;
|
|
use Magento\Quote\Api\CartRepositoryInterface;
|
|
use Magento\Quote\Api\Data\CartInterface;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use Magento\TestFramework\Quote\Model\GetQuoteByReservedOrderId;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Checkout Session model test.
|
|
*
|
|
* @see \Magento\Checkout\Model\Session
|
|
* @magentoDbIsolation enabled
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class SessionTest extends TestCase
|
|
{
|
|
/**
|
|
* @var ObjectManagerInterface
|
|
*/
|
|
private $objectManager;
|
|
|
|
/**
|
|
* @var CustomerRepositoryInterface
|
|
*/
|
|
private $customerRepository;
|
|
|
|
/**
|
|
* @var CustomerSession
|
|
*/
|
|
private $customerSession;
|
|
|
|
/**
|
|
* @var Session
|
|
*/
|
|
private $checkoutSession;
|
|
|
|
/**
|
|
* @var GetQuoteByReservedOrderId
|
|
*/
|
|
private $getQuoteByReservedOrderId;
|
|
|
|
/**
|
|
* @var ProductRepositoryInterface
|
|
*/
|
|
private $productRepository;
|
|
|
|
/**
|
|
* @var CartRepositoryInterface
|
|
*/
|
|
private $quoteRepository;
|
|
|
|
/**
|
|
* @var CartInterface
|
|
*/
|
|
private $quote;
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
$this->objectManager = Bootstrap::getObjectManager();
|
|
$this->customerRepository = $this->objectManager->create(CustomerRepositoryInterface::class);
|
|
$this->customerSession = $this->objectManager->get(CustomerSession::class);
|
|
$this->checkoutSession = $this->objectManager->get(Session::class);
|
|
$this->getQuoteByReservedOrderId = $this->objectManager->get(GetQuoteByReservedOrderId::class);
|
|
$this->productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
|
|
$this->productRepository->cleanCache();
|
|
$this->quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
protected function tearDown(): void
|
|
{
|
|
if ($this->quote instanceof CartInterface) {
|
|
$this->quoteRepository->delete($this->quote);
|
|
}
|
|
$this->customerSession->setCustomerId(null);
|
|
$this->checkoutSession->clearQuote();
|
|
$this->checkoutSession->setCustomerData(null);
|
|
|
|
parent::tearDown();
|
|
}
|
|
|
|
/**
|
|
* Tests that quote items and totals are correct when product becomes unavailable.
|
|
*
|
|
* @magentoDataFixture Magento/Sales/_files/quote.php
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetQuoteWithUnavailableProduct(): void
|
|
{
|
|
$reservedOrderId = 'test01';
|
|
$quoteGrandTotal = 10;
|
|
$quote = $this->getQuoteByReservedOrderId->execute($reservedOrderId);
|
|
$this->assertEquals(1, $quote->getItemsCount());
|
|
$this->assertCount(1, $quote->getItems());
|
|
$this->assertEquals($quoteGrandTotal, $quote->getShippingAddress()->getBaseGrandTotal());
|
|
$product = $this->productRepository->get('simple');
|
|
$product->setStatus(Status::STATUS_DISABLED);
|
|
$this->productRepository->save($product);
|
|
$this->checkoutSession->setQuoteId($quote->getId());
|
|
$quote = $this->checkoutSession->getQuote();
|
|
$this->assertEquals(0, $quote->getItemsCount());
|
|
$this->assertEmpty($quote->getItems());
|
|
$this->assertEquals(0, $quote->getShippingAddress()->getBaseGrandTotal());
|
|
}
|
|
|
|
/**
|
|
* Test covers case when quote is not yet initialized and customer data is set to checkout session model.
|
|
*
|
|
* Expected result - quote object should be loaded and customer data should be set to it.
|
|
*
|
|
* @magentoDataFixture Magento/Sales/_files/quote_with_customer.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetQuoteNotInitializedCustomerSet(): void
|
|
{
|
|
$customer = $this->customerRepository->getById(1);
|
|
$this->checkoutSession->setCustomerData($customer);
|
|
$quote = $this->checkoutSession->getQuote();
|
|
$this->validateCustomerDataInQuote($quote);
|
|
}
|
|
|
|
/**
|
|
* Test covers case when quote is not yet initialized and customer data is set to customer session model.
|
|
*
|
|
* Expected result - quote object should be loaded and customer data should be set to it.
|
|
*
|
|
* @magentoDataFixture Magento/Sales/_files/quote_with_customer.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetQuoteNotInitializedCustomerLoggedIn(): void
|
|
{
|
|
$customer = $this->customerRepository->getById(1);
|
|
$this->customerSession->setCustomerDataObject($customer);
|
|
$quote = $this->checkoutSession->getQuote();
|
|
$this->validateCustomerDataInQuote($quote);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Sales/_files/quote_with_customer.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetQuoteWithMismatchingSession(): void
|
|
{
|
|
$quote = $this->getQuoteByReservedOrderId->execute('test01');
|
|
$this->checkoutSession->setQuoteId($quote->getId());
|
|
$this->quote = $this->checkoutSession->getQuote();
|
|
$this->assertEmpty($this->quote->getCustomerId());
|
|
$this->assertNotEquals($quote->getId(), $this->quote->getId());
|
|
}
|
|
|
|
/**
|
|
* Tes merging of customer data into initialized quote object.
|
|
*
|
|
* Conditions:
|
|
* 1. Quote without customer data is set to checkout session
|
|
* 2. Customer without associated quote is set to checkout session
|
|
*
|
|
* Expected result:
|
|
* Quote which is set to checkout session should contain customer data
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testLoadCustomerQuoteCustomerWithoutQuote(): void
|
|
{
|
|
$this->quote = $this->checkoutSession->getQuote();
|
|
$this->assertEmpty(
|
|
$this->quote->getCustomerId(),
|
|
'Precondition failed: Customer data must not be set to quote'
|
|
);
|
|
$this->assertEmpty(
|
|
$this->quote->getCustomerEmail(),
|
|
'Precondition failed: Customer data must not be set to quote'
|
|
);
|
|
self::assertEquals(
|
|
'1',
|
|
$this->quote->getCustomerIsGuest(),
|
|
'Precondition failed: Customer must be as guest in quote'
|
|
);
|
|
$customer = $this->customerRepository->getById(1);
|
|
$this->customerSession->setCustomerDataObject($customer);
|
|
$this->quote = $this->checkoutSession->getQuote();
|
|
$this->assertEmpty(
|
|
$this->quote->getCustomerEmail(),
|
|
'Precondition failed: Customer data must not be set to quote'
|
|
);
|
|
$this->checkoutSession->loadCustomerQuote();
|
|
$this->quote = $this->checkoutSession->getQuote();
|
|
$this->validateCustomerDataInQuote($this->quote);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
* @magentoDataFixture Magento/Sales/_files/quote.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testGetQuoteWithProductWithTierPrice(): void
|
|
{
|
|
$reservedOrderId = 'test01';
|
|
$customerGroupId = 1;
|
|
$tierPriceQty = 1;
|
|
$tierPriceValue = 9;
|
|
$product = $this->productRepository->get('simple');
|
|
$tierPrice = $this->objectManager->get(ProductTierPriceInterface::class)
|
|
->setCustomerGroupId($customerGroupId)
|
|
->setQty($tierPriceQty)
|
|
->setValue($tierPriceValue);
|
|
$product->setTierPrices([$tierPrice]);
|
|
$this->productRepository->save($product);
|
|
$quote = $this->getQuoteByReservedOrderId->execute($reservedOrderId);
|
|
$this->checkoutSession->setQuoteId($quote->getId());
|
|
$quote = $this->checkoutSession->getQuote();
|
|
$item = $quote->getItems()[0];
|
|
$quoteProduct = $item->getProduct();
|
|
$this->assertEquals(10, $quoteProduct->getTierPrice($tierPriceQty));
|
|
$customer = $this->customerRepository->getById(1);
|
|
$this->customerSession->setCustomerDataAsLoggedIn($customer);
|
|
$quote = $this->checkoutSession->getQuote();
|
|
$item = $quote->getItems()[0];
|
|
$quoteProduct = $item->getProduct();
|
|
$this->assertEquals($tierPriceValue, $quoteProduct->getTierPrice(1));
|
|
}
|
|
|
|
/**
|
|
* Test covers case when quote is not yet initialized and customer is guest
|
|
*
|
|
* Expected result - quote object should be loaded with customer as guest
|
|
*/
|
|
public function testGetQuoteNotInitializedGuest()
|
|
{
|
|
$quote = $this->checkoutSession->getQuote();
|
|
self::assertEquals('1', $quote->getCustomerIsGuest());
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Checkout/_files/quote_with_simple_product_saved.php
|
|
* @magentoDataFixture Magento/Checkout/_files/quote_with_customer_without_address.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testMergeGuestQuoteWithCustomerQuote(): void
|
|
{
|
|
$guestQuote = $this->getQuoteByReservedOrderId->execute('test_order_with_simple_product_without_address');
|
|
$customerQuote = $this->getQuoteByReservedOrderId->execute('test_order_with_customer_without_address');
|
|
$this->checkoutSession->setQuoteId($guestQuote->getId());
|
|
$this->customerSession->setCustomerId(1);
|
|
$updatedQuote = $this->checkoutSession->loadCustomerQuote()->getQuote();
|
|
$this->assertNull($this->getQuoteByReservedOrderId->execute('test_order_with_simple_product_without_address'));
|
|
$this->assertEquals($customerQuote->getId(), $updatedQuote->getId());
|
|
$this->assertCount(2, $updatedQuote->getItems());
|
|
}
|
|
|
|
/**
|
|
* Ensure that quote has customer data specified in customer fixture.
|
|
*
|
|
* @param CartInterface $quote
|
|
* @return void
|
|
*/
|
|
private function validateCustomerDataInQuote(CartInterface $quote): void
|
|
{
|
|
$customerIdFromFixture = 1;
|
|
$customerEmailFromFixture = 'customer@example.com';
|
|
$customerFirstNameFromFixture = 'John';
|
|
$this->assertEquals(
|
|
$customerEmailFromFixture,
|
|
$quote->getCustomerEmail(),
|
|
'Customer email was not set to Quote correctly.'
|
|
);
|
|
$this->assertEquals(
|
|
$customerIdFromFixture,
|
|
$quote->getCustomerId(),
|
|
'Customer ID was not set to Quote correctly.'
|
|
);
|
|
$this->assertEquals(
|
|
$customerFirstNameFromFixture,
|
|
$quote->getCustomerFirstname(),
|
|
'Customer first name was not set to Quote correctly.'
|
|
);
|
|
self::assertEquals(
|
|
'0',
|
|
$quote->getCustomerIsGuest(),
|
|
'Customer should not be as guest in Quote.'
|
|
);
|
|
}
|
|
}
|