AbstractCartTest.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Checkout\Block\Cart;
  7. use Magento\Catalog\Api\ProductRepositoryInterface;
  8. use Magento\CatalogInventory\Api\StockItemRepositoryInterface;
  9. use Magento\CatalogInventory\Model\StockRegistryProvider;
  10. use Magento\Checkout\Model\Session;
  11. use Magento\Framework\Api\SearchCriteriaBuilder;
  12. use Magento\Quote\Api\CartRepositoryInterface;
  13. use Magento\TestFramework\Helper\Bootstrap;
  14. class AbstractCartTest extends \PHPUnit\Framework\TestCase
  15. {
  16. /**
  17. * Tests that product in shopping cart remains visible even after it becomes out of stock.
  18. *
  19. * @magentoDataFixture Magento/Sales/_files/quote.php
  20. */
  21. public function testProductsOutOfStockIsVisibleInShoppingCart()
  22. {
  23. $productSku = 'simple';
  24. $reservedOrderId = 'test01';
  25. $objectManager = Bootstrap::getObjectManager();
  26. /** @var ProductRepositoryInterface $productRepository */
  27. $productRepository = $objectManager->get(ProductRepositoryInterface::class);
  28. $product = $productRepository->get($productSku);
  29. $this->setProductOutOfStock($product->getId());
  30. $quote = $this->getStoredQuote($reservedOrderId);
  31. $checkoutSession = $this->getMockBuilder(Session::class)
  32. ->disableOriginalConstructor()
  33. ->getMock();
  34. $checkoutSession->method('getQuote')->willReturn($quote);
  35. $abstractCart = $objectManager->create(
  36. AbstractCart::class,
  37. ['checkoutSession' => $checkoutSession]
  38. );
  39. $items = array_filter(
  40. $abstractCart->getItems(),
  41. function (\Magento\Quote\Model\Quote\Item $item) use ($productSku) {
  42. return $item->getSku() === $productSku;
  43. }
  44. );
  45. $this->assertNotEmpty(
  46. $items,
  47. 'Product disappeared from shopping cart after it had become out of stock.'
  48. );
  49. }
  50. /**
  51. * @param int $productId
  52. * @return void
  53. */
  54. private function setProductOutOfStock($productId)
  55. {
  56. /** @var $stockRegistryProvider StockRegistryProvider */
  57. $stockRegistryProvider = Bootstrap::getObjectManager()->get(StockRegistryProvider::class);
  58. $stockItem = $stockRegistryProvider->getStockItem($productId, 0);
  59. $stockItem->setIsInStock(false);
  60. /** @var $stockItemRepository StockItemRepositoryInterface */
  61. $stockItemRepository = Bootstrap::getObjectManager()->get(StockItemRepositoryInterface::class);
  62. $stockItemRepository->save($stockItem);
  63. }
  64. /**
  65. * @param string $reservedOrderId
  66. * @return \Magento\Quote\Api\Data\CartInterface
  67. */
  68. private function getStoredQuote($reservedOrderId)
  69. {
  70. /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
  71. $searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
  72. $searchCriteriaBuilder->addFilter('reserved_order_id', $reservedOrderId);
  73. /** @var CartRepositoryInterface $cartRepository */
  74. $cartRepository = Bootstrap::getObjectManager()->create(CartRepositoryInterface::class);
  75. $quoteItems = $cartRepository->getList($searchCriteriaBuilder->create())->getItems();
  76. return current($quoteItems);
  77. }
  78. }