244 lines
7.7 KiB
PHP
Executable File
244 lines
7.7 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Eav\Setup;
|
|
|
|
use Magento\Catalog\Model\Product;
|
|
use Magento\Eav\Api\AttributeRepositoryInterface;
|
|
use Magento\Eav\Api\Data\AttributeInterface;
|
|
use Magento\Eav\Api\Data\AttributeOptionInterface;
|
|
use Magento\Framework\App\ObjectManager;
|
|
use Magento\Framework\Setup\ModuleDataSetupInterface;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Tests coverage for \Magento\Eav\Setup\AddOptionToAttribute
|
|
*/
|
|
class AddOptionToAttributeTest extends TestCase
|
|
{
|
|
/**
|
|
* @var AddOptionToAttribute
|
|
*/
|
|
private $operation;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
private $attributeId;
|
|
|
|
/**
|
|
* @var EavSetup
|
|
*/
|
|
private $eavSetup;
|
|
|
|
/**
|
|
* @var AttributeRepositoryInterface
|
|
*/
|
|
private $attrRepo;
|
|
|
|
/**
|
|
* @var ModuleDataSetupInterface
|
|
*/
|
|
private $setup;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$objectManager = ObjectManager::getInstance();
|
|
|
|
$this->operation = $objectManager->get(AddOptionToAttribute::class);
|
|
/** @var ModuleDataSetupInterface $setup */
|
|
$this->setup = $objectManager->get(ModuleDataSetupInterface::class);
|
|
/** @var AttributeRepositoryInterface attrRepo */
|
|
$this->attrRepo = $objectManager->get(AttributeRepositoryInterface::class);
|
|
/** @var EavSetup $eavSetup */
|
|
$this->eavSetup = $objectManager->get(EavSetupFactory::class)
|
|
->create(['setup' => $this->setup]);
|
|
$this->attributeId = $this->eavSetup->getAttributeId(Product::ENTITY, 'zzz');
|
|
}
|
|
|
|
/**
|
|
* @param bool $fetchPairs
|
|
*
|
|
* @return array
|
|
*/
|
|
private function getAttributeOptions($fetchPairs = true): array
|
|
{
|
|
$optionTable = $this->setup->getTable('eav_attribute_option');
|
|
$optionValueTable = $this->setup->getTable('eav_attribute_option_value');
|
|
|
|
$select = $this->setup
|
|
->getConnection()
|
|
->select()
|
|
->from(['o' => $optionTable])
|
|
->reset('columns')
|
|
->columns('sort_order')
|
|
->join(['ov' => $optionValueTable], 'o.option_id = ov.option_id', 'value')
|
|
->where(AttributeInterface::ATTRIBUTE_ID . ' = ?', $this->attributeId)
|
|
->where('store_id = 0');
|
|
|
|
return $fetchPairs
|
|
? $this->setup->getConnection()->fetchPairs($select)
|
|
: $this->setup->getConnection()->fetchAll($select);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Eav/_files/attribute_with_options.php
|
|
*/
|
|
public function testAddNewOptions()
|
|
{
|
|
$optionsBefore = $this->getAttributeOptions(false);
|
|
$this->operation->execute(
|
|
[
|
|
'values' => ['new1', 'new2'],
|
|
'attribute_id' => $this->attributeId
|
|
]
|
|
);
|
|
$optionsAfter = $this->getAttributeOptions(false);
|
|
$this->assertEquals(count($optionsBefore) + 2, count($optionsAfter));
|
|
foreach ($optionsBefore as $option) {
|
|
$this->assertContainsEquals($option, $optionsAfter);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Eav/_files/attribute_with_options.php
|
|
*/
|
|
public function testAddExistingOptionsWithTheSameSortOrder()
|
|
{
|
|
$optionsBefore = $this->getAttributeOptions();
|
|
$this->operation->execute(
|
|
[
|
|
'values' => ['Black', 'White'],
|
|
'attribute_id' => $this->attributeId
|
|
]
|
|
);
|
|
$optionsAfter = $this->getAttributeOptions();
|
|
$this->assertEquals(count($optionsBefore), count($optionsAfter));
|
|
foreach ($optionsBefore as $option) {
|
|
$this->assertContainsEquals($option, $optionsAfter);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Eav/_files/attribute_with_options.php
|
|
*/
|
|
public function testAddExistingOptionsWithDifferentSortOrder()
|
|
{
|
|
$optionsBefore = $this->getAttributeOptions();
|
|
$this->operation->execute(
|
|
[
|
|
'values' => [666 => 'White', 777 => 'Black'],
|
|
'attribute_id' => $this->attributeId
|
|
]
|
|
);
|
|
$optionsAfter = $this->getAttributeOptions();
|
|
$this->assertSameSize($optionsBefore, array_intersect($optionsBefore, $optionsAfter));
|
|
$this->assertEquals($optionsAfter[777], $optionsBefore[0]);
|
|
$this->assertEquals($optionsAfter[666], $optionsBefore[1]);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Eav/_files/attribute_with_options.php
|
|
*/
|
|
public function testAddMixedOptions()
|
|
{
|
|
$sizeBefore = count($this->getAttributeOptions());
|
|
$this->operation->execute(
|
|
[
|
|
'values' => [666 => 'Black', 'NewOption'],
|
|
'attribute_id' => $this->attributeId
|
|
]
|
|
);
|
|
$updatedOptions = $this->getAttributeOptions();
|
|
$this->assertEquals(count($updatedOptions), $sizeBefore + 1);
|
|
$this->assertEquals($updatedOptions[666], 'Black');
|
|
$this->assertEquals($updatedOptions[667], 'NewOption');
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Eav/_files/attribute_with_options.php
|
|
*/
|
|
public function testAddNewOption()
|
|
{
|
|
$sizeBefore = count($this->getAttributeOptions());
|
|
|
|
$this->operation->execute(
|
|
[
|
|
'attribute_id' => $this->attributeId,
|
|
'order' => [0 => 13],
|
|
'value' => [
|
|
[
|
|
0 => 'NewOption',
|
|
],
|
|
],
|
|
]
|
|
);
|
|
$updatedOptions = $this->getAttributeOptions();
|
|
$this->assertEquals(count($updatedOptions), $sizeBefore + 1);
|
|
$this->assertEquals($updatedOptions[13], 'NewOption');
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Eav/_files/attribute_with_options.php
|
|
*/
|
|
public function testDeleteOption()
|
|
{
|
|
$optionsBefore = $this->getAttributeOptions();
|
|
$options = $this->attrRepo->get(Product::ENTITY, $this->attributeId)->getOptions();
|
|
/** @var AttributeOptionInterface $optionToDelete */
|
|
$optionToDelete = end($options);
|
|
$this->operation->execute(
|
|
[
|
|
'attribute_id' => $this->attributeId,
|
|
'delete' => [$optionToDelete->getValue() => true],
|
|
'value' => [
|
|
$optionToDelete->getValue() => null,
|
|
],
|
|
]
|
|
);
|
|
$updatedOptions = $this->getAttributeOptions();
|
|
$this->assertEquals(count($updatedOptions), count($optionsBefore) - 1);
|
|
foreach ($updatedOptions as $option) {
|
|
$this->assertContainsEquals($option, $optionsBefore);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Eav/_files/attribute_with_options.php
|
|
*/
|
|
public function testUpdateOption()
|
|
{
|
|
$optionsBefore = $this->getAttributeOptions();
|
|
$this->operation->execute(
|
|
[
|
|
'attribute_id' => $this->attributeId,
|
|
'value' => [
|
|
0 => ['updatedValue'],
|
|
],
|
|
]
|
|
);
|
|
$optionsAfter = $this->getAttributeOptions();
|
|
$this->assertEquals($optionsAfter[0], 'updatedValue');
|
|
$this->assertSame(array_slice($optionsBefore, 1), array_slice($optionsAfter, 1));
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
protected function tearDown(): void
|
|
{
|
|
parent::tearDown();
|
|
$reflection = new \ReflectionObject($this);
|
|
foreach ($reflection->getProperties() as $property) {
|
|
if (!$property->isStatic() && 0 !== strpos($property->getDeclaringClass()->getName(), 'PHPUnit')) {
|
|
$property->setAccessible(true);
|
|
$property->setValue($this, null);
|
|
}
|
|
}
|
|
}
|
|
}
|