Skip to content

Commit 9fdc8c1

Browse files
committed
Merge remote-tracking branch 'github-magento2ce/MAGETWO-91649' into EPAM-PR-18
2 parents f807b2e + e794db8 commit 9fdc8c1

File tree

7 files changed

+171
-22
lines changed

7 files changed

+171
-22
lines changed

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,30 @@
237237
</arguments>
238238
<amOnPage url="{{AdminCategoryPage.page}}" stepKey="amOnCategoryPage"/>
239239
<waitForPageLoad stepKey="waitForPageLoad1"/>
240-
<click selector="{{AdminCategorySidebarTreeSection.categoryInTree(Category.Name)}}" stepKey="navigateToCreatedCategory" />
240+
<click selector="{{AdminCategorySidebarTreeSection.expandAll}}" stepKey="expandAll"/>
241241
<waitForPageLoad stepKey="waitForPageLoad2"/>
242+
<click selector="{{AdminCategorySidebarTreeSection.categoryInTree(Category.Name)}}" stepKey="navigateToCreatedCategory" />
242243
<waitForLoadingMaskToDisappear stepKey="waitForSpinner" />
243244
</actionGroup>
245+
246+
<actionGroup name="ChangeSeoUrlKey">
247+
<arguments>
248+
<argument name="value" type="string"/>
249+
</arguments>
250+
<click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSeoSection"/>
251+
<fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{value}}" stepKey="enterURLKey"/>
252+
<click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="saveCategory"/>
253+
<seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccessMessage"/>
254+
</actionGroup>
255+
256+
<actionGroup name="ChangeSeoUrlKeyForSubCategory">
257+
<arguments>
258+
<argument name="value" type="string"/>
259+
</arguments>
260+
<click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSeoSection"/>
261+
<uncheckOption selector="{{AdminCategorySEOSection.UrlKeyDefaultValueCheckbox}}" stepKey="uncheckDefaultValue"/>
262+
<fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{value}}" stepKey="enterURLKey"/>
263+
<click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="saveCategory"/>
264+
<seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccessMessage"/>
265+
</actionGroup>
244266
</actionGroups>

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,19 @@
6666
<click selector="{{StorefrontCategoryMainSection.modeListButton}}" stepKey="switchCategoryViewToListMode"/>
6767
<waitForElement selector="{{StorefrontCategoryMainSection.CategoryTitle}}" time="30" stepKey="waitForCategoryReload"/>
6868
</actionGroup>
69+
70+
<actionGroup name="GoToSubCategoryPage">
71+
<arguments>
72+
<argument name="parentCategory"/>
73+
<argument name="subCategory"/>
74+
<argument name="urlPath" type="string"/>
75+
</arguments>
76+
<moveMouseOver selector="{{StorefrontHeaderSection.NavigationCategoryByName(parentCategory.name)}}" stepKey="moveMouseOnMainCategory"/>
77+
<waitForElementVisible selector="{{StorefrontHeaderSection.NavigationCategoryByName(subCategory.name)}}" stepKey="waitForSubCategoryVisible"/>
78+
<click selector="{{StorefrontHeaderSection.NavigationCategoryByName(subCategory.name)}}" stepKey="goToCategory"/>
79+
<waitForPageLoad stepKey="waitForPageLoad"/>
80+
<seeInCurrentUrl url="{{urlPath}}.html" stepKey="checkUrl"/>
81+
<seeInTitle userInput="{{subCategory.name}}" stepKey="assertCategoryNameInTitle"/>
82+
<see userInput="{{subCategory.name}}" selector="{{StorefrontCategoryMainSection.CategoryTitle}}" stepKey="assertCategoryName"/>
83+
</actionGroup>
6984
</actionGroups>

app/code/Magento/CatalogUrlRewrite/Model/Category/ChildrenUrlRewriteGenerator.php

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
1111
use Magento\UrlRewrite\Model\MergeDataProviderFactory;
1212
use Magento\Framework\App\ObjectManager;
13+
use Magento\Catalog\Api\CategoryRepositoryInterface;
1314

15+
/**
16+
* Model for generate url rewrites for children categories
17+
*/
1418
class ChildrenUrlRewriteGenerator
1519
{
1620
/**
@@ -28,22 +32,31 @@ class ChildrenUrlRewriteGenerator
2832
*/
2933
private $mergeDataProviderPrototype;
3034

35+
/**
36+
* @var CategoryRepositoryInterface
37+
*/
38+
private $categoryRepository;
39+
3140
/**
3241
* @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider
3342
* @param \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGeneratorFactory $categoryUrlRewriteGeneratorFactory
3443
* @param \Magento\UrlRewrite\Model\MergeDataProviderFactory|null $mergeDataProviderFactory
44+
* @param CategoryRepositoryInterface|null $categoryRepository
3545
*/
3646
public function __construct(
3747
ChildrenCategoriesProvider $childrenCategoriesProvider,
3848
CategoryUrlRewriteGeneratorFactory $categoryUrlRewriteGeneratorFactory,
39-
MergeDataProviderFactory $mergeDataProviderFactory = null
49+
MergeDataProviderFactory $mergeDataProviderFactory = null,
50+
CategoryRepositoryInterface $categoryRepository = null
4051
) {
4152
$this->childrenCategoriesProvider = $childrenCategoriesProvider;
4253
$this->categoryUrlRewriteGeneratorFactory = $categoryUrlRewriteGeneratorFactory;
4354
if (!isset($mergeDataProviderFactory)) {
4455
$mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
4556
}
4657
$this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
58+
$this->categoryRepository = $categoryRepository
59+
?: ObjectManager::getInstance()->get(CategoryRepositoryInterface::class);
4760
}
4861

4962
/**
@@ -53,18 +66,23 @@ public function __construct(
5366
* @param \Magento\Catalog\Model\Category $category
5467
* @param int|null $rootCategoryId
5568
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
69+
* @throws \Magento\Framework\Exception\NoSuchEntityException
5670
*/
5771
public function generate($storeId, Category $category, $rootCategoryId = null)
5872
{
5973
$mergeDataProvider = clone $this->mergeDataProviderPrototype;
60-
foreach ($this->childrenCategoriesProvider->getChildren($category, true) as $childCategory) {
61-
$childCategory->setStoreId($storeId);
62-
$childCategory->setData('save_rewrites_history', $category->getData('save_rewrites_history'));
63-
/** @var CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator */
64-
$categoryUrlRewriteGenerator = $this->categoryUrlRewriteGeneratorFactory->create();
65-
$mergeDataProvider->merge(
66-
$categoryUrlRewriteGenerator->generate($childCategory, false, $rootCategoryId)
67-
);
74+
$childrenIds = $this->childrenCategoriesProvider->getChildrenIds($category, true);
75+
if ($childrenIds) {
76+
foreach ($childrenIds as $childId) {
77+
/** @var Category $childCategory */
78+
$childCategory = $this->categoryRepository->get($childId, $storeId);
79+
$childCategory->setData('save_rewrites_history', $category->getData('save_rewrites_history'));
80+
/** @var CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator */
81+
$categoryUrlRewriteGenerator = $this->categoryUrlRewriteGeneratorFactory->create();
82+
$mergeDataProvider->merge(
83+
$categoryUrlRewriteGenerator->generate($childCategory, false, $rootCategoryId)
84+
);
85+
}
6886
}
6987

7088
return $mergeDataProvider->getData();

app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88
use Magento\Catalog\Model\Category;
99
use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator;
1010
use Magento\CatalogUrlRewrite\Service\V1\StoreViewService;
11+
use Magento\Catalog\Api\CategoryRepositoryInterface;
1112
use Magento\Framework\Event\Observer;
1213
use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider;
1314
use Magento\Framework\Event\ObserverInterface;
1415
use Magento\Store\Model\Store;
1516

17+
/**
18+
* Class for set or update url path.
19+
*/
1620
class CategoryUrlPathAutogeneratorObserver implements ObserverInterface
1721
{
1822
/**
@@ -30,22 +34,32 @@ class CategoryUrlPathAutogeneratorObserver implements ObserverInterface
3034
*/
3135
protected $storeViewService;
3236

37+
/**
38+
* @var CategoryRepositoryInterface
39+
*/
40+
private $categoryRepository;
41+
3342
/**
3443
* @param CategoryUrlPathGenerator $categoryUrlPathGenerator
3544
* @param ChildrenCategoriesProvider $childrenCategoriesProvider
3645
* @param \Magento\CatalogUrlRewrite\Service\V1\StoreViewService $storeViewService
46+
* @param CategoryRepositoryInterface $categoryRepository
3747
*/
3848
public function __construct(
3949
CategoryUrlPathGenerator $categoryUrlPathGenerator,
4050
ChildrenCategoriesProvider $childrenCategoriesProvider,
41-
StoreViewService $storeViewService
51+
StoreViewService $storeViewService,
52+
CategoryRepositoryInterface $categoryRepository
4253
) {
4354
$this->categoryUrlPathGenerator = $categoryUrlPathGenerator;
4455
$this->childrenCategoriesProvider = $childrenCategoriesProvider;
4556
$this->storeViewService = $storeViewService;
57+
$this->categoryRepository = $categoryRepository;
4658
}
4759

4860
/**
61+
* Method for update/set url path.
62+
*
4963
* @param \Magento\Framework\Event\Observer $observer
5064
* @return void
5165
* @throws \Magento\Framework\Exception\LocalizedException
@@ -72,27 +86,29 @@ public function execute(\Magento\Framework\Event\Observer $observer)
7286
}
7387

7488
/**
89+
* Update url path for children category.
90+
*
7591
* @param Category $category
7692
* @return void
7793
*/
7894
protected function updateUrlPathForChildren(Category $category)
7995
{
80-
$children = $this->childrenCategoriesProvider->getChildren($category, true);
81-
8296
if ($this->isGlobalScope($category->getStoreId())) {
83-
foreach ($children as $child) {
97+
$childrenIds = $this->childrenCategoriesProvider->getChildrenIds($category, true);
98+
foreach ($childrenIds as $childId) {
8499
foreach ($category->getStoreIds() as $storeId) {
85100
if ($this->storeViewService->doesEntityHaveOverriddenUrlPathForStore(
86101
$storeId,
87-
$child->getId(),
102+
$childId,
88103
Category::ENTITY
89104
)) {
90-
$child->setStoreId($storeId);
105+
$child = $this->categoryRepository->get($childId, $storeId);
91106
$this->updateUrlPathForCategory($child);
92107
}
93108
}
94109
}
95110
} else {
111+
$children = $this->childrenCategoriesProvider->getChildren($category, true);
96112
foreach ($children as $child) {
97113
$child->setStoreId($category->getStoreId());
98114
$this->updateUrlPathForCategory($child);
@@ -112,6 +128,8 @@ protected function isGlobalScope($storeId)
112128
}
113129

114130
/**
131+
* Update url path for category.
132+
*
115133
* @param Category $category
116134
* @return void
117135
*/
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
9+
<test name="RewriteStoreLevelUrlKeyOfChildCategoryTest">
10+
<annotations>
11+
<title value="Rewriting Store-level URL key of child category"/>
12+
<stories value="MAGETWO-91649: #13513: Magento ignore store-level url_key of child category in URL rewrite process for global scope"/>
13+
<description value="Rewriting Store-level URL key of child category"/>
14+
<features value="CatalogUrlRewrite"/>
15+
<severity value="MAJOR"/>
16+
<testCaseId value="MAGETWO-94934"/>
17+
<group value="CatalogUrlRewrite"/>
18+
</annotations>
19+
20+
<before>
21+
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
22+
<actionGroup ref="AdminCreateStoreViewActionGroup" stepKey="createStoreView" />
23+
24+
<createData entity="_defaultCategory" stepKey="defaultCategory"/>
25+
<createData entity="SubCategoryWithParent" stepKey="subCategory">
26+
<requiredEntity createDataKey="defaultCategory"/>
27+
</createData>
28+
</before>
29+
30+
<actionGroup ref="navigateToCreatedCategory" stepKey="navigateToCreatedSubCategory">
31+
<argument name="Category" value="$$subCategory$$"/>
32+
</actionGroup>
33+
34+
<actionGroup ref="AdminSwitchStoreViewActionGroup" stepKey="AdminSwitchStoreViewForSubCategory"/>
35+
36+
<actionGroup ref="ChangeSeoUrlKeyForSubCategory" stepKey="changeSeoUrlKeyForSubCategory">
37+
<argument name="value" value="bags-second"/>
38+
</actionGroup>
39+
40+
<actionGroup ref="navigateToCreatedCategory" stepKey="navigateToCreatedDefaultCategory">
41+
<argument name="Category" value="$$defaultCategory$$"/>
42+
</actionGroup>
43+
44+
<actionGroup ref="ChangeSeoUrlKey" stepKey="changeSeoUrlKeyForDefaultCategory">
45+
<argument name="value" value="gear-global"/>
46+
</actionGroup>
47+
48+
<amOnPage url="{{StorefrontHomePage.url}}" stepKey="goToStorefrontPage"/>
49+
<waitForPageLoad stepKey="waitForPageLoad"/>
50+
51+
<actionGroup ref="StorefrontSwitchStoreViewActionGroup" stepKey="storefrontSwitchStoreView"/>
52+
53+
<actionGroup ref="GoToSubCategoryPage" stepKey="goToSubCategoryPage">
54+
<argument name="parentCategory" value="$$defaultCategory$$"/>
55+
<argument name="subCategory" value="$$subCategory$$"/>
56+
<argument name="urlPath" value="gear-global/bags-second"/>
57+
</actionGroup>
58+
59+
<after>
60+
<actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteStoreView"/>
61+
<actionGroup ref="logout" stepKey="logout"/>
62+
63+
<deleteData createDataKey="subCategory" stepKey="deleteSubCategory"/>
64+
<deleteData createDataKey="defaultCategory" stepKey="deleteNewRootCategory"/>
65+
</after>
66+
</test>
67+
</tests>

app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class ChildrenUrlRewriteGeneratorTest extends \PHPUnit\Framework\TestCase
3131
/** @var \PHPUnit_Framework_MockObject_MockObject */
3232
private $serializerMock;
3333

34+
/** @var \PHPUnit_Framework_MockObject_MockObject */
35+
private $categoryRepository;
36+
3437
protected function setUp()
3538
{
3639
$this->serializerMock = $this->getMockBuilder(Json::class)
@@ -47,6 +50,9 @@ protected function setUp()
4750
$this->categoryUrlRewriteGenerator = $this->getMockBuilder(
4851
\Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::class
4952
)->disableOriginalConstructor()->getMock();
53+
$this->categoryRepository = $this->getMockBuilder(
54+
\Magento\Catalog\Model\CategoryRepository::class
55+
)->disableOriginalConstructor()->getMock();
5056
$mergeDataProviderFactory = $this->createPartialMock(
5157
\Magento\UrlRewrite\Model\MergeDataProviderFactory::class,
5258
['create']
@@ -59,14 +65,15 @@ protected function setUp()
5965
[
6066
'childrenCategoriesProvider' => $this->childrenCategoriesProvider,
6167
'categoryUrlRewriteGeneratorFactory' => $this->categoryUrlRewriteGeneratorFactory,
62-
'mergeDataProviderFactory' => $mergeDataProviderFactory
68+
'mergeDataProviderFactory' => $mergeDataProviderFactory,
69+
'categoryRepository' => $this->categoryRepository
6370
]
6471
);
6572
}
6673

6774
public function testNoChildrenCategories()
6875
{
69-
$this->childrenCategoriesProvider->expects($this->once())->method('getChildren')->with($this->category, true)
76+
$this->childrenCategoriesProvider->expects($this->once())->method('getChildrenIds')->with($this->category, true)
7077
->will($this->returnValue([]));
7178

7279
$this->assertEquals([], $this->childrenUrlRewriteGenerator->generate('store_id', $this->category));
@@ -76,14 +83,16 @@ public function testGenerate()
7683
{
7784
$storeId = 'store_id';
7885
$saveRewritesHistory = 'flag';
86+
$childId = 2;
7987

8088
$childCategory = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
8189
->disableOriginalConstructor()->getMock();
82-
$childCategory->expects($this->once())->method('setStoreId')->with($storeId);
8390
$childCategory->expects($this->once())->method('setData')
8491
->with('save_rewrites_history', $saveRewritesHistory);
85-
$this->childrenCategoriesProvider->expects($this->once())->method('getChildren')->with($this->category, true)
86-
->will($this->returnValue([$childCategory]));
92+
$this->childrenCategoriesProvider->expects($this->once())->method('getChildrenIds')->with($this->category, true)
93+
->will($this->returnValue([$childId]));
94+
$this->categoryRepository->expects($this->once())->method('get')
95+
->with($childId, $storeId)->willReturn($childCategory);
8796
$this->category->expects($this->any())->method('getData')->with('save_rewrites_history')
8897
->will($this->returnValue($saveRewritesHistory));
8998
$this->categoryUrlRewriteGeneratorFactory->expects($this->once())->method('create')

dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ public function moveActionDataProvider()
403403
{
404404
return [
405405
[400, 401, 'first_url_key', 402, 'second_url_key', false],
406-
[400, 401, 'duplicated_url_key', 402, 'duplicated_url_key', true],
406+
[400, 401, 'duplicated_url_key', 402, 'duplicated_url_key', false],
407407
[0, 401, 'first_url_key', 402, 'second_url_key', true],
408408
[400, 401, 'first_url_key', 0, 'second_url_key', true],
409409
];

0 commit comments

Comments
 (0)