Skip to content

Commit 3259107

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-70663' into 2.2-develop-pr8
2 parents e669b04 + 97919f0 commit 3259107

File tree

2 files changed

+94
-9
lines changed

2 files changed

+94
-9
lines changed

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,29 @@ public function generateProductUrlRewrites(\Magento\Catalog\Model\Category $cate
110110
$storeId = $category->getStoreId();
111111
if ($category->getAffectedProductIds()) {
112112
$this->isSkippedProduct[$category->getEntityId()] = $category->getAffectedProductIds();
113+
/* @var \Magento\Catalog\Model\ResourceModel\Product\Collection $collection */
113114
$collection = $this->productCollectionFactory->create()
114115
->setStoreId($storeId)
115116
->addIdFilter($category->getAffectedProductIds())
116117
->addAttributeToSelect('visibility')
117118
->addAttributeToSelect('name')
118119
->addAttributeToSelect('url_key')
119120
->addAttributeToSelect('url_path');
120-
foreach ($collection as $product) {
121-
$product->setStoreId($storeId);
122-
$product->setData('save_rewrites_history', $saveRewriteHistory);
123-
$mergeDataProvider->merge(
124-
$this->productUrlRewriteGenerator->generate($product, $category->getEntityId())
125-
);
121+
122+
$collection->setPageSize(1000);
123+
$pageCount = $collection->getLastPageNumber();
124+
$currentPage = 1;
125+
while ($currentPage <= $pageCount) {
126+
$collection->setCurPage($currentPage);
127+
foreach ($collection as $product) {
128+
$product->setStoreId($storeId);
129+
$product->setData('save_rewrites_history', $saveRewriteHistory);
130+
$mergeDataProvider->merge(
131+
$this->productUrlRewriteGenerator->generate($product, $category->getEntityId())
132+
);
133+
}
134+
$collection->clear();
135+
$currentPage++;
126136
}
127137
} else {
128138
$mergeDataProvider->merge(

app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
*/
66
namespace Magento\CatalogUrlRewrite\Test\Unit\Observer;
77

8+
use Magento\Catalog\Model\ResourceModel\Product\Collection;
89
use Magento\CatalogUrlRewrite\Observer\UrlRewriteHandler;
910
use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider;
11+
use Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator;
1012
use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
1113
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
1214
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
@@ -16,6 +18,9 @@
1618
use Magento\UrlRewrite\Model\MergeDataProvider;
1719
use Magento\CatalogUrlRewrite\Model\CategoryProductUrlPathGenerator;
1820

21+
/**
22+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
23+
*/
1924
class UrlRewriteHandlerTest extends \PHPUnit\Framework\TestCase
2025
{
2126
/**
@@ -58,6 +63,11 @@ class UrlRewriteHandlerTest extends \PHPUnit\Framework\TestCase
5863
*/
5964
private $mergeDataProviderFactoryMock;
6065

66+
/**
67+
* @var MergeDataProvider|\PHPUnit_Framework_MockObject_MockObject
68+
*/
69+
private $mergeDataProviderMock;
70+
6171
/**
6272
* @var Json|\PHPUnit_Framework_MockObject_MockObject
6373
*/
@@ -85,16 +95,15 @@ protected function setUp()
8595
->setMethods(['create'])
8696
->disableOriginalConstructor()
8797
->getMock();
88-
$mergeDataProviderMock = $this->getMockBuilder(MergeDataProvider::class)
98+
$this->mergeDataProviderMock = $this->getMockBuilder(MergeDataProvider::class)
8999
->disableOriginalConstructor()
90100
->getMock();
91101
$this->categoryBasedProductRewriteGeneratorMock = $this->getMockBuilder(CategoryProductUrlPathGenerator::class)
92102
->disableOriginalConstructor()
93103
->getMock();
94104
$this->mergeDataProviderFactoryMock->expects($this->any())
95105
->method('create')
96-
->willReturn($mergeDataProviderMock);
97-
106+
->willReturn($this->mergeDataProviderMock);
98107
$this->serializerMock = $this->getMockBuilder(Json::class)
99108
->disableOriginalConstructor()
100109
->getMock();
@@ -111,6 +120,72 @@ protected function setUp()
111120
);
112121
}
113122

123+
/**
124+
* @test
125+
*/
126+
public function testGenerateProductUrlRewrites()
127+
{
128+
/* @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject $category */
129+
$category = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
130+
->setMethods(['getEntityId', 'getStoreId', 'getData', 'getAffectedProductIds'])
131+
->disableOriginalConstructor()
132+
->getMock();
133+
$category->expects($this->any())
134+
->method('getEntityId')
135+
->willReturn(2);
136+
$category->expects($this->any())
137+
->method('getStoreId')
138+
->willReturn(1);
139+
$category->expects($this->any())
140+
->method('getData')
141+
->with('save_rewrites_history')
142+
->willReturn(true);
143+
144+
/* @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject $childCategory1 */
145+
$childCategory1 = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
146+
->setMethods(['getEntityId'])
147+
->disableOriginalConstructor()
148+
->getMock();
149+
$childCategory1->expects($this->any())
150+
->method('getEntityId')
151+
->willReturn(100);
152+
153+
/* @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject $childCategory1 */
154+
$childCategory2 = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
155+
->setMethods(['getEntityId'])
156+
->disableOriginalConstructor()
157+
->getMock();
158+
$childCategory1->expects($this->any())
159+
->method('getEntityId')
160+
->willReturn(200);
161+
162+
$this->childrenCategoriesProviderMock->expects($this->once())
163+
->method('getChildren')
164+
->with($category, true)
165+
->willReturn([$childCategory1, $childCategory2]);
166+
167+
/** @var Collection|\PHPUnit_Framework_MockObject_MockObject $productCollection */
168+
$productCollection = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product\Collection::class)
169+
->disableOriginalConstructor()
170+
->getMock();
171+
$productCollection->expects($this->any())
172+
->method('addCategoriesFilter')
173+
->willReturnSelf();
174+
$productCollection->expects($this->any())
175+
->method('addIdFilter')
176+
->willReturnSelf();
177+
$productCollection->expects($this->any())->method('setStoreId')->willReturnSelf();
178+
$productCollection->expects($this->any())->method('addAttributeToSelect')->willReturnSelf();
179+
$iterator = new \ArrayIterator([]);
180+
$productCollection->expects($this->any())->method('getIterator')->will($this->returnValue($iterator));
181+
182+
$this->collectionFactoryMock->expects($this->any())->method('create')->willReturn($productCollection);
183+
184+
$this->mergeDataProviderMock->expects($this->any())->method('getData')->willReturn([1, 2]);
185+
186+
$this->urlRewriteHandler->generateProductUrlRewrites($category);
187+
}
188+
114189
public function testDeleteCategoryRewritesForChildren()
115190
{
116191
$category = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)

0 commit comments

Comments
 (0)