Skip to content

Commit 0e3b1dc

Browse files
MC-38197: [Magento Cloud] Error when updating carts - fatal error Call to a member function getValue() on null in module-configurable-product CartItemProcessor.php
1 parent edfbc39 commit 0e3b1dc

File tree

2 files changed

+46
-22
lines changed

2 files changed

+46
-22
lines changed

app/code/Magento/ConfigurableProduct/Model/Quote/Item/CartItemProcessor.php

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -82,31 +82,34 @@ public function convertToBuyRequest(CartItemInterface $cartItem)
8282
*/
8383
public function processOptions(CartItemInterface $cartItem)
8484
{
85-
$attributesOption = $cartItem->getProduct()->getCustomOption('attributes');
86-
$selectedConfigurableOptions = $this->serializer->unserialize($attributesOption->getValue());
85+
$attributesOption = $cartItem->getProduct()
86+
->getCustomOption('attributes');
87+
if ($attributesOption) {
88+
$selectedConfigurableOptions = $this->serializer->unserialize($attributesOption->getValue());
8789

88-
if (is_array($selectedConfigurableOptions)) {
89-
$configurableOptions = [];
90-
foreach ($selectedConfigurableOptions as $optionId => $optionValue) {
91-
/** @var \Magento\ConfigurableProduct\Api\Data\ConfigurableItemOptionValueInterface $option */
92-
$option = $this->itemOptionValueFactory->create();
93-
$option->setOptionId($optionId);
94-
$option->setOptionValue($optionValue);
95-
$configurableOptions[] = $option;
96-
}
90+
if (is_array($selectedConfigurableOptions)) {
91+
$configurableOptions = [];
92+
foreach ($selectedConfigurableOptions as $optionId => $optionValue) {
93+
/** @var \Magento\ConfigurableProduct\Api\Data\ConfigurableItemOptionValueInterface $option */
94+
$option = $this->itemOptionValueFactory->create();
95+
$option->setOptionId($optionId);
96+
$option->setOptionValue($optionValue);
97+
$configurableOptions[] = $option;
98+
}
9799

98-
$productOption = $cartItem->getProductOption()
99-
? $cartItem->getProductOption()
100-
: $this->productOptionFactory->create();
100+
$productOption = $cartItem->getProductOption()
101+
? $cartItem->getProductOption()
102+
: $this->productOptionFactory->create();
101103

102-
/** @var \Magento\Quote\Api\Data\ProductOptionExtensionInterface $extensibleAttribute */
103-
$extensibleAttribute = $productOption->getExtensionAttributes()
104-
? $productOption->getExtensionAttributes()
105-
: $this->extensionFactory->create();
104+
/** @var \Magento\Quote\Api\Data\ProductOptionExtensionInterface $extensibleAttribute */
105+
$extensibleAttribute = $productOption->getExtensionAttributes()
106+
? $productOption->getExtensionAttributes()
107+
: $this->extensionFactory->create();
106108

107-
$extensibleAttribute->setConfigurableItemOptions($configurableOptions);
108-
$productOption->setExtensionAttributes($extensibleAttribute);
109-
$cartItem->setProductOption($productOption);
109+
$extensibleAttribute->setConfigurableItemOptions($configurableOptions);
110+
$productOption->setExtensionAttributes($extensibleAttribute);
111+
$cartItem->setProductOption($productOption);
112+
}
110113
}
111114
return $cartItem;
112115
}

app/code/Magento/ConfigurableProduct/Test/Unit/Model/Quote/Item/CartItemProcessorTest.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class CartItemProcessorTest extends TestCase
5959
*/
6060
private $productOptionExtensionAttributes;
6161

62-
/** @var \PHPUnit\Framework\MockObject\MockObject */
62+
/** @var MockObject */
6363
private $serializer;
6464

6565
protected function setUp(): void
@@ -263,4 +263,25 @@ public function testProcessProductOptionsIfOptionsExist()
263263

264264
$this->assertEquals($cartItemMock, $this->model->processOptions($cartItemMock));
265265
}
266+
267+
/**
268+
* Checks processOptions method with the empty custom option
269+
*
270+
* @return void
271+
*/
272+
public function testProcessProductWithEmptyOption(): void
273+
{
274+
$customOption = $this->createMock(Option::class);
275+
$productMock = $this->createMock(Product::class);
276+
$productMock->method('getCustomOption')
277+
->with('attributes')
278+
->willReturn(null);
279+
$customOption->expects($this->never())
280+
->method('getValue');
281+
$cartItemMock = $this->createPartialMock(Item::class, ['getProduct']);
282+
$cartItemMock->expects($this->once())
283+
->method('getProduct')
284+
->willReturn($productMock);
285+
$this->assertEquals($cartItemMock, $this->model->processOptions($cartItemMock));
286+
}
266287
}

0 commit comments

Comments
 (0)