SourceItemIndexerTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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\InventoryConfigurableProductIndexer\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()
  42. {
  43. parent::setUp();
  44. $this->productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
  45. $this->sourceItemRepository = Bootstrap::getObjectManager()->get(SourceItemRepositoryInterface::class);
  46. $this->searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
  47. $this->sourceItemsSave = Bootstrap::getObjectManager()->get(SourceItemsSaveInterface::class);
  48. $this->getStockItemData = Bootstrap::getObjectManager()->get(GetStockItemDataInterface::class);
  49. }
  50. // @codingStandardsIgnoreStart
  51. /**
  52. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  53. * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
  54. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/product_configurable_multiple.php
  55. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  56. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  57. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  58. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/source_items_configurable_multiple.php
  59. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  60. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  61. * @return void
  62. *
  63. * @magentoDbIsolation disabled
  64. */
  65. // @codingStandardsIgnoreEnd
  66. public function testOneSimpleChangesToOutOfStockInOneSource()
  67. {
  68. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  69. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  70. // EU-Stock
  71. $data = $this->getStockItemData->execute('configurable_1', 10);
  72. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  73. // US-Stock
  74. $data = $this->getStockItemData->execute('configurable_1', 20);
  75. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  76. // Global-Stock
  77. $data = $this->getStockItemData->execute('configurable_1', 30);
  78. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  79. }
  80. // @codingStandardsIgnoreStart
  81. /**
  82. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  83. * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
  84. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/product_configurable_multiple.php
  85. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  86. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  87. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  88. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/source_items_configurable_multiple.php
  89. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  90. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  91. * @return void
  92. *
  93. * @magentoDbIsolation disabled
  94. */
  95. // @codingStandardsIgnoreEnd
  96. public function testAllSimplesChangesToOutOfStockInOneSource()
  97. {
  98. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  99. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  100. $this->changeStockStatusForSku('simple_21', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  101. $this->changeStockStatusForSku('simple_31', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  102. // EU-Stock
  103. $data = $this->getStockItemData->execute('configurable_1', 10);
  104. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  105. // US-Stock
  106. $data = $this->getStockItemData->execute('configurable_1', 20);
  107. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  108. // Global-Stock
  109. $data = $this->getStockItemData->execute('configurable_1', 30);
  110. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  111. }
  112. // @codingStandardsIgnoreStart
  113. /**
  114. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  115. * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
  116. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/product_configurable_multiple.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/InventoryConfigurableProductIndexer/Test/_files/source_items_configurable_multiple.php
  121. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  122. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  123. * @return void
  124. *
  125. * @magentoDbIsolation disabled
  126. */
  127. // @codingStandardsIgnoreEnd
  128. public function testAllSimplesChangesToOutOfStockInAllSources()
  129. {
  130. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  131. $this->changeStockStatusForSku('simple_21', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  132. $this->changeStockStatusForSku('simple_31', 'us-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  133. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  134. $this->changeStockStatusForSku('simple_21', 'eu-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  135. $this->changeStockStatusForSku('simple_31', 'eu-1', SourceItemInterface::STATUS_OUT_OF_STOCK);
  136. $this->changeStockStatusForSku('simple_11', 'eu-2', SourceItemInterface::STATUS_OUT_OF_STOCK);
  137. $this->changeStockStatusForSku('simple_21', 'eu-2', SourceItemInterface::STATUS_OUT_OF_STOCK);
  138. $this->changeStockStatusForSku('simple_31', 'eu-2', SourceItemInterface::STATUS_OUT_OF_STOCK);
  139. $this->changeStockStatusForSku('simple_11', 'eu-3', SourceItemInterface::STATUS_OUT_OF_STOCK);
  140. $this->changeStockStatusForSku('simple_21', 'eu-3', SourceItemInterface::STATUS_OUT_OF_STOCK);
  141. $this->changeStockStatusForSku('simple_31', 'eu-3', SourceItemInterface::STATUS_OUT_OF_STOCK);
  142. // EU-Stock
  143. $data = $this->getStockItemData->execute('configurable_1', 10);
  144. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  145. // US-Stock
  146. $data = $this->getStockItemData->execute('configurable_1', 20);
  147. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  148. // Global-Stock
  149. $data = $this->getStockItemData->execute('configurable_1', 30);
  150. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  151. }
  152. // @codingStandardsIgnoreStart
  153. /**
  154. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  155. * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
  156. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/product_configurable_multiple.php
  157. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  158. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  159. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  160. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/source_items_configurable_multiple.php
  161. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  162. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/set_simples_out_of_stock.php
  163. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  164. * @return void
  165. *
  166. * @magentoDbIsolation disabled
  167. */
  168. // @codingStandardsIgnoreEnd
  169. public function testOneSimpleChangesToInStock()
  170. {
  171. $this->changeStockStatusForSku('simple_21', 'us-1', SourceItemInterface::STATUS_IN_STOCK);
  172. // EU-Stock
  173. $data = $this->getStockItemData->execute('configurable_1', 10);
  174. $this->assertEquals(0, $data[GetStockItemDataInterface::IS_SALABLE]);
  175. // US-Stock
  176. $data = $this->getStockItemData->execute('configurable_1', 20);
  177. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  178. // Global-Stock
  179. $data = $this->getStockItemData->execute('configurable_1', 30);
  180. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  181. }
  182. // @codingStandardsIgnoreStart
  183. /**
  184. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/websites_with_stores.php
  185. * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
  186. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/product_configurable_multiple.php
  187. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/sources.php
  188. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stocks.php
  189. * @magentoDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/stock_source_links.php
  190. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/source_items_configurable_multiple.php
  191. * @magentoDataFixture ../../../../app/code/Magento/InventorySalesApi/Test/_files/stock_website_sales_channels.php
  192. * @magentoDataFixture ../../../../app/code/Magento/InventoryConfigurableProductIndexer/Test/_files/set_simples_out_of_stock.php
  193. * @magentoDataFixture ../../../../app/code/Magento/InventoryIndexer/Test/_files/reindex_inventory.php
  194. * @return void
  195. *
  196. * @magentoDbIsolation disabled
  197. */
  198. // @codingStandardsIgnoreEnd
  199. public function testAllSimplesChangesToInStock()
  200. {
  201. $this->changeStockStatusForSku('simple_11', 'us-1', SourceItemInterface::STATUS_IN_STOCK);
  202. $this->changeStockStatusForSku('simple_21', 'us-1', SourceItemInterface::STATUS_IN_STOCK);
  203. $this->changeStockStatusForSku('simple_31', 'us-1', SourceItemInterface::STATUS_IN_STOCK);
  204. $this->changeStockStatusForSku('simple_11', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  205. $this->changeStockStatusForSku('simple_21', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  206. $this->changeStockStatusForSku('simple_31', 'eu-1', SourceItemInterface::STATUS_IN_STOCK);
  207. $this->changeStockStatusForSku('simple_11', 'eu-2', SourceItemInterface::STATUS_IN_STOCK);
  208. $this->changeStockStatusForSku('simple_21', 'eu-2', SourceItemInterface::STATUS_IN_STOCK);
  209. $this->changeStockStatusForSku('simple_31', 'eu-2', SourceItemInterface::STATUS_IN_STOCK);
  210. $this->changeStockStatusForSku('simple_11', 'eu-3', SourceItemInterface::STATUS_IN_STOCK);
  211. $this->changeStockStatusForSku('simple_21', 'eu-3', SourceItemInterface::STATUS_IN_STOCK);
  212. $this->changeStockStatusForSku('simple_31', 'eu-3', SourceItemInterface::STATUS_IN_STOCK);
  213. // EU-Stock
  214. $data = $this->getStockItemData->execute('configurable_1', 10);
  215. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  216. // US-Stock
  217. $data = $this->getStockItemData->execute('configurable_1', 20);
  218. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  219. // Global-Stock
  220. $data = $this->getStockItemData->execute('configurable_1', 30);
  221. $this->assertEquals(1, $data[GetStockItemDataInterface::IS_SALABLE]);
  222. }
  223. /**
  224. * @param string $sku
  225. * @param string $sourceCode
  226. * @param int $stockStatus
  227. */
  228. private function changeStockStatusForSku(string $sku, string $sourceCode, int $stockStatus)
  229. {
  230. $searchCriteria = $this->searchCriteriaBuilder
  231. ->addFilter(SourceItemInterface::SKU, $sku)
  232. ->addFilter(SourceItemInterface::SOURCE_CODE, $sourceCode)
  233. ->create();
  234. $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
  235. foreach ($sourceItems as $sourceItem) {
  236. $sourceItem->setStatus($stockStatus);
  237. }
  238. $this->sourceItemsSave->execute($sourceItems);
  239. }
  240. }