Skip to content

Commit 75f4bfb

Browse files
committed
Merge remote-tracking branch 'origin/ACP2E-4057' into PR_2025_09_08_muntianu
2 parents 27147ce + 443cbb1 commit 75f4bfb

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

app/code/Magento/CatalogImportExport/Model/Import/Product/Validator.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,34 @@ public function isRequiredAttributeValid($attrCode, array $attributeParams, arra
194194
}
195195

196196
if ($doCheck === true) {
197-
return isset($rowData[$attrCode])
198-
&& strlen(trim($rowData[$attrCode]))
199-
&& trim($rowData[$attrCode]) !== $this->context->getEmptyAttributeValueConstant();
197+
return $this->validateRequiredAttributeValue($attrCode, $rowData);
200198
}
201199
return true;
202200
}
203201

202+
/**
203+
* Validate required attribute value for both array and string types.
204+
*
205+
* @param string $attrCode
206+
* @param array $rowData
207+
* @return bool
208+
*/
209+
private function validateRequiredAttributeValue(string $attrCode, array $rowData): bool
210+
{
211+
$emptyConstant = $this->context->getEmptyAttributeValueConstant();
212+
if (isset($rowData[$attrCode]) && is_array($rowData[$attrCode])) {
213+
$trimmedValues = array_map('trim', $rowData[$attrCode]);
214+
$filteredArray = array_filter($trimmedValues, function ($value) {
215+
return !empty($value);
216+
});
217+
return !empty($filteredArray)
218+
&& !in_array($emptyConstant, $trimmedValues, true);
219+
}
220+
return isset($rowData[$attrCode])
221+
&& strlen(trim($rowData[$attrCode]))
222+
&& trim($rowData[$attrCode]) !== $emptyConstant;
223+
}
224+
204225
/**
205226
* Is attribute valid
206227
*

app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/Product/ValidatorTest.php

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ protected function setUp(): void
5656
$entityTypeModel->expects($this->any())->method('retrieveAttributeFromCache')->willReturn([]);
5757
$this->context = $this->createPartialMock(
5858
Product::class,
59-
['retrieveProductTypeByName', 'retrieveMessageTemplate', 'getBehavior', 'getMultipleValueSeparator']
59+
[
60+
'retrieveProductTypeByName',
61+
'retrieveMessageTemplate',
62+
'getBehavior',
63+
'getMultipleValueSeparator',
64+
'getEmptyAttributeValueConstant'
65+
]
6066
);
6167
$this->context->expects($this->any())->method('retrieveProductTypeByName')->willReturn($entityTypeModel);
6268
$this->context->expects($this->any())->method('retrieveMessageTemplate')->willReturn('error message');
@@ -281,4 +287,38 @@ public function testInit()
281287
$this->validatorTwo->expects($this->once())->method('init');
282288
$this->validator->init(null);
283289
}
290+
291+
/**
292+
* Test required multi-select attribute validation with array values.
293+
*
294+
* @return void
295+
*/
296+
public function testIsRequiredAttributeValidWithMultiSelectArray()
297+
{
298+
$this->context->expects($this->any())->method('getBehavior')->willReturn(Import::BEHAVIOR_APPEND);
299+
$this->context->expects($this->any())->method('getEmptyAttributeValueConstant')->willReturn('__EMPTY__');
300+
$attrCode = 'required_multiselect_attribute';
301+
$attributeParams = ['is_required' => true];
302+
$rowData = [
303+
'product_type' => 'simple',
304+
'required_multiselect_attribute' => ['option1', 'option2']
305+
];
306+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
307+
$this->assertTrue($result);
308+
$rowData['required_multiselect_attribute'] = [];
309+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
310+
$this->assertFalse($result);
311+
$rowData['required_multiselect_attribute'] = ['option1', '', 'option2'];
312+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
313+
$this->assertTrue($result);
314+
$rowData['required_multiselect_attribute'] = ['option1', ' ', 'option2'];
315+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
316+
$this->assertTrue($result);
317+
$rowData['required_multiselect_attribute'] = ['option1', '__EMPTY__', 'option2'];
318+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
319+
$this->assertFalse($result);
320+
unset($rowData['required_multiselect_attribute']);
321+
$result = $this->validator->isRequiredAttributeValid($attrCode, $attributeParams, $rowData);
322+
$this->assertFalse($result);
323+
}
284324
}

0 commit comments

Comments
 (0)