cleanupReservations = Bootstrap::getObjectManager()->get(CleanupReservationsInterface::class); $this->productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class); $this->stockRepository = Bootstrap::getObjectManager()->get(StockRepositoryInterface::class); $this->storeRepository = Bootstrap::getObjectManager()->get(StoreRepositoryInterface::class); $this->storeManager = Bootstrap::getObjectManager()->get(StoreManagerInterface::class); $this->cleanupReservations->execute(); } /** * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/products.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/source_items.php * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php * * @param string $sku * @param int $stockId * @param float $qty * * @throws LocalizedException * @throws NoSuchEntityException * @throws CouldNotSaveException * @throws InputException * @throws ValidationException * * @dataProvider productsInStockDataProvider * * @magentoDbIsolation disabled */ public function testAddInStockProductToQuote( string $sku, int $stockId, float $qty ) { $quote = $this->getQuote($stockId); $product = $this->getProductBySku($sku); $quote->addProduct($product, $qty); /** @var CartItemInterface $quoteItem */ $quoteItem = current($quote->getAllItems()); self::assertEquals($qty, $quoteItem->getQty()); } /** * @see ../../../../app/code/Magento/InventoryApi/Test/_files/source_items.php * @return array */ public function productsInStockDataProvider(): array { return [ ['SKU-1', 10, 4], ['SKU-1', 10, 2], ['SKU-2', 30, 3], ['SKU-2', 30, 1] ]; } /** * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/products.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/source_items.php * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php * * @param string $sku * @param int $stockId * @param float $qty * * @throws LocalizedException * @throws NoSuchEntityException * @throws CouldNotSaveException * @throws InputException * @throws ValidationException * * @dataProvider notSalableProductsDataProvider * * @magentoDbIsolation disabled */ public function testAddOutOffStockProductToQuote( string $sku, int $stockId, float $qty ) { $quote = $this->getQuote($stockId); $product = $this->getProductBySku($sku); self::expectException(LocalizedException::class); $quote->addProduct($product, $qty); $quoteItemCount = count($quote->getAllItems()); self::assertEquals(0, $quoteItemCount); } /** * @see ../../../../app/code/Magento/InventoryApi/Test/_files/source_items.php * @return array */ public function notSalableProductsDataProvider(): array { return [ ['SKU-1', 20, 6], ['SKU-1', 30, 9], ['SKU-2', 10, 1.5], ['SKU-2', 30, 5.5], ['SKU-3', 20, 1.9] ]; } /** * @param string $sku * @return ProductInterface * @throws NoSuchEntityException */ private function getProductBySku(string $sku): ProductInterface { return $this->productRepository->get($sku); } /** * @param int $stockId * @return Quote * @throws NoSuchEntityException */ private function getQuote(int $stockId): Quote { /** @var StockInterface $stock */ $stock = $this->stockRepository->get($stockId); /** @var SalesChannelInterface[] $salesChannels */ $salesChannels = $stock->getExtensionAttributes()->getSalesChannels(); $storeCode = 'store_for_'; foreach ($salesChannels as $salesChannel) { if ($salesChannel->getType() == SalesChannelInterface::TYPE_WEBSITE) { $storeCode .= $salesChannel->getCode(); break; } } /** @var StoreInterface $store */ $store = $this->storeRepository->get($storeCode); $this->storeManager->setCurrentStore($storeCode); return Bootstrap::getObjectManager()->create( Quote::class, [ 'data' => [ 'store_id' => $store->getId(), 'is_active' => 0, 'is_multi_shipping' => 0, 'id' => 1 ] ] ); } protected function tearDown() { $this->cleanupReservations->execute(); } }