Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
BackorderConditionTest.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
12 use Magento\CatalogInventory\Api\StockItemCriteriaInterfaceFactory;
20 use PHPUnit\Framework\TestCase;
21 
22 class BackorderConditionTest extends TestCase
23 {
27  private $sourceItemRepository;
28 
32  private $searchCriteriaBuilder;
33 
37  private $sourceItemsSave;
38 
42  private $productRepository;
43 
47  private $isProductSalable;
48 
52  private $stockItemRepository;
53 
57  private $stockItemCriteriaFactory;
58 
59  protected function setUp()
60  {
61  $this->productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
62  $this->stockItemRepository = Bootstrap::getObjectManager()->get(StockItemRepositoryInterface::class);
63  $this->stockItemCriteriaFactory = Bootstrap::getObjectManager()->get(
64  StockItemCriteriaInterfaceFactory::class
65  );
66  $this->sourceItemRepository = Bootstrap::getObjectManager()->get(SourceItemRepositoryInterface::class);
67  $this->searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
68  $this->sourceItemsSave = Bootstrap::getObjectManager()->get(SourceItemsSaveInterface::class);
69  $this->isProductSalable = Bootstrap::getObjectManager()->get(IsProductSalableInterface::class);
70  }
71 
81  public function testBackorderedZeroQtyProductIsSalable()
82  {
83  $product = $this->productRepository->get('SKU-2');
84  $stockItemSearchCriteria = $this->stockItemCriteriaFactory->create();
85  $stockItemSearchCriteria->setProductsFilter($product->getId());
86  $stockItemsCollection = $this->stockItemRepository->getList($stockItemSearchCriteria);
87 
89  $legacyStockItem = current($stockItemsCollection->getItems());
90  $legacyStockItem->setBackorders(1);
91  $legacyStockItem->setUseConfigBackorders(0);
92  $this->stockItemRepository->save($legacyStockItem);
93 
94  $sourceItem = $this->getSourceItemBySku('SKU-2');
95  $sourceItem->setQuantity(-15);
96  $this->sourceItemsSave->execute([$sourceItem]);
97 
98  $this->assertTrue($this->isProductSalable->execute('SKU-2', 20));
99  $this->assertTrue($this->isProductSalable->execute('SKU-2', 30));
100  }
101 
106  private function getSourceItemBySku(string $sku): SourceItemInterface
107  {
108  $searchCriteria = $this->searchCriteriaBuilder
109  ->addFilter('sku', $sku)
110  ->create();
111  $sourceItemSearchResult = $this->sourceItemRepository->getList($searchCriteria);
112 
113  return current($sourceItemSearchResult->getItems());
114  }
115 }
$searchCriteria