magento2-docker/dev/tests/integration/testsuite/Magento/Eav/Setup/AddOptionToAttributeTest.php

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