Skip to content

Commit ee86554

Browse files
committed
MAGETWO-95176: Detaching category from product causes massive product url regeneration
1 parent cf316b4 commit ee86554

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CatalogUrlRewrite\Test\Unit\Observer;
9+
10+
use Magento\Catalog\Model\Category;
11+
use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
12+
use Magento\CatalogUrlRewrite\Model\Map\DatabaseMapPool;
13+
use Magento\CatalogUrlRewrite\Model\Map\DataCategoryUrlRewriteDatabaseMap;
14+
use Magento\CatalogUrlRewrite\Model\Map\DataProductUrlRewriteDatabaseMap;
15+
use Magento\CatalogUrlRewrite\Model\UrlRewriteBunchReplacer;
16+
use Magento\CatalogUrlRewrite\Observer\CategoryProcessUrlRewriteSavingObserver;
17+
use Magento\CatalogUrlRewrite\Observer\UrlRewriteHandler;
18+
use Magento\Framework\Event;
19+
use Magento\Framework\Event\Observer;
20+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
21+
use Magento\Store\Model\ResourceModel\Group\CollectionFactory;
22+
23+
/**
24+
* Tests Magento\CatalogUrlRewrite\Observer\CategoryProcessUrlRewriteSavingObserver.
25+
*/
26+
class CategoryProcessUrlRewriteSavingObserverTest extends \PHPUnit\Framework\TestCase
27+
{
28+
/**
29+
* @var CategoryProcessUrlRewriteSavingObserver
30+
*/
31+
private $observer;
32+
33+
/**
34+
* @var CategoryUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
35+
*/
36+
private $categoryUrlRewriteGeneratorMock;
37+
38+
/**
39+
* @var UrlRewriteHandler|\PHPUnit_Framework_MockObject_MockObject
40+
*/
41+
private $urlRewriteHandlerMock;
42+
43+
/**
44+
* @var UrlRewriteBunchReplacer|\PHPUnit_Framework_MockObject_MockObject $urlRewriteMock
45+
*/
46+
private $urlRewriteBunchReplacerMock;
47+
48+
/**
49+
* @var DatabaseMapPool|\PHPUnit_Framework_MockObject_MockObject
50+
*/
51+
private $databaseMapPoolMock;
52+
53+
/**
54+
* @inheritdoc
55+
*/
56+
protected function setUp()
57+
{
58+
$objectManager = new ObjectManager($this);
59+
$this->categoryUrlRewriteGeneratorMock = $this->createMock(CategoryUrlRewriteGenerator::class);
60+
$this->urlRewriteHandlerMock = $this->createMock(UrlRewriteHandler::class);
61+
$this->urlRewriteBunchReplacerMock = $this->createMock(UrlRewriteBunchReplacer::class);
62+
$this->databaseMapPoolMock = $this->createMock(DatabaseMapPool::class);
63+
/** @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject $storeGroupFactoryMock */
64+
$storeGroupCollectionFactoryMock = $this->createMock(CollectionFactory::class);
65+
66+
$this->observer = $objectManager->getObject(
67+
CategoryProcessUrlRewriteSavingObserver::class,
68+
[
69+
'categoryUrlRewriteGenerator' => $this->categoryUrlRewriteGeneratorMock,
70+
'urlRewriteHandler' => $this->urlRewriteHandlerMock,
71+
'urlRewriteBunchReplacer' => $this->urlRewriteBunchReplacerMock,
72+
'databaseMapPool' => $this->databaseMapPoolMock,
73+
'dataUrlRewriteClassNames' => [
74+
DataCategoryUrlRewriteDatabaseMap::class,
75+
DataProductUrlRewriteDatabaseMap::class
76+
],
77+
'storeGroupFactory' => $storeGroupCollectionFactoryMock,
78+
]
79+
);
80+
}
81+
82+
/**
83+
* Covers case when only associated products are changed for category.
84+
*
85+
* @return void
86+
*/
87+
public function testExecuteCategoryOnlyProductHasChanged()
88+
{
89+
$productId = 120;
90+
$productRewrites = ['product-url-rewrite'];
91+
92+
/** @var Observer|\PHPUnit_Framework_MockObject_MockObject $observerMock */
93+
$observerMock = $this->createMock(Observer::class);
94+
/** @var Event|\PHPUnit_Framework_MockObject_MockObject $eventMock */
95+
$eventMock = $this->createMock(Event::class);
96+
/** @var Category|\PHPUnit_Framework_MockObject_MockObject $categoryMock */
97+
$categoryMock = $this->createPartialMock(
98+
Category::class,
99+
[
100+
'hasData',
101+
'dataHasChangedFor',
102+
'getChangedProductIds',
103+
]
104+
);
105+
106+
$categoryMock->expects($this->once())->method('hasData')->with('store_id')->willReturn(true);
107+
$categoryMock->expects($this->exactly(2))->method('getChangedProductIds')->willReturn([$productId]);
108+
$categoryMock->expects($this->any())->method('dataHasChangedFor')
109+
->willReturnMap(
110+
[
111+
['url_key', false],
112+
['is_anchor', false],
113+
]
114+
);
115+
$eventMock->expects($this->once())->method('getData')->with('category')->willReturn($categoryMock);
116+
$observerMock->expects($this->once())->method('getEvent')->willReturn($eventMock);
117+
118+
$this->urlRewriteHandlerMock->expects($this->once())
119+
->method('updateProductUrlRewritesForChangedProduct')
120+
->with($categoryMock)
121+
->willReturn($productRewrites);
122+
123+
$this->urlRewriteBunchReplacerMock->expects($this->once())
124+
->method('doBunchReplace')
125+
->with($productRewrites, 10000);
126+
127+
$this->observer->execute($observerMock);
128+
}
129+
}

0 commit comments

Comments
 (0)