StockIndexerTest.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventoryGroupedProductIndexer\Test\Integration;
  8. use Magento\Catalog\Api\ProductRepositoryInterface;
  9. use Magento\Catalog\Model\Product;
  10. use Magento\Framework\Api\SearchCriteriaBuilder;
  11. use Magento\GroupedProduct\Model\Product\Link\CollectionProvider\Grouped;
  12. use Magento\InventoryApi\Api\Data\SourceItemInterface;
  13. use Magento\InventoryApi\Api\GetSourceItemsBySkuInterface;
  14. use Magento\InventoryApi\Api\SourceItemRepositoryInterface;
  15. use Magento\InventoryApi\Api\SourceItemsSaveInterface;
  16. use Magento\InventoryIndexer\Indexer\Stock\StockIndexer;
  17. use Magento\InventoryIndexer\Model\ResourceModel\GetStockItemData;
  18. use Magento\InventoryIndexer\Test\Integration\Indexer\RemoveIndexData;
  19. use Magento\InventorySalesApi\Model\GetStockItemDataInterface;
  20. use Magento\Store\Model\StoreManagerInterface;
  21. use Magento\Store\Model\StoreRepository;
  22. use Magento\TestFramework\Helper\Bootstrap;
  23. use PHPUnit\Framework\TestCase;
  24. /**
  25. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  26. */
  27. class StockIndexerTest extends TestCase
  28. {
  29. /**
  30. * @var StockIndexer
  31. */
  32. private $stockIndexer;
  33. /**
  34. * @var GetStockItemData
  35. */
  36. private $getStockItemData;
  37. /**
  38. * @var RemoveIndexData
  39. */
  40. private $removeIndexData;
  41. /**
  42. * @var Grouped
  43. */
  44. private $groupedProducts;
  45. /**
  46. * @var GetSourceItemsBySkuInterface
  47. */
  48. private $getSourceItemsBySku;
  49. /**
  50. * @var SourceItemsSaveInterface
  51. */
  52. private $sourceItemSave;
  53. /**
  54. * @var SourceItemRepositoryInterface
  55. */
  56. private $sourceItemRepository;
  57. /**
  58. * @var SearchCriteriaBuilder
  59. */
  60. private $searchCriteriaBuilder;
  61. /**
  62. * @var ProductRepositoryInterface
  63. */
  64. private $productRepository;
  65. /**
  66. * @var StoreManagerInterface
  67. */
  68. private $storeManager;
  69. /**
  70. * @var StoreRepository
  71. */
  72. private $storeRepository;
  73. /**
  74. * @inheritdoc
  75. */
  76. protected function setUp(): void
  77. {
  78. $objectManager = Bootstrap::getObjectManager();
  79. $this->stockIndexer = $objectManager->get(StockIndexer::class);
  80. $this->getStockItemData = $objectManager->get(GetStockItemData::class);
  81. $this->groupedProducts = $objectManager->get(Grouped::class);
  82. $this->getSourceItemsBySku = $objectManager->get(GetSourceItemsBySkuInterface::class);
  83. $this->sourceItemSave = $objectManager->get(SourceItemsSaveInterface::class);
  84. $this->sourceItemRepository = $objectManager->get(SourceItemRepositoryInterface::class);
  85. $this->searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
  86. $this->productRepository = $objectManager->get(ProductRepositoryInterface::class);
  87. $this->storeManager = $objectManager->get(StoreManagerInterface::class);
  88. $this->storeRepository = $objectManager->get(StoreRepository::class);
  89. $this->removeIndexData = $objectManager->get(RemoveIndexData::class);
  90. $this->removeIndexData->execute([10, 20, 30]);
  91. }
  92. /**
  93. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  94. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProduct/Test/_files/default_stock_grouped_products.php
  95. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  96. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  97. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  98. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  99. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/source_items_grouped_multiple.php
  100. *
  101. * @magentoDbIsolation disabled
  102. */
  103. public function testReindexList()
  104. {
  105. $groupedSku = 'grouped_in_stock';
  106. $this->stockIndexer->executeList([10, 20, 30]);
  107. $stockItemData = $this->getStockItemData->execute($groupedSku, 10);
  108. self::assertEquals(1, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  109. $stockItemData = $this->getStockItemData->execute($groupedSku, 20);
  110. self::assertEquals(1, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  111. $stockItemData = $this->getStockItemData->execute($groupedSku, 30);
  112. self::assertEquals(1, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  113. }
  114. /**
  115. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  116. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/custom_stock_with_eu_website_grouped_products.php
  117. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  118. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  119. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  120. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/source_items_grouped_multiple.php
  121. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  122. *
  123. * @magentoDbIsolation disabled
  124. */
  125. public function testReindexListSetAllSimplesOutOfStock()
  126. {
  127. $groupedSku = 'grouped_in_stock';
  128. $store = $this->storeRepository->get('store_for_us_website');
  129. $this->storeManager->setCurrentStore($store->getId());
  130. $groupedProduct = $this->productRepository->get($groupedSku);
  131. $children = $this->groupedProducts->getLinkedProducts($groupedProduct);
  132. /** @var Product $child */
  133. foreach ($children as $child) {
  134. $sku = $child->getSku();
  135. $sourceItems = $this->getSourceItemsBySku->execute($sku);
  136. $changesSourceItems = [];
  137. foreach ($sourceItems as $sourceItem) {
  138. $sourceItem->setStatus(SourceItemInterface::STATUS_OUT_OF_STOCK);
  139. $changesSourceItems[] = $sourceItem;
  140. }
  141. $this->sourceItemSave->execute($changesSourceItems);
  142. }
  143. $this->removeIndexData->execute([10, 20, 30]);
  144. $this->stockIndexer->executeList([10, 20, 30]);
  145. $stockItemData = $this->getStockItemData->execute($groupedSku, 10);
  146. self::assertEquals(0, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  147. $stockItemData = $this->getStockItemData->execute($groupedSku, 20);
  148. self::assertEquals(0, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  149. $stockItemData = $this->getStockItemData->execute($groupedSku, 30);
  150. self::assertEquals(0, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  151. }
  152. /**
  153. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  154. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/custom_stock_with_eu_website_grouped_products.php
  155. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  156. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  157. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  158. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/source_items_grouped_multiple.php
  159. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  160. *
  161. * @magentoDbIsolation disabled
  162. */
  163. public function testReindexListSetAllEuSimplesOutOfStock()
  164. {
  165. $groupedSku = 'grouped_in_stock';
  166. $sourceCodes = ['eu-1', 'eu-2', 'eu-3'];
  167. $store = $this->storeRepository->get('store_for_us_website');
  168. $this->storeManager->setCurrentStore($store->getId());
  169. $groupedProduct = $this->productRepository->get($groupedSku);
  170. $children = $this->groupedProducts->getLinkedProducts($groupedProduct);
  171. foreach ($children as $child) {
  172. $sku = $child->getSku();
  173. $searchCriteria = $this->searchCriteriaBuilder
  174. ->addFilter(SourceItemInterface::SKU, $sku)
  175. ->addFilter(SourceItemInterface::SOURCE_CODE, $sourceCodes, 'in')
  176. ->create();
  177. $sourceItems = $this->sourceItemRepository->getList($searchCriteria);
  178. $changesSourceItems = [];
  179. foreach ($sourceItems->getItems() as $sourceItem) {
  180. $sourceItem->setStatus(SourceItemInterface::STATUS_OUT_OF_STOCK);
  181. $changesSourceItems[] = $sourceItem;
  182. }
  183. $this->sourceItemSave->execute($changesSourceItems);
  184. }
  185. $this->removeIndexData->execute([10, 20, 30]);
  186. $this->stockIndexer->executeList([10, 20, 30]);
  187. $stockItemData = $this->getStockItemData->execute($groupedSku, 10);
  188. self::assertEquals(0, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  189. $stockItemData = $this->getStockItemData->execute($groupedSku, 20);
  190. self::assertEquals(1, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  191. $stockItemData = $this->getStockItemData->execute($groupedSku, 30);
  192. self::assertEquals(1, $stockItemData[GetStockItemDataInterface::IS_SALABLE]);
  193. }
  194. }