From 41e9ec05e7b7330ff0ee0d278e1012527d9889b5 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky
Date: Wed, 15 Nov 2017 14:43:29 +0200
Subject: [PATCH 1/2] magento/magento2#12083: Cannot import zero (0) value into
custom attribute
---
.../Import/Product/Type/AbstractType.php | 2 +-
.../Import/Product/Type/AbstractTest.php | 74 ++++++++++++++-----
.../Model/Import/_files/custom_attributes.php | 40 ++++++++++
.../_files/custom_attributes_rollback.php | 20 +++++
4 files changed, 118 insertions(+), 18 deletions(-)
create mode 100644 dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes.php
create mode 100644 dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes_rollback.php
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
index 5681b1aa6607d..939d6b2de67ee 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
+++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractType.php
@@ -534,7 +534,7 @@ public function prepareAttributesWithDefaultValueForSave(array $rowData, $withDe
public function clearEmptyData(array $rowData)
{
foreach ($this->_getProductAttributes($rowData) as $attrCode => $attrParams) {
- if (!$attrParams['is_static'] && empty($rowData[$attrCode])) {
+ if (!$attrParams['is_static'] && !isset($rowData[$attrCode])) {
unset($rowData[$attrCode]);
}
}
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php
index 8860c12f0f983..ff07963d0e3ad 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php
@@ -12,20 +12,25 @@ class AbstractTest extends \PHPUnit\Framework\TestCase
*/
protected $_model;
+ /**
+ * @var \Magento\TestFramework\ObjectManager
+ */
+ private $objectManager;
+
/**
* On product import abstract class methods level it doesn't matter what product type is using.
* That is why current tests are using simple product entity type by default
*/
protected function setUp()
{
- $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
- $params = [$objectManager->create(\Magento\CatalogImportExport\Model\Import\Product::class), 'simple'];
+ $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+ $params = [$this->objectManager->create(\Magento\CatalogImportExport\Model\Import\Product::class), 'simple'];
$this->_model = $this->getMockForAbstractClass(
\Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType::class,
[
- $objectManager->get(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory::class),
- $objectManager->get(\Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory::class),
- $objectManager->get(\Magento\Framework\App\ResourceConnection::class),
+ $this->objectManager->get(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory::class),
+ $this->objectManager->get(\Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory::class),
+ $this->objectManager->get(\Magento\Framework\App\ResourceConnection::class),
$params
]
);
@@ -130,6 +135,11 @@ public function prepareAttributesWithDefaultValueForSaveDataProvider()
}
/**
+ * Test cleaning imported attribute data from empty values (note '0' is not empty).
+ *
+ * @magentoDbIsolation enabled
+ * @magentoAppIsolation enabled
+ * @magentoDataFixture Magento/CatalogImportExport/Model/Import/_files/custom_attributes.php
* @dataProvider clearEmptyDataDataProvider
*/
public function testClearEmptyData($rowData, $expectedAttributes)
@@ -141,8 +151,14 @@ public function testClearEmptyData($rowData, $expectedAttributes)
}
}
+ /**
+ * Data provider for testClearEmptyData.
+ *
+ * @return array
+ */
public function clearEmptyDataDataProvider()
{
+ // We use sku attribute to test static attributes.
return [
[
[
@@ -152,6 +168,7 @@ public function clearEmptyDataDataProvider()
'product_type' => 'simple',
'name' => 'Simple 01',
'price' => 10,
+ 'test_attribute' => '1',
],
[
'sku' => 'simple1',
@@ -159,26 +176,49 @@ public function clearEmptyDataDataProvider()
'_attribute_set' => 'Default',
'product_type' => 'simple',
'name' => 'Simple 01',
- 'price' => 10
+ 'price' => 10,
+ 'test_attribute' => '1',
],
],
[
[
- 'sku' => '',
- 'store_view_code' => 'German',
+ 'sku' => '0',
+ 'store_view_code' => '',
'_attribute_set' => 'Default',
- 'product_type' => '',
- 'name' => 'Simple 01 German',
- 'price' => '',
+ 'product_type' => 'simple',
+ 'name' => 'Simple 01',
+ 'price' => 10,
+ 'test_attribute' => '0',
],
[
- 'sku' => '',
- 'store_view_code' => 'German',
+ 'sku' => '0',
+ 'store_view_code' => '',
'_attribute_set' => 'Default',
- 'product_type' => '',
- 'name' => 'Simple 01 German'
- ]
- ]
+ 'product_type' => 'simple',
+ 'name' => 'Simple 01',
+ 'price' => 10,
+ 'test_attribute' => '0',
+ ],
+ ],
+ [
+ [
+ 'sku' => null,
+ 'store_view_code' => '',
+ '_attribute_set' => 'Default',
+ 'product_type' => 'simple',
+ 'name' => 'Simple 01',
+ 'price' => 10,
+ 'test_attribute' => null,
+ ],
+ [
+ 'sku' => null,
+ 'store_view_code' => '',
+ '_attribute_set' => 'Default',
+ 'product_type' => 'simple',
+ 'name' => 'Simple 01',
+ 'price' => 10,
+ ],
+ ],
];
}
}
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes.php
new file mode 100644
index 0000000000000..82c22594f30aa
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes.php
@@ -0,0 +1,40 @@
+create(\Magento\Eav\Model\Entity\Type::class);
+$entityType->loadByCode('catalog_product');
+$entityTypeId = $entityType->getId();
+
+/** @var \Magento\Eav\Model\Entity\Attribute\Set $attributeSet */
+$attributeSet = $objectManager->create(\Magento\Eav\Model\Entity\Attribute\Set::class);
+$attributeSet->load('default', 'attribute_set_name');
+$attributeSetId = $attributeSet->getId();
+
+$attributeGroupId = $attributeSet->getDefaultGroupId($entityType->getDefaultAttributeSetId());
+
+$attributeData = [
+ [
+ 'attribute_code' => 'test_attribute',
+ 'entity_type_id' => $entityTypeId,
+ 'backend_type' => 'varchar',
+ 'is_required' => 1,
+ 'is_user_defined' => 1,
+ 'is_unique' => 0,
+ 'attribute_set_id' => $attributeSetId,
+ 'attribute_group_id' => $attributeGroupId,
+ ],
+];
+
+foreach ($attributeData as $data) {
+ /** @var \Magento\Eav\Model\Entity\Attribute $attribute */
+ $attribute = $objectManager->create(\Magento\Eav\Model\Entity\Attribute::class);
+ $attribute->setData($data);
+ $attribute->setIsStatic(true);
+ $attribute->save();
+}
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes_rollback.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes_rollback.php
new file mode 100644
index 0000000000000..f3afb096347ed
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/_files/custom_attributes_rollback.php
@@ -0,0 +1,20 @@
+create(\Magento\Eav\Model\Entity\Attribute::class);
+ $attribute->loadByCode('catalog_product', $attributeCode);
+ if ($attribute->getId()) {
+ $attribute->delete();
+ }
+}
From 89d613c1da1c7a054fc256df3fda206ff32bd458 Mon Sep 17 00:00:00 2001
From: Pavel Bystritsky
Date: Wed, 15 Nov 2017 15:23:59 +0200
Subject: [PATCH 2/2] magento/magento2#12083: Cannot import zero (0) value into
custom attribute
---
.../Model/Import/Product/Type/AbstractTest.php | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php
index ff07963d0e3ad..862ecb4cbe028 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/Product/Type/AbstractTest.php
@@ -28,9 +28,15 @@ protected function setUp()
$this->_model = $this->getMockForAbstractClass(
\Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType::class,
[
- $this->objectManager->get(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory::class),
- $this->objectManager->get(\Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory::class),
- $this->objectManager->get(\Magento\Framework\App\ResourceConnection::class),
+ $this->objectManager->get(
+ \Magento\Eav\Model\ResourceModel\Entity\Attribute\Set\CollectionFactory::class
+ ),
+ $this->objectManager->get(
+ \Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory::class
+ ),
+ $this->objectManager->get(
+ \Magento\Framework\App\ResourceConnection::class
+ ),
$params
]
);