Skip to content

Commit f9c8486

Browse files
author
Bohdan Korablov
committed
MAGETWO-51921: Error if CMS pages for different store views with identical URL Key #4113
1 parent 870bdfb commit f9c8486

File tree

2 files changed

+174
-1
lines changed

2 files changed

+174
-1
lines changed

app/code/Magento/CmsUrlRewrite/Observer/ProcessUrlRewriteSavingObserver.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\UrlRewrite\Model\UrlPersistInterface;
1010
use Magento\Framework\Event\ObserverInterface;
1111
use Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator;
12+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
1213

1314
class ProcessUrlRewriteSavingObserver implements ObserverInterface
1415
{
@@ -42,8 +43,14 @@ public function execute(EventObserver $observer)
4243
{
4344
/** @var $cmsPage \Magento\Cms\Model\Page */
4445
$cmsPage = $observer->getEvent()->getObject();
45-
if ($cmsPage->dataHasChangedFor('identifier')) {
46+
47+
if ($cmsPage->dataHasChangedFor('identifier') || $cmsPage->dataHasChangedFor('store_id')) {
4648
$urls = $this->cmsPageUrlRewriteGenerator->generate($cmsPage);
49+
50+
$this->urlPersist->deleteByData([
51+
UrlRewrite::ENTITY_ID => $cmsPage->getId(),
52+
UrlRewrite::ENTITY_TYPE => CmsPageUrlRewriteGenerator::ENTITY_TYPE,
53+
]);
4754
$this->urlPersist->replace($urls);
4855
}
4956
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CmsUrlRewrite\Test\Unit\Observer;
7+
8+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
9+
use Magento\CmsUrlRewrite\Observer\ProcessUrlRewriteSavingObserver;
10+
use Magento\UrlRewrite\Model\UrlPersistInterface;
11+
use Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator;
12+
use Magento\Framework\Event\Observer as EventObserver;
13+
use Magento\Framework\Event;
14+
use Magento\Cms\Model\Page;
15+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
16+
17+
class ProcessUrlRewriteSavingObserverTest extends \PHPUnit_Framework_TestCase
18+
{
19+
/**
20+
* @var ObjectManagerHelper
21+
*/
22+
protected $objectManagerHelper;
23+
24+
/**
25+
* @var UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject
26+
*/
27+
protected $urlPersistMock;
28+
29+
/**
30+
* @var CmsPageUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
31+
*/
32+
protected $cmsPageUrlRewriteGeneratorMock;
33+
34+
/**
35+
* @var EventObserver|\PHPUnit_Framework_MockObject_MockObject
36+
*/
37+
protected $eventObserverMock;
38+
39+
/**
40+
* @var Page|\PHPUnit_Framework_MockObject_MockObject
41+
*/
42+
protected $pageMock;
43+
44+
/**
45+
* @var Event|\PHPUnit_Framework_MockObject_MockObject
46+
*/
47+
protected $eventMock;
48+
49+
/**
50+
* @var ProcessUrlRewriteSavingObserver
51+
*/
52+
protected $observer;
53+
54+
/**
55+
* @return void
56+
*/
57+
protected function setUp()
58+
{
59+
$this->objectManagerHelper = new ObjectManagerHelper($this);
60+
61+
$this->urlPersistMock = $this->getMockBuilder(UrlPersistInterface::class)
62+
->getMockForAbstractClass();
63+
$this->cmsPageUrlRewriteGeneratorMock = $this->getMockBuilder(CmsPageUrlRewriteGenerator::class)
64+
->disableOriginalConstructor()
65+
->getMock();
66+
$this->pageMock = $this->getMockBuilder(Page::class)
67+
->setMethods(['getId', 'dataHasChangedFor'])
68+
->disableOriginalConstructor()
69+
->getMock();
70+
$this->eventMock = $this->getMockBuilder(Event::class)
71+
->setMethods(['getObject'])
72+
->disableOriginalConstructor()
73+
->getMock();
74+
$this->eventObserverMock = $this->getMockBuilder(EventObserver::class)
75+
->disableOriginalConstructor()
76+
->getMock();
77+
78+
$this->eventObserverMock->expects($this->once())
79+
->method('getEvent')
80+
->willReturn($this->eventMock);
81+
$this->eventMock->expects($this->once())
82+
->method('getObject')
83+
->willReturn($this->pageMock);
84+
85+
86+
$this->observer = $this->objectManagerHelper->getObject(
87+
ProcessUrlRewriteSavingObserver::class,
88+
[
89+
'cmsPageUrlRewriteGenerator' => $this->cmsPageUrlRewriteGeneratorMock,
90+
'urlPersist' => $this->urlPersistMock,
91+
]
92+
);
93+
}
94+
95+
/**
96+
* @param bool $identifierChanged
97+
* @param bool $storeIdChanged
98+
* @return void
99+
* @dataProvider executeDataProvider
100+
*/
101+
public function testExecute($identifierChanged, $storeIdChanged)
102+
{
103+
$pageId = 1;
104+
$urls = ['first url', 'second url'];
105+
106+
$this->pageMock->expects($this->any())
107+
->method('dataHasChangedFor')
108+
->willReturnMap([
109+
['identifier', $identifierChanged],
110+
['store_id', $storeIdChanged],
111+
]);
112+
$this->pageMock->expects($this->once())
113+
->method('getId')
114+
->willReturn($pageId);
115+
$this->cmsPageUrlRewriteGeneratorMock->expects($this->once())
116+
->method('generate')
117+
->with($this->pageMock)
118+
->willReturn($urls);
119+
$this->urlPersistMock->expects($this->once())
120+
->method('deleteByData')
121+
->with([
122+
UrlRewrite::ENTITY_ID => $pageId,
123+
UrlRewrite::ENTITY_TYPE => CmsPageUrlRewriteGenerator::ENTITY_TYPE,
124+
]);
125+
$this->urlPersistMock->expects($this->once())
126+
->method('replace')
127+
->with($urls);
128+
129+
$this->observer->execute($this->eventObserverMock);
130+
}
131+
132+
/**
133+
* return array
134+
*/
135+
public function executeDataProvider()
136+
{
137+
return [
138+
['identifier' => true, 'storeIdChanged' => true],
139+
['identifier' => true, 'storeIdChanged' => false],
140+
['identifier' => false, 'storeIdChanged' => true],
141+
];
142+
}
143+
144+
/**
145+
* @return void
146+
*/
147+
public function testExecuteWithoutDataChanged()
148+
{
149+
$this->pageMock->expects($this->any())
150+
->method('dataHasChangedFor')
151+
->willReturnMap([
152+
['identifier', false],
153+
['store_id', false],
154+
]);
155+
$this->pageMock->expects($this->never())
156+
->method('getId');
157+
$this->cmsPageUrlRewriteGeneratorMock->expects($this->never())
158+
->method('generate');
159+
$this->urlPersistMock->expects($this->never())
160+
->method('deleteByData');
161+
$this->urlPersistMock->expects($this->never())
162+
->method('replace');
163+
164+
$this->observer->execute($this->eventObserverMock);
165+
}
166+
}

0 commit comments

Comments
 (0)