Skip to content

Commit 86fb020

Browse files
merge magento/2.3-develop into magento-epam/EPAM-PR-46
2 parents cb0bb38 + 60e3a73 commit 86fb020

30 files changed

+542
-36
lines changed

app/code/Magento/Catalog/Block/Adminhtml/Category/Tree.php

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public function __construct(
7171
}
7272

7373
/**
74-
* @return void
74+
* @inheritdoc
7575
*/
7676
protected function _construct()
7777
{
@@ -80,7 +80,7 @@ protected function _construct()
8080
}
8181

8282
/**
83-
* @return $this
83+
* @inheritdoc
8484
*/
8585
protected function _prepareLayout()
8686
{
@@ -182,6 +182,8 @@ public function getSuggestedCategoriesJson($namePart)
182182
}
183183

184184
/**
185+
* Get add root button html
186+
*
185187
* @return string
186188
*/
187189
public function getAddRootButtonHtml()
@@ -190,6 +192,8 @@ public function getAddRootButtonHtml()
190192
}
191193

192194
/**
195+
* Get add sub button html
196+
*
193197
* @return string
194198
*/
195199
public function getAddSubButtonHtml()
@@ -198,6 +202,8 @@ public function getAddSubButtonHtml()
198202
}
199203

200204
/**
205+
* Get expand button html
206+
*
201207
* @return string
202208
*/
203209
public function getExpandButtonHtml()
@@ -206,6 +212,8 @@ public function getExpandButtonHtml()
206212
}
207213

208214
/**
215+
* Get collapse button html
216+
*
209217
* @return string
210218
*/
211219
public function getCollapseButtonHtml()
@@ -214,6 +222,8 @@ public function getCollapseButtonHtml()
214222
}
215223

216224
/**
225+
* Get store switcher
226+
*
217227
* @return string
218228
*/
219229
public function getStoreSwitcherHtml()
@@ -222,6 +232,8 @@ public function getStoreSwitcherHtml()
222232
}
223233

224234
/**
235+
* Get loader tree url
236+
*
225237
* @param bool|null $expanded
226238
* @return string
227239
*/
@@ -235,6 +247,8 @@ public function getLoadTreeUrl($expanded = null)
235247
}
236248

237249
/**
250+
* Get nodes url
251+
*
238252
* @return string
239253
*/
240254
public function getNodesUrl()
@@ -243,6 +257,8 @@ public function getNodesUrl()
243257
}
244258

245259
/**
260+
* Get switcher tree url
261+
*
246262
* @return string
247263
*/
248264
public function getSwitchTreeUrl()
@@ -254,6 +270,8 @@ public function getSwitchTreeUrl()
254270
}
255271

256272
/**
273+
* Get is was expanded
274+
*
257275
* @return bool
258276
* @SuppressWarnings(PHPMD.BooleanGetMethodName)
259277
*/
@@ -263,6 +281,8 @@ public function getIsWasExpanded()
263281
}
264282

265283
/**
284+
* Get move url
285+
*
266286
* @return string
267287
*/
268288
public function getMoveUrl()
@@ -271,6 +291,8 @@ public function getMoveUrl()
271291
}
272292

273293
/**
294+
* Get tree
295+
*
274296
* @param mixed|null $parenNodeCategory
275297
* @return array
276298
*/
@@ -282,6 +304,8 @@ public function getTree($parenNodeCategory = null)
282304
}
283305

284306
/**
307+
* Get tree json
308+
*
285309
* @param mixed|null $parenNodeCategory
286310
* @return string
287311
*/
@@ -367,7 +391,7 @@ protected function _getNodeJson($node, $level = 0)
367391
}
368392
}
369393

370-
if ($isParent || $node->getLevel() < 2) {
394+
if ($isParent || $node->getLevel() < 1) {
371395
$item['expanded'] = true;
372396
}
373397

@@ -390,6 +414,8 @@ public function buildNodeName($node)
390414
}
391415

392416
/**
417+
* Is category movable
418+
*
393419
* @param Node|array $node
394420
* @return bool
395421
*/
@@ -403,6 +429,8 @@ protected function _isCategoryMoveable($node)
403429
}
404430

405431
/**
432+
* Is parent selected category
433+
*
406434
* @param Node|array $node
407435
* @return bool
408436
*/

app/code/Magento/Catalog/Model/Product/Option/SaveHandler.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Catalog\Model\Product\Option;
79

810
use Magento\Catalog\Api\ProductCustomOptionRepositoryInterface as OptionRepository;
@@ -58,11 +60,26 @@ public function execute($entity, $arguments = [])
5860
}
5961
}
6062
if ($options) {
61-
foreach ($options as $option) {
62-
$this->optionRepository->save($option);
63-
}
63+
$this->processOptionsSaving($options, (bool)$entity->dataHasChangedFor('sku'), (string)$entity->getSku());
6464
}
6565

6666
return $entity;
6767
}
68+
69+
/**
70+
* Save custom options
71+
*
72+
* @param array $options
73+
* @param bool $hasChangedSku
74+
* @param string $newSku
75+
*/
76+
private function processOptionsSaving(array $options, bool $hasChangedSku, string $newSku)
77+
{
78+
foreach ($options as $option) {
79+
if ($hasChangedSku && $option->hasData('product_sku')) {
80+
$option->setProductSku($newSku);
81+
}
82+
$this->optionRepository->save($option);
83+
}
84+
}
6885
}

app/code/Magento/Catalog/Test/Mftf/ActionGroup/CustomOptionsActionGroup.xml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,51 @@
5252
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceType('0')}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
5353
<fillField selector="{{AdminProductCustomizableOptionsSection.optionFileExtensions('0')}}" userInput="{{option.file_extension}}" stepKey="fillCompatibleExtensions"/>
5454
</actionGroup>
55+
<actionGroup name="AddProductCustomOptionField">
56+
<arguments>
57+
<argument name="option" defaultValue="ProductOptionField"/>
58+
<argiment name="optionIndex" type="string"/>
59+
</arguments>
60+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.addOptionBtn}}" visible="false" stepKey="openCustomOptionSection"/>
61+
<click selector="{{AdminProductCustomizableOptionsSection.addOptionBtn}}" stepKey="clickAddOption"/>
62+
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" stepKey="waitForOption"/>
63+
<fillField selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" userInput="{{option.title}}" stepKey="fillTitle"/>
64+
<click selector="{{AdminProductCustomizableOptionsSection.lastOptionTypeParent}}" stepKey="openTypeSelect"/>
65+
<click selector="{{AdminProductCustomizableOptionsSection.optionType('Field')}}" stepKey="selectTypeFile"/>
66+
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPrice(optionIndex)}}" stepKey="waitForElements"/>
67+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPrice(optionIndex)}}" userInput="{{option.price}}" stepKey="fillPrice"/>
68+
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceType(optionIndex)}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
69+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionSku(optionIndex)}}" userInput="{{option.title}}" stepKey="fillSku"/>
70+
</actionGroup>
71+
<actionGroup name="importProductCustomizableOptions">
72+
<arguments>
73+
<argument name="productName" type="string"/>
74+
</arguments>
75+
<click selector="{{AdminProductCustomizableOptionsSection.importOptions}}" stepKey="clickImportOptions"/>
76+
<waitForElementVisible selector="{{AdminProductImportOptionsSection.selectProductTitle}}" stepKey="waitForTitleVisible"/>
77+
<conditionalClick selector="{{AdminProductImportOptionsSection.resetFiltersButton}}" dependentSelector="{{AdminProductImportOptionsSection.resetFiltersButton}}" visible="true" stepKey="clickResetFilters"/>
78+
<click selector="{{AdminProductImportOptionsSection.filterButton}}" stepKey="clickFilterButton"/>
79+
<waitForElementVisible selector="{{AdminProductImportOptionsSection.nameField}}" stepKey="waitForNameField"/>
80+
<fillField selector="{{AdminProductImportOptionsSection.nameField}}" userInput="{{productName}}" stepKey="fillProductName"/>
81+
<click selector="{{AdminProductImportOptionsSection.applyFiltersButton}}" stepKey="clickApplyFilters"/>
82+
<checkOption selector="{{AdminProductImportOptionsSection.firstRowItemCheckbox}}" stepKey="checkProductCheckbox"/>
83+
<click selector="{{AdminProductImportOptionsSection.importButton}}" stepKey="clickImport"/>
84+
</actionGroup>
85+
<actionGroup name="resetImportOptionFilter">
86+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.addOptionBtn}}" visible="false" stepKey="openCustomOptionSection"/>
87+
<click selector="{{AdminProductCustomizableOptionsSection.importOptions}}" stepKey="clickImportOptions"/>
88+
<click selector="{{AdminProductImportOptionsSection.resetFiltersButton}}" stepKey="clickResetFilterButton"/>
89+
</actionGroup>
90+
<actionGroup name="checkCustomizableOptionImport">
91+
<arguments>
92+
<argument name="option" defaultValue="ProductOptionField"/>
93+
<argiment name="optionIndex" type="string"/>
94+
</arguments>
95+
<grabValueFrom selector="{{AdminProductCustomizableOptionsSection.optionTitleInput(optionIndex)}}" stepKey="grabOptionTitle"/>
96+
<grabValueFrom selector="{{AdminProductCustomizableOptionsSection.optionPrice(optionIndex)}}" stepKey="grabOptionPrice"/>
97+
<grabValueFrom selector="{{AdminProductCustomizableOptionsSection.optionSku(optionIndex)}}" stepKey="grabOptionSku"/>
98+
<assertEquals expected="{{option.title}}" expectedType="string" actual="$grabOptionTitle" stepKey="assertOptionTitle"/>
99+
<assertEquals expected="{{option.price}}" expectedType="string" actual="$grabOptionPrice" stepKey="assertOptionPrice"/>
100+
<assertEquals expected="{{option.title}}" expectedType="string" actual="$grabOptionSku" stepKey="assertOptionSku"/>
101+
</actionGroup>
55102
</actionGroups>

app/code/Magento/Catalog/Test/Mftf/Data/ConstData.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@
1313
<data key="one">1</data>
1414
<data key="two">2</data>
1515
</entity>
16+
<entity name="prodNameWithSpecChars">
17+
<data key="trademark">"Pursuit Lumaflex™ Tone Band"</data>
18+
<data key="skumark">"x™"</data>
19+
</entity>
1620
</entities>

app/code/Magento/Catalog/Test/Mftf/Data/ProductData.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
<requiredEntity type="product_extension_attribute">EavStockItem</requiredEntity>
3636
<requiredEntity type="custom_attribute_array">CustomAttributeCategoryIds</requiredEntity>
3737
</entity>
38+
<entity name="ApiSimpleProductWithSpecCharInName" type="product" extends="ApiSimpleProduct">
39+
<data key="name">Pursuit Lumaflex&#38;trade; Tone Band</data>
40+
<data key="sku" unique="suffix">x&#38;trade;</data>
41+
</entity>
3842
<entity name="ApiSimpleProductWithCustomPrice" type="product" extends="ApiSimpleProduct">
3943
<data key="price">100</data>
4044
</entity>

app/code/Magento/Catalog/Test/Mftf/Section/AdminCategorySidebarTreeSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@
1616
<element name="categoryInTreeUnderRoot" type="text" selector="//li/ul/li[@class='x-tree-node']/div/a/span[contains(text(), '{{name}}')]" parameterized="true"/>
1717
<element name="lastCreatedCategory" type="block" selector=".x-tree-root-ct li li:last-child" />
1818
<element name="treeContainer" type="block" selector=".tree-holder" />
19+
<element name="expandRootCategory" type="text" selector="img.x-tree-elbow-end-plus"/>
1920
</section>
2021
</sections>

app/code/Magento/Catalog/Test/Mftf/Section/AdminProductCustomizableOptionsSection.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,15 @@
4545
<element name="optionPriceType" type="select" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr//*[@name='product[options][{{var}}][price_type]']" parameterized="true"/>
4646
<element name="optionSku" type="input" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr//*[@name='product[options][{{index}}][sku]']" parameterized="true"/>
4747
<element name="optionFileExtensions" type="input" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr//*[@name='product[options][{{index}}][file_extension]']" parameterized="true"/>
48+
<element name="importOptions" type="button" selector="//button[@data-index='button_import']" timeout="30"/>
4849
</section>
49-
</sections>
50+
<section name="AdminProductImportOptionsSection">
51+
<element name="selectProductTitle" type="text" selector="//h1[contains(text(), 'Select Product')]" timeout="30"/>
52+
<element name="filterButton" type="button" selector="//button[@data-action='grid-filter-expand']" timeout="30"/>
53+
<element name="nameField" type="input" selector="//input[@name='name']" timeout="30"/>
54+
<element name="applyFiltersButton" type="button" selector="//button[@data-action='grid-filter-apply']" timeout="30"/>
55+
<element name="resetFiltersButton" type="button" selector="//button[@data-action='grid-filter-reset']" timeout="30"/>
56+
<element name="firstRowItemCheckbox" type="input" selector="//input[@data-action='select-row']" timeout="30"/>
57+
<element name="importButton" type="button" selector="//button[contains(@class, 'action-primary')]/span[contains(text(), 'Import')]" timeout="30"/>
58+
</section>
59+
</sections>

app/code/Magento/Catalog/Test/Mftf/Section/AdminProductGridSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<element name="productGridElement2" type="text" selector="#addselector" />
1818
<element name="productGridRows" type="text" selector="table.data-grid tr.data-row"/>
1919
<element name="firstProductRow" type="text" selector="table.data-grid tr.data-row:first-of-type"/>
20+
<element name="firstProductRowName" type="text" selector="table.data-grid tr.data-row:first-of-type > td:nth-of-type(4)"/>
2021
<element name="firstProductRowEditButton" type="button" selector="table.data-grid tr.data-row td .action-menu-item:first-of-type"/>
2122
<element name="productThumbnail" type="text" selector="table.data-grid tr:nth-child({{row}}) td.data-grid-thumbnail-cell > img" parameterized="true"/>
2223
<element name="productThumbnailBySrc" type="text" selector="img.admin__control-thumbnail[src*='{{pattern}}']" parameterized="true"/>

app/code/Magento/Catalog/Test/Mftf/Section/StorefrontNavigationSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
<element name="subCategory" type="button" selector="//ul[contains(@class,'submenu')]//span[contains(text(),'{{var1}}')]" parameterized="true"/>
1313
<element name="breadcrumbs" type="textarea" selector=".items"/>
1414
<element name="categoryBreadcrumbs" type="textarea" selector=".breadcrumbs li"/>
15+
<element name="categoryBreadcrumbsByNumber" type="textarea" selector=".breadcrumbs li:nth-of-type({{number}})" parameterized="true"/>
1516
</section>
1617
</sections>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="AdminFilterByNameByStoreViewOnProductGridTest">
12+
<annotations>
13+
<features value="Catalog"/>
14+
<stories value="Filter products"/>
15+
<title value="Product grid filtering by store view level attribute"/>
16+
<description value="Verify that products grid can be filtered on all store view level by attribute"/>
17+
<severity value="MAJOR"/>
18+
<testCaseId value="MAGETWO-98755"/>
19+
<useCaseId value="MAGETWO-98335"/>
20+
<group value="catalog"/>
21+
</annotations>
22+
<before>
23+
<createData entity="SimpleProduct2" stepKey="createSimpleProduct"/>
24+
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
25+
</before>
26+
<after>
27+
<deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/>
28+
<actionGroup ref="ClearProductsFilterActionGroup" stepKey="clearProductsFilter"/>
29+
<actionGroup ref="logout" stepKey="logout"/>
30+
</after>
31+
<amOnPage url="{{AdminProductEditPage.url($$createSimpleProduct.id$$)}}" stepKey="goToEditPage"/>
32+
<actionGroup ref="AdminSwitchStoreViewActionGroup" stepKey="switchToDefaultStoreView">
33+
<argument name="storeView" value="_defaultStore.name"/>
34+
</actionGroup>
35+
<scrollToTopOfPage stepKey="scrollToTopOfAdminProductFormSection"/>
36+
<click selector="{{AdminProductFormSection.productNameUseDefault}}" stepKey="uncheckUseDefault"/>
37+
<fillField selector="{{AdminProductFormSection.productName}}" userInput="{{SimpleProduct.name}}" stepKey="fillNewName"/>
38+
<actionGroup ref="saveProductForm" stepKey="saveSimpleProduct"/>
39+
<amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/>
40+
<actionGroup ref="filterProductGridByName" stepKey="filterGridByName">
41+
<argument name="product" value="SimpleProduct"/>
42+
</actionGroup>
43+
<see selector="{{AdminProductGridSection.firstProductRow}}" userInput="{{SimpleProduct2.name}}" stepKey="seeProductNameInGrid"/>
44+
</test>
45+
</tests>

0 commit comments

Comments
 (0)