SourceItemIndexerTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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\Framework\Api\SearchCriteriaBuilder;
  9. use Magento\InventoryApi\Api\Data\SourceItemInterface;
  10. use Magento\InventoryApi\Api\SourceItemRepositoryInterface;
  11. use Magento\InventoryApi\Api\SourceItemsSaveInterface;
  12. use Magento\InventorySalesApi\Model\GetStockItemDataInterface;
  13. use Magento\TestFramework\Helper\Bootstrap;
  14. use PHPUnit\Framework\TestCase;
  15. use Magento\Catalog\Api\ProductRepositoryInterface;
  16. class SourceItemIndexerTest extends TestCase
  17. {
  18. /**
  19. * @var ProductRepositoryInterface
  20. */
  21. private $productRepository;
  22. /**
  23. * @var SourceItemRepositoryInterface
  24. */
  25. private $sourceItemRepository;
  26. /**
  27. * @var SearchCriteriaBuilder
  28. */
  29. private $searchCriteriaBuilder;
  30. /**
  31. * @var SourceItemsSaveInterface
  32. */
  33. private $sourceItemsSave;
  34. /**
  35. * @var GetStockItemDataInterface
  36. */
  37. private $getStockItemData;
  38. /**
  39. * @inheritdoc
  40. */
  41. protected function setUp(): void
  42. {
  43. $objectManager = Bootstrap::getObjectManager();
  44. $this->productRepository = $objectManager->get(ProductRepositoryInterface::class);
  45. $this->sourceItemRepository = $objectManager->get(SourceItemRepositoryInterface::class);
  46. $this->searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
  47. $this->sourceItemsSave = $objectManager->get(SourceItemsSaveInterface::class);
  48. $this->getStockItemData = $objectManager->get(GetStockItemDataInterface::class);
  49. }
  50. /**
  51. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  52. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/custom_stock_with_eu_website_grouped_products.php
  53. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  54. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  55. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  56. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/source_items_grouped_multiple.php
  57. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  58. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  59. *
  60. * @magentoDbIsolation disabled
  61. */
  62. public function testOneSimpleChangesToOutOfStockInOneSource()
  63. {
  64. $groupedSku = 'grouped_in_stock';
  65. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  66. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  67. // EU-Stock
  68. $data = $this->getStockItemData->execute($groupedSku, 10);
  69. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  70. // US-Stock
  71. $data = $this->getStockItemData->execute($groupedSku, 20);
  72. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  73. // Global-Stock
  74. $data = $this->getStockItemData->execute($groupedSku, 30);
  75. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  76. }
  77. /**
  78. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  79. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/custom_stock_with_eu_website_grouped_products.php
  80. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  81. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  82. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  83. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/source_items_grouped_multiple.php
  84. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  85. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  86. *
  87. * @magentoDbIsolation disabled
  88. */
  89. public function testAllSimplesChangesToOutOfStockInOneSource()
  90. {
  91. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  92. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  93. $this->changeStockStatusForSku('simple_22', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  94. $groupedSku = 'grouped_in_stock';
  95. // EU-Stock
  96. $data = $this->getStockItemData->execute($groupedSku, 10);
  97. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  98. // US-Stock
  99. $data = $this->getStockItemData->execute($groupedSku, 20);
  100. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  101. // Global-Stock
  102. $data = $this->getStockItemData->execute($groupedSku, 30);
  103. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  104. }
  105. /**
  106. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  107. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/custom_stock_with_eu_website_grouped_products.php
  108. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  109. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  110. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  111. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/source_items_grouped_multiple.php
  112. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  113. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  114. *
  115. * @magentoDbIsolation disabled
  116. */
  117. public function testAllSimplesChangesToOutOfStockInAllSources()
  118. {
  119. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  120. $this->changeStockStatusForSku('simple_22', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  121. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  122. $this->changeStockStatusForSku('simple_22', 'eu-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  123. $this->changeStockStatusForSku('simple_11', 'eu-2', SourceItemInterface::STATUS_OUT_OF_STOCK);
  124. $this->changeStockStatusForSku('simple_22', 'eu-2', SourceItemInterface::STATUS_OUT_OF_STOCK);
  125. $this->changeStockStatusForSku('simple_11', 'eu-3', SourceItemInterface::STATUS_OUT_OF_STOCK);
  126. $this->changeStockStatusForSku('simple_22', 'eu-3', SourceItemInterface::STATUS_OUT_OF_STOCK);
  127. $groupedSku = 'grouped_in_stock';
  128. // EU-Stock
  129. $data = $this->getStockItemData->execute($groupedSku, 10);
  130. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  131. // US-Stock
  132. $data = $this->getStockItemData->execute($groupedSku, 20);
  133. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  134. // Global-Stock
  135. $data = $this->getStockItemData->execute($groupedSku, 30);
  136. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  137. }
  138. /**
  139. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  140. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/custom_stock_with_eu_website_grouped_products.php
  141. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  142. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  143. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  144. * @magentoDataFixture ../../../../app/code/Magento/InventoryGroupedProductIndexer/Test/_files/source_items_grouped_multiple.php
  145. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  146. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  147. *
  148. * @magentoDbIsolation disabled
  149. */
  150. public function testAllSimplesChangesToInStock()
  151. {
  152. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_IN_STOCK);
  153. $this->changeStockStatusForSku('simple_22', 'us-1', SourceItemInterface::STATUS_IN_STOCK);
  154. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  155. $this->changeStockStatusForSku('simple_22', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  156. $this->changeStockStatusForSku('simple_11', 'eu-2', SourceItemInterface::STATUS_IN_STOCK);
  157. $this->changeStockStatusForSku('simple_22', 'eu-2', SourceItemInterface::STATUS_IN_STOCK);
  158. $this->changeStockStatusForSku('simple_11', 'eu-3', SourceItemInterface::STATUS_IN_STOCK);
  159. $this->changeStockStatusForSku('simple_22', 'eu-3', SourceItemInterface::STATUS_IN_STOCK);
  160. $groupedSku = 'grouped_in_stock';
  161. // EU-Stock
  162. $data = $this->getStockItemData->execute($groupedSku, 10);
  163. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  164. // US-Stock
  165. $data = $this->getStockItemData->execute($groupedSku, 20);
  166. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  167. // Global-Stock
  168. $data = $this->getStockItemData->execute($groupedSku, 30);
  169. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  170. }
  171. /**
  172. * @param string $sku
  173. * @param string $sourceCode
  174. * @param int $stockStatus
  175. */
  176. private function changeStockStatusForSku(string $sku, string $sourceCode, int $stockStatus)
  177. {
  178. $searchCriteria = $this->searchCriteriaBuilder
  179. ->addFilter(SourceItemInterface::SKU, $sku)
  180. ->addFilter(SourceItemInterface::SOURCE_CODE, $sourceCode)
  181. ->create();
  182. $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
  183. foreach ($sourceItems as $sourceItem) {
  184. $sourceItem->setStatus($stockStatus);
  185. }
  186. $this->sourceItemsSave->execute($sourceItems);
  187. }
  188. }