![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/dev/tests/integration/testsuite/Magento/Checkout/Model/ |
<?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 = '[email protected]'; $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.' ); } }