objectManager = Bootstrap::getObjectManager(); $this->customerRepository = $this->objectManager->create(CustomerRepositoryInterface::class); $this->customerSession = $this->objectManager->get(CustomerSession::class); $this->checkoutSession = $this->objectManager->create(Session::class); } /** * 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 */ public function testGetQuoteNotInitializedCustomerSet() { $customer = $this->customerRepository->getById(1); $this->checkoutSession->setCustomerData($customer); /** Execute SUT */ $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 * @magentoAppIsolation enabled */ public function testGetQuoteNotInitializedCustomerLoggedIn() { $customer = $this->customerRepository->getById(1); $this->customerSession->setCustomerDataObject($customer); /** Execute SUT */ $quote = $this->checkoutSession->getQuote(); $this->_validateCustomerDataInQuote($quote); } /** * 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 * @magentoAppIsolation enabled */ public function testLoadCustomerQuoteCustomerWithoutQuote() { $quote = $this->checkoutSession->getQuote(); $this->assertEmpty($quote->getCustomerId(), 'Precondition failed: Customer data must not be set to quote'); $this->assertEmpty($quote->getCustomerEmail(), 'Precondition failed: Customer data must not be set to quote'); $customer = $this->customerRepository->getById(1); $this->customerSession->setCustomerDataObject($customer); /** Ensure that customer data is still unavailable before SUT invocation */ $quote = $this->checkoutSession->getQuote(); $this->assertEmpty($quote->getCustomerEmail(), 'Precondition failed: Customer data must not be set to quote'); /** Execute SUT */ $this->checkoutSession->loadCustomerQuote(); $quote = $this->checkoutSession->getQuote(); $this->_validateCustomerDataInQuote($quote); } /** * @magentoDataFixture Magento/Customer/_files/customer.php * @magentoDataFixture Magento/Sales/_files/quote.php */ public function testGetQuoteWithProductWithTierPrice() { $reservedOrderId = 'test01'; $customerGroupId = 1; $tierPriceQty = 1; $tierPriceValue = 9; $productRepository = $this->objectManager->get(ProductRepositoryInterface::class); $product = $productRepository->get('simple'); $tierPrice = $this->objectManager->create(ProductTierPriceInterface::class) ->setCustomerGroupId($customerGroupId) ->setQty($tierPriceQty) ->setValue($tierPriceValue); $product->setTierPrices([$tierPrice]); $productRepository->save($product); $quote = $this->getQuote($reservedOrderId); $this->checkoutSession->setQuoteId($quote->getId()); $quote = $this->checkoutSession->getQuote(); $item = $quote->getItems()[0]; /** @var \Magento\Catalog\Model\Product $quoteProduct */ $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]; /** @var \Magento\Catalog\Model\Product $quoteProduct */ $quoteProduct = $item->getProduct(); $this->assertEquals($tierPriceValue, $quoteProduct->getTierPrice(1)); } /** * Returns quote by reserved order id. * * @param string $reservedOrderId * @return CartInterface */ private function getQuote(string $reservedOrderId): CartInterface { $filterBuilder = $this->objectManager->create(FilterBuilder::class); $filter = $filterBuilder->setField('reserved_order_id') ->setConditionType('=') ->setValue($reservedOrderId) ->create(); $searchCriteriaBuilder = $this->objectManager->create(SearchCriteriaBuilder::class); $searchCriteria = $searchCriteriaBuilder->addFilters([$filter]) ->create(); $quoteRepository = $this->objectManager->get(CartRepositoryInterface::class); $searchResult = $quoteRepository->getList($searchCriteria); /** @var CartInterface[] $items */ $items = $searchResult->getItems(); return \array_values($items)[0]; } /** * Ensure that quote has customer data specified in customer fixture. * * @param \Magento\Quote\Model\Quote $quote */ protected function _validateCustomerDataInQuote($quote) { $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.' ); } }