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);
+ }
}