diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertAdminProductAttributeByCodeOnProductFormActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertAdminProductAttributeByCodeOnProductFormActionGroup.xml new file mode 100644 index 0000000000000..2432c974b79f4 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertAdminProductAttributeByCodeOnProductFormActionGroup.xml @@ -0,0 +1,21 @@ + + + + + + + Requires the navigation to the Product page. Provided dropdown attribute presents on the page. + + + + + + + + diff --git a/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php b/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php index 72d27152d639a..c264614b1a0cf 100644 --- a/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php +++ b/app/code/Magento/Swatches/Controller/Adminhtml/Product/Attribute/Plugin/Save.php @@ -3,18 +3,33 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\Swatches\Controller\Adminhtml\Product\Attribute\Plugin; use Magento\Catalog\Controller\Adminhtml\Product\Attribute; use Magento\Framework\App\RequestInterface; -use Magento\Swatches\Model\Swatch; +use Magento\Swatches\Model\ConvertSwatchAttributeFrontendInput; /** * Plugin for product attribute save controller. */ class Save { + /** + * @var ConvertSwatchAttributeFrontendInput + */ + private $convertSwatchAttributeFrontendInput; + + /** + * @param ConvertSwatchAttributeFrontendInput $convertSwatchAttributeFrontendInput + */ + public function __construct( + ConvertSwatchAttributeFrontendInput $convertSwatchAttributeFrontendInput + ) { + $this->convertSwatchAttributeFrontendInput = $convertSwatchAttributeFrontendInput; + } + /** * Performs the conversion of the frontend input value. * @@ -23,30 +38,12 @@ class Save * @return array * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function beforeDispatch(Attribute\Save $subject, RequestInterface $request) + public function beforeDispatch(Attribute\Save $subject, RequestInterface $request): array { $data = $request->getPostValue(); + $data = $this->convertSwatchAttributeFrontendInput->execute($data); + $request->setPostValue($data); - if (isset($data['frontend_input'])) { - switch ($data['frontend_input']) { - case 'swatch_visual': - $data[Swatch::SWATCH_INPUT_TYPE_KEY] = Swatch::SWATCH_INPUT_TYPE_VISUAL; - $data['frontend_input'] = 'select'; - $request->setPostValue($data); - break; - case 'swatch_text': - $data[Swatch::SWATCH_INPUT_TYPE_KEY] = Swatch::SWATCH_INPUT_TYPE_TEXT; - $data['use_product_image_for_swatch'] = 0; - $data['frontend_input'] = 'select'; - $request->setPostValue($data); - break; - case 'select': - $data[Swatch::SWATCH_INPUT_TYPE_KEY] = Swatch::SWATCH_INPUT_TYPE_DROPDOWN; - $data['frontend_input'] = 'select'; - $request->setPostValue($data); - break; - } - } return [$request]; } } diff --git a/app/code/Magento/Swatches/Model/ConvertSwatchAttributeFrontendInput.php b/app/code/Magento/Swatches/Model/ConvertSwatchAttributeFrontendInput.php new file mode 100644 index 0000000000000..698d0fcc4aea2 --- /dev/null +++ b/app/code/Magento/Swatches/Model/ConvertSwatchAttributeFrontendInput.php @@ -0,0 +1,46 @@ +convertSwatchAttributeFrontendInput = $convertSwatchAttributeFrontendInput; + } + + /** + * Performs the conversion of the frontend input value. + * + * @param ProductAttributeRepository $subject + * @param ProductAttributeInterface $attribute + * @return array + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function beforeSave( + ProductAttributeRepository $subject, + ProductAttributeInterface $attribute + ): array { + $data = $attribute->getData(); + $data = $this->convertSwatchAttributeFrontendInput->execute($data); + $attribute->setData($data); + + return [$attribute]; + } +} diff --git a/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml b/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml index b05c9cc9e7a9a..6070ae25f570f 100644 --- a/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml +++ b/app/code/Magento/Swatches/Test/Mftf/Data/SwatchAttributeData.xml @@ -18,4 +18,7 @@ TextSwatchAttr text_swatch_attr + + swatch_text + diff --git a/app/code/Magento/Swatches/Test/Mftf/Test/AdminCheckTextSwatchAttributeAddedViaApiTest.xml b/app/code/Magento/Swatches/Test/Mftf/Test/AdminCheckTextSwatchAttributeAddedViaApiTest.xml new file mode 100644 index 0000000000000..5e5515aa25a74 --- /dev/null +++ b/app/code/Magento/Swatches/Test/Mftf/Test/AdminCheckTextSwatchAttributeAddedViaApiTest.xml @@ -0,0 +1,44 @@ + + + + + + + + + <description value="Login as admin, create swatch text product attribute.Go to New Product page, + check the created attribute is available on the page."/> + <group value="swatches"/> + </annotations> + <before> + <!-- Login as Admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginToAdminPanel"/> + <!-- Create an attribute with two options to be used in the first child product --> + <createData entity="textSwatchProductAttribute" stepKey="createTextSwatchConfigProductAttribute"/> + <!-- Add the attribute just created to default attribute set --> + <createData entity="AddToDefaultSet" stepKey="createConfigAddToAttributeSet"> + <requiredEntity createDataKey="createTextSwatchConfigProductAttribute"/> + </createData> + </before> + <after> + <!-- Delete Created Data --> + <deleteData createDataKey="createTextSwatchConfigProductAttribute" stepKey="deleteAttribute"/> + <actionGroup ref="logout" stepKey="logout"/> + <!-- Reindex invalidated indices after product attribute has been created/deleted --> + <actionGroup ref="CliRunReindexUsingCronJobsActionGroup" stepKey="reindexInvalidatedIndices"/> + </after> + + <!-- Open the new simple product page --> + <actionGroup ref="AdminOpenNewProductFormPageActionGroup" stepKey="openNewProductPage"/> + <!-- Check created attribute presents on the page --> + <actionGroup ref="AssertAdminProductAttributeByCodeOnProductFormActionGroup" stepKey="checkTextSwatchConfigProductAttributeOnThePage"> + <argument name="productAttributeCode" value="$createTextSwatchConfigProductAttribute.attribute_code$"/> + </actionGroup> + </test> +</tests> diff --git a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php b/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php deleted file mode 100644 index c9c826b3a7831..0000000000000 --- a/app/code/Magento/Swatches/Test/Unit/Controller/Adminhtml/Product/Attribute/Plugin/SaveTest.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Swatches\Test\Unit\Controller\Adminhtml\Product\Attribute\Plugin; - -class SaveTest extends \PHPUnit\Framework\TestCase -{ - /** - * @dataProvider dataRequest - */ - public function testBeforeDispatch($dataRequest, $runTimes) - { - $subject = $this->createMock(\Magento\Catalog\Controller\Adminhtml\Product\Attribute\Save::class); - $request = $this->createPartialMock(\Magento\Framework\App\RequestInterface::class, [ - 'getPostValue', - 'setPostValue', - 'getModuleName', - 'setModuleName', - 'getActionName', - 'setActionName', - 'getParam', - 'setParams', - 'getParams', - 'getCookie', - 'isSecure' - ]); - - $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $controller = $objectManager->getObject( - \Magento\Swatches\Controller\Adminhtml\Product\Attribute\Plugin\Save::class - ); - - $request->expects($this->once())->method('getPostValue')->willReturn($dataRequest); - $request->expects($this->exactly($runTimes))->method('setPostValue')->willReturn($this->returnSelf()); - - $controller->beforeDispatch($subject, $request); - } - - /** - * @return array - */ - public function dataRequest() - { - return [ - [ - ['frontend_input' => 'swatch_visual'], - 1 - ], - [ - ['frontend_input' => 'swatch_text'], - 1 - ], - [ - ['frontend_input' => 'select'], - 1 - ], - [ - [], - 0 - ], - [ - null, - 0 - ], - ]; - } -} diff --git a/app/code/Magento/Swatches/Test/Unit/Model/ConvertSwatchAttributeFrontendInputTest.php b/app/code/Magento/Swatches/Test/Unit/Model/ConvertSwatchAttributeFrontendInputTest.php new file mode 100644 index 0000000000000..1d27a33e5c244 --- /dev/null +++ b/app/code/Magento/Swatches/Test/Unit/Model/ConvertSwatchAttributeFrontendInputTest.php @@ -0,0 +1,86 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Swatches\Test\Unit\Model; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Swatches\Model\Swatch; +use Magento\Swatches\Model\ConvertSwatchAttributeFrontendInput; + +/** + * Tests for \Magento\Swatches\Model\ConvertSwatchAttributeFrontendInput. + */ +class ConvertSwatchAttributeFrontendInputTest extends \PHPUnit\Framework\TestCase +{ + /** + * @var ConvertSwatchAttributeFrontendInput + */ + private $convertSwatchAttributeFrontendInput; + + /** + * @inheritdoc + */ + protected function setUp() + { + $objectManager = new ObjectManager($this); + $this->convertSwatchAttributeFrontendInput = + $objectManager->getObject(ConvertSwatchAttributeFrontendInput::class); + } + + /** + * @dataProvider attributeData + */ + public function testExecute($inputData, $outputData) + { + $result = $this->convertSwatchAttributeFrontendInput->execute($inputData); + $this->assertEquals($outputData, $result); + } + + /** + * @return array + */ + public function attributeData() + { + return [ + [ + [ + 'frontend_input' => 'swatch_visual' + ], + [ + 'frontend_input' => 'select', + Swatch::SWATCH_INPUT_TYPE_KEY => Swatch::SWATCH_INPUT_TYPE_VISUAL, + ] + ], + [ + [ + 'frontend_input' => 'swatch_text' + ], + [ + 'frontend_input' => 'select', + Swatch::SWATCH_INPUT_TYPE_KEY => Swatch::SWATCH_INPUT_TYPE_TEXT, + 'use_product_image_for_swatch' => 0 + ] + ], + [ + [ + 'frontend_input' => 'select' + ], + [ + 'frontend_input' => 'select', + Swatch::SWATCH_INPUT_TYPE_KEY => Swatch::SWATCH_INPUT_TYPE_DROPDOWN, + ] + ], + [ + [], + [] + ], + [ + null, + null + ], + ]; + } +} diff --git a/app/code/Magento/Swatches/etc/webapi_rest/di.xml b/app/code/Magento/Swatches/etc/webapi_rest/di.xml new file mode 100644 index 0000000000000..f05b9727db28a --- /dev/null +++ b/app/code/Magento/Swatches/etc/webapi_rest/di.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> + <type name="Magento\Catalog\Model\Product\Attribute\Repository"> + <plugin name="swatches_product_attribute_repository_plugin" type="Magento\Swatches\Plugin\Catalog\Model\Product\Attribute\RepositoryPlugin"/> + </type> +</config>