Skip to content

Commit 69ec622

Browse files
[Magento Community Engineering] Community Contributions - 2.4-develop-expedited-prs
- merged with '2.4-develop-temporary-one-prs' branch
2 parents 340db03 + 19a3d87 commit 69ec622

File tree

18 files changed

+983
-263
lines changed

18 files changed

+983
-263
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<element name="sectionHeader" type="button" selector="div[data-index='search-engine-optimization']" timeout="30"/>
1313
<element name="urlKeyInput" type="input" selector="input[name='product[url_key]']"/>
1414
<element name="useDefaultUrl" type="checkbox" selector="input[name='use_default[url_key]']"/>
15+
<element name="urlKeyRedirectCheckbox" type="checkbox" selector="input[name='product[url_key_create_redirect]']"/>
1516
<element name="metaTitleInput" type="input" selector="input[name='product[meta_title]']"/>
1617
<element name="metaKeywordsInput" type="textarea" selector="textarea[name='product[meta_keyword]']"/>
1718
<element name="metaDescriptionInput" type="textarea" selector="textarea[name='product[meta_description]']"/>

app/code/Magento/CatalogUrlRewrite/Plugin/Catalog/Block/Adminhtml/Category/Tab/Attributes.php

Lines changed: 70 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,90 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\CatalogUrlRewrite\Plugin\Catalog\Block\Adminhtml\Category\Tab;
78

9+
use Magento\Catalog\Api\Data\CategoryInterface;
10+
use Magento\Catalog\Model\Category\DataProvider;
11+
use Magento\Framework\App\Config\ScopeConfigInterface;
12+
use Magento\CatalogUrlRewrite\Block\UrlKeyRenderer;
13+
use Magento\Store\Model\ScopeInterface;
14+
815
/**
9-
* Class Attributes
16+
* Category tab attributes
1017
*/
1118
class Attributes
1219
{
1320
/**
14-
* @param \Magento\Catalog\Model\Category\DataProvider $subject
15-
* @param array $result
21+
* @var ScopeConfigInterface
22+
*/
23+
private $scopeConfig;
24+
25+
/**
26+
* @param ScopeConfigInterface $scopeConfig
27+
*/
28+
public function __construct(ScopeConfigInterface $scopeConfig)
29+
{
30+
$this->scopeConfig = $scopeConfig;
31+
}
32+
33+
/**
34+
* Adds attributes meta if url_key exist
1635
*
36+
* @param DataProvider $subject
37+
* @param array $result
1738
* @return array
1839
*/
19-
public function afterGetAttributesMeta(
20-
\Magento\Catalog\Model\Category\DataProvider $subject,
21-
$result
22-
) {
23-
/** @var \Magento\Catalog\Model\Category $category */
40+
public function afterGetAttributesMeta(DataProvider $subject, $result)
41+
{
42+
if (!isset($result['url_key'])) {
43+
return $result;
44+
}
45+
2446
$category = $subject->getCurrentCategory();
25-
if (isset($result['url_key'])) {
26-
if ($category && $category->getId()) {
27-
if ($category->getLevel() == 1) {
28-
$result['url_key_group']['componentDisabled'] = true;
29-
} else {
30-
$result['url_key_create_redirect']['valueMap']['true'] = $category->getUrlKey();
31-
$result['url_key_create_redirect']['value'] = $category->getUrlKey();
32-
$result['url_key_create_redirect']['disabled'] = true;
33-
}
47+
if ($category && $category->getId()) {
48+
if ((int) $category->getLevel() === 1) {
49+
$result['url_key_group']['componentDisabled'] = true;
3450
} else {
35-
$result['url_key_create_redirect']['visible'] = false;
51+
$result['url_key_create_redirect'] = $this->getUrlRewriteMeta($category);
3652
}
53+
} else {
54+
$result['url_key_create_redirect']['visible'] = false;
3755
}
56+
3857
return $result;
3958
}
59+
60+
/**
61+
* Returns url rewrite meta
62+
*
63+
* @param CategoryInterface $category
64+
* @return array
65+
*/
66+
private function getUrlRewriteMeta(CategoryInterface $category): array
67+
{
68+
return [
69+
'value' => $this->isSaveRewriteHistory($category->getStoreId()) ? $category->getUrlKey() : '',
70+
'valueMap' => [
71+
'false' => '',
72+
'true' => $category->getUrlKey()
73+
],
74+
'disabled' => true,
75+
];
76+
}
77+
78+
/**
79+
* Returns Create Permanent Redirect for URLs if changed config enabled
80+
*
81+
* @param int $storeId
82+
* @return bool
83+
*/
84+
private function isSaveRewriteHistory(int $storeId): bool
85+
{
86+
return $this->scopeConfig->isSetFlag(
87+
UrlKeyRenderer::XML_PATH_SEO_SAVE_HISTORY,
88+
ScopeInterface::SCOPE_STORE,
89+
$storeId
90+
);
91+
}
4092
}

app/code/Magento/CatalogUrlRewrite/Test/Mftf/Data/GenerateCategoryProductUrlRewriteConfigData.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@
2727
<data key="path">catalog/seo/product_use_categories</data>
2828
<data key="value">0</data>
2929
</entity>
30+
<entity name="EnableCreatePermanentRedirect">
31+
<data key="path">catalog/seo/save_rewrites_history</data>
32+
<data key="value">1</data>
33+
</entity>
34+
<entity name="DisableCreatePermanentRedirect">
35+
<data key="path">catalog/seo/save_rewrites_history</data>
36+
<data key="value">0</data>
37+
</entity>
3038
</entities>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10+
<test name="AdminVerifyCheckboxIsDisabledCreatePermanentRedirectSetNoTest">
11+
<annotations>
12+
<features value="CatalogUrlRewrite"/>
13+
<stories value="Url rewrites"/>
14+
<title value="Verify checkbox is disabled 'Create Permanent Redirect' set 'No'"/>
15+
<description value="Verify checkbox is disabled 'Create Permanent Redirect' set 'No' on category and product edit page."/>
16+
<testCaseId value="MC-35589"/>
17+
</annotations>
18+
<before>
19+
<magentoCLI command="config:set {{DisableCreatePermanentRedirect.path}} {{DisableCreatePermanentRedirect.value}}" stepKey="enableCreatePermanentRedirect"/>
20+
<magentoCLI command="cache:flush" stepKey="flushCache"/>
21+
<createData entity="_defaultCategory" stepKey="createDefaultCategory"/>
22+
<createData entity="SimpleProduct" stepKey="createSimpleProduct">
23+
<requiredEntity createDataKey="createDefaultCategory"/>
24+
</createData>
25+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
26+
</before>
27+
<after>
28+
<deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/>
29+
<deleteData createDataKey="createDefaultCategory" stepKey="deleteDefaultCategory"/>
30+
<magentoCLI command="config:set {{EnableCreatePermanentRedirect.path}} {{EnableCreatePermanentRedirect.value}}" stepKey="disableCreatePermanentRedirect"/>
31+
<magentoCLI command="cache:flush" stepKey="flushCache"/>
32+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logout"/>
33+
</after>
34+
<actionGroup ref="AdminProductPageOpenByIdActionGroup" stepKey="goToProductEditPage">
35+
<argument name="productId" value="$$createSimpleProduct.id$$"/>
36+
</actionGroup>
37+
<scrollTo selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="scrollToSeoSection" x="0" y="-120" />
38+
<click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/>
39+
<grabValueFrom selector="{{AdminProductSEOSection.urlKeyRedirectCheckbox}}" stepKey="grabValue"/>
40+
<assertEmpty stepKey="checkUrlKeyRedirectCheckbox">
41+
<actualResult type="string">$grabValue</actualResult>
42+
</assertEmpty>
43+
44+
<actionGroup ref="NavigateToCreatedCategoryActionGroup" stepKey="openCreatedSubCategory">
45+
<argument name="Category" value="$$createDefaultCategory$$"/>
46+
</actionGroup>
47+
<scrollTo selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="scrollToSeoSection1" x="0" y="-120" />
48+
<click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSeoSection1"/>
49+
<grabValueFrom selector="{{AdminCategorySEOSection.UrlKeyRedirectCheckbox}}" stepKey="grabValue1"/>
50+
<assertEmpty stepKey="checkUrlKeyRedirectCheckbox1">
51+
<actualResult type="string">$grabValue1</actualResult>
52+
</assertEmpty>
53+
</test>
54+
</tests>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\CatalogUrlRewrite\Test\Unit\Plugin\Catalog\Block\Adminhtml\Category\Tab;
10+
11+
use Magento\Catalog\Model\Category;
12+
use Magento\Catalog\Model\Category\DataProvider as CategoryDataProvider;
13+
use Magento\CatalogUrlRewrite\Plugin\Catalog\Block\Adminhtml\Category\Tab\Attributes;
14+
use Magento\Framework\App\Config\ScopeConfigInterface;
15+
use PHPUnit\Framework\MockObject\MockObject;
16+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
17+
use PHPUnit\Framework\TestCase;
18+
19+
/**
20+
* Test for \Magento\CatalogUrlRewrite\Plugin\Catalog\Block\Adminhtml\Category\Tab\Attributes.
21+
*/
22+
class AttributesTest extends TestCase
23+
{
24+
private const STUB_CATEGORY_META = ['url_key' => 'url_key_test'];
25+
private const STUB_URL_KEY = 'url_key_777';
26+
27+
/**
28+
* @var Attributes
29+
*/
30+
private $model;
31+
32+
/**
33+
* @var Category|MockObject
34+
*/
35+
private $categoryMock;
36+
37+
/**
38+
* @var CategoryDataProvider|MockObject
39+
*/
40+
private $dataProviderMock;
41+
42+
/**
43+
* @var ScopeConfigInterface|MockObject
44+
*/
45+
private $scopeConfigMock;
46+
47+
/**
48+
* @inheritdoc
49+
*/
50+
protected function setUp(): void
51+
{
52+
$objectManager = new ObjectManager($this);
53+
54+
$this->categoryMock = $this->createMock(Category::class);
55+
$this->dataProviderMock = $this->createMock(CategoryDataProvider::class);
56+
$this->dataProviderMock->expects($this->any())
57+
->method('getCurrentCategory')
58+
->willReturn($this->categoryMock);
59+
60+
$this->scopeConfigMock = $this->createMock(ScopeConfigInterface::class);
61+
$this->model = $objectManager->getObject(Attributes::class, ['scopeConfig' => $this->scopeConfigMock]);
62+
}
63+
64+
/**
65+
* Test get attributes meta
66+
*
67+
* @dataProvider attributesMetaDataProvider
68+
*
69+
* @param bool $configEnabled
70+
* @param string $expectedValue
71+
* @param string $expectedValueMap
72+
* @return void
73+
*/
74+
public function testGetAttributesMeta(bool $configEnabled, string $expectedValue, string $expectedValueMap): void
75+
{
76+
$this->categoryMock->expects($this->once())
77+
->method('getId')
78+
->willReturn(1);
79+
$this->categoryMock->expects($this->once())
80+
->method('getLevel')
81+
->willReturn(2);
82+
$this->categoryMock->expects($this->atMost(2))
83+
->method('getUrlKey')
84+
->willReturn(self::STUB_URL_KEY);
85+
$this->scopeConfigMock->expects($this->once())
86+
->method('isSetFlag')
87+
->willReturn($configEnabled);
88+
$this->categoryMock->expects($this->once())
89+
->method('getStoreId')
90+
->willReturn(1);
91+
92+
$result = $this->model->afterGetAttributesMeta($this->dataProviderMock, self::STUB_CATEGORY_META);
93+
94+
$this->assertArrayHasKey('url_key_create_redirect', $result);
95+
96+
$this->assertArrayHasKey('value', $result['url_key_create_redirect']);
97+
$this->assertEquals($expectedValue, $result['url_key_create_redirect']['value']);
98+
99+
$this->assertArrayHasKey('valueMap', $result['url_key_create_redirect']);
100+
$this->assertArrayHasKey('true', $result['url_key_create_redirect']['valueMap']);
101+
$this->assertEquals($expectedValueMap, $result['url_key_create_redirect']['valueMap']['true']);
102+
103+
$this->assertArrayHasKey('disabled', $result['url_key_create_redirect']);
104+
$this->assertTrue($result['url_key_create_redirect']['disabled']);
105+
}
106+
107+
/**
108+
* DataProvider for testGetAttributesMeta
109+
*
110+
* @return array
111+
*/
112+
public function attributesMetaDataProvider(): array
113+
{
114+
return [
115+
'save rewrite history config enabled' => [true, self::STUB_URL_KEY, self::STUB_URL_KEY],
116+
'save rewrite history config disabled' => [false, '', 'url_key_777']
117+
];
118+
}
119+
120+
/**
121+
* Test get category without id attributes meta
122+
*
123+
* @return void
124+
*/
125+
public function testGetAttributesMetaWithoutCategoryId(): void
126+
{
127+
$this->categoryMock->expects($this->once())
128+
->method('getId')
129+
->willReturn(null);
130+
131+
$result = $this->model->afterGetAttributesMeta($this->dataProviderMock, self::STUB_CATEGORY_META);
132+
133+
$this->assertArrayHasKey('url_key_create_redirect', $result);
134+
$this->assertArrayHasKey('visible', $result['url_key_create_redirect']);
135+
$this->assertFalse($result['url_key_create_redirect']['visible']);
136+
}
137+
138+
/**
139+
* Test get root category attributes meta
140+
*
141+
* @return void
142+
*/
143+
public function testGetAttributesMetaRootCategory(): void
144+
{
145+
$this->categoryMock->expects($this->once())
146+
->method('getId')
147+
->willReturn(1);
148+
$this->categoryMock->expects($this->once())
149+
->method('getLevel')
150+
->willReturn(1);
151+
152+
$result = $this->model->afterGetAttributesMeta($this->dataProviderMock, self::STUB_CATEGORY_META);
153+
154+
$this->assertArrayHasKey('url_key_group', $result);
155+
$this->assertArrayHasKey('componentDisabled', $result['url_key_group']);
156+
$this->assertTrue($result['url_key_group']['componentDisabled']);
157+
}
158+
}

app/code/Magento/Config/App/Config/Source/RuntimeConfigSource.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public function __construct(
7070
public function get($path = '')
7171
{
7272
$data = new DataObject($this->deploymentConfig->isDbAvailable() ? $this->loadConfig() : []);
73-
return $data->getData($path) ?: [];
73+
74+
return $data->getData($path) !== null ? $data->getData($path) : null;
7475
}
7576

7677
/**

0 commit comments

Comments
 (0)