Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
IsSalableWithReservationsConditionTest.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
11 use Magento\CatalogInventory\Api\StockItemCriteriaInterfaceFactory;
21 use PHPUnit\Framework\TestCase;
22 
24 {
28  private $reservationBuilder;
29 
33  private $appendReservations;
34 
38  private $cleanupReservations;
39 
43  private $isProductSalable;
44 
48  private $productRepository;
49 
53  private $stockItemRepository;
54 
58  private $stockItemCriteriaFactory;
59 
63  private $sourceItemRepository;
64 
68  private $searchCriteriaBuilder;
69 
73  private $sourceItemsSave;
74 
78  protected function setUp()
79  {
80  parent::setUp();
81 
82  $this->reservationBuilder = Bootstrap::getObjectManager()->get(ReservationBuilderInterface::class);
83  $this->appendReservations = Bootstrap::getObjectManager()->get(AppendReservationsInterface::class);
84  $this->cleanupReservations = Bootstrap::getObjectManager()->get(CleanupReservationsInterface::class);
85  $this->isProductSalable = Bootstrap::getObjectManager()->get(IsProductSalableInterface::class);
86  $this->productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
87  $this->stockItemRepository = Bootstrap::getObjectManager()->get(StockItemRepositoryInterface::class);
88  $this->stockItemCriteriaFactory = Bootstrap::getObjectManager()->get(
89  StockItemCriteriaInterfaceFactory::class
90  );
91  $this->sourceItemRepository = Bootstrap::getObjectManager()->get(SourceItemRepositoryInterface::class);
92  $this->searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
93  $this->sourceItemsSave = Bootstrap::getObjectManager()->get(SourceItemsSaveInterface::class);
94  }
95 
112  public function testProductIsSalable(string $sku, int $stockId, bool $isSalable)
113  {
114  self::assertEquals($isSalable, $this->isProductSalable->execute($sku, $stockId));
115  }
116 
120  public function productIsSalableDataProvider(): array
121  {
122  return [
123  ['SKU-1', 10, true],
124  ['SKU-1', 20, false],
125  ['SKU-1', 30, true],
126  ['SKU-2', 10, false],
127  ['SKU-2', 20, true],
128  ['SKU-2', 30, true],
129  ['SKU-3', 10, false],
130  ['SKU-3', 20, false],
131  ['SKU-3', 30, false],
132  ];
133  }
134 
146  {
147  // emulate order placement (reserve -8.5 units)
148  $this->appendReservations->execute([
149  $this->reservationBuilder->setStockId(10)->setSku('SKU-1')->setQuantity(-8.5)->build(),
150  ]);
151  self::assertFalse($this->isProductSalable->execute('SKU-1', 10));
152 
153  $this->appendReservations->execute([
154  // unreserve 8.5 units for cleanup
155  $this->reservationBuilder->setStockId(10)->setSku('SKU-1')->setQuantity(8.5)->build(),
156  ]);
157  $this->cleanupReservations->execute();
158  }
159 }