From ca071c01d1e1d6c02a01fd108abc96cd29531605 Mon Sep 17 00:00:00 2001 From: Pavel Bystritsky Date: Wed, 8 Nov 2017 13:36:29 +0200 Subject: [PATCH] magento/magento2#11880: Configurable::getUsedProducts returns a different array after product collections is cached --- .../Model/Product/Type/Configurable.php | 2 +- .../Model/Product/Type/ConfigurableTest.php | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php index 360a11cf2748f..e6345af40f37a 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php @@ -1296,7 +1296,7 @@ private function loadUsedProducts(\Magento\Catalog\Model\Product $product, $cach if ($salableOnly) { $collection = $this->salableProcessor->process($collection); } - $usedProducts = $collection->getItems(); + $usedProducts = array_values($collection->getItems()); $this->saveUsedProductsCacheData($product, $usedProducts, $cacheKey); } $product->setData($dataFieldName, $usedProducts); diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php index 141d84df86031..da5a3365c1a82 100644 --- a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php @@ -237,6 +237,26 @@ public function testGetUsedProducts() } } + /** + * Test getUsedProducts returns array with same indexes regardless collections was cache or not. + * + * @magentoAppIsolation enabled + * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php + */ + public function testGetUsedProductsCached() + { + /** @var \Magento\Framework\App\Cache\StateInterface $cacheState */ + $cacheState = Bootstrap::getObjectManager()->get(\Magento\Framework\App\Cache\StateInterface::class); + $cacheState->setEnabled(\Magento\Framework\App\Cache\Type\Collection::TYPE_IDENTIFIER, true); + + $products = $this->getUsedProducts(); + $productsCached = $this->getUsedProducts(); + self::assertEquals( + array_keys($products), + array_keys($productsCached) + ); + } + public function testGetUsedProductCollection() { $this->assertInstanceOf( @@ -571,4 +591,14 @@ protected function _prepareForCart() return $product; } + + /** + * @return ProductInterface[] + */ + protected function getUsedProducts() + { + $product = Bootstrap::getObjectManager()->create(Product::class); + $product->load(1); + return $this->model->getUsedProducts($product); + } }