Skip to content

Commit 932dfe2

Browse files
committed
MC-15250: Explicit product sorting in PageBuilder Products Content type
- Add integration test to verify sort orders
1 parent dffa2ff commit 932dfe2

File tree

3 files changed

+276
-1
lines changed

3 files changed

+276
-1
lines changed

app/code/Magento/PageBuilder/Model/Catalog/Sorting.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public function applySorting(
8787
\Magento\Catalog\Model\ResourceModel\Product\Collection $collection
8888
): \Magento\Catalog\Model\ResourceModel\Product\Collection {
8989
$sortBuilder = $this->getSortingInstance($option);
90-
$_collection = $sortBuilder->sort($collection->setCurPage(0));
90+
$_collection = $sortBuilder->sort($collection);
9191

9292
if ($_collection->isLoaded()) {
9393
$_collection->clear();
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\PageBuilder\Model\Catalog;
8+
9+
use \Magento\TestFramework\Helper\Bootstrap;
10+
11+
/**
12+
* Class SortingTest
13+
*/
14+
class SortingTest extends \PHPUnit\Framework\TestCase
15+
{
16+
/**
17+
* By default products will be ordered by SKU
18+
*
19+
* @var array
20+
*/
21+
protected $skus = [
22+
'1_PB_PRODUCT',
23+
'a_pb_product',
24+
'B_PB_PRODUCT',
25+
'C_PB_PRODUCT'
26+
];
27+
28+
/**
29+
* @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
30+
*/
31+
protected $productCollectionFactory;
32+
33+
/**
34+
* @var \Magento\PageBuilder\Model\Catalog\Sorting
35+
*/
36+
protected $sortModel;
37+
38+
/**
39+
* Set up instances and mock objects
40+
*/
41+
protected function setUp()
42+
{
43+
$objectManager = Bootstrap::getObjectManager();
44+
$this->productCollectionFactory = $objectManager->create(
45+
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory::class
46+
);
47+
$this->sortModel = $objectManager->create(Sorting::class);
48+
}
49+
50+
/**
51+
* @dataProvider productSortDataProvider
52+
* @magentoDataFixture Magento/PageBuilder/_files/catalog_sorting/products.php
53+
*/
54+
public function testSortOptions($productSort)
55+
{
56+
foreach ($productSort as $rule => $expectedOrder) {
57+
$collection = $this->productCollectionFactory->create();
58+
$collection->addAttributeToFilter(
59+
\Magento\Catalog\Api\Data\ProductInterface::SKU,
60+
[
61+
'in' => $this->skus,
62+
]
63+
);
64+
65+
$actualOrder = $this->getSkus(
66+
$this->sortModel->applySorting(
67+
$rule,
68+
$collection
69+
)
70+
);
71+
72+
$this->assertEquals(
73+
$actualOrder,
74+
$expectedOrder,
75+
$rule . ' does not match expected output.'
76+
);
77+
}
78+
}
79+
80+
/**
81+
* Provide sorting rule and expected order of SKUs once sort is applied
82+
*
83+
* @return array
84+
*/
85+
public function productSortDataProvider() : array
86+
{
87+
return [
88+
[
89+
[
90+
'date_newest_top' => [
91+
'1_PB_PRODUCT',
92+
'C_PB_PRODUCT',
93+
'B_PB_PRODUCT',
94+
'a_pb_product'
95+
],
96+
'date_oldest_top' => [
97+
'a_pb_product',
98+
'B_PB_PRODUCT',
99+
'C_PB_PRODUCT',
100+
'1_PB_PRODUCT'
101+
],
102+
'name_ascending' => [
103+
'1_PB_PRODUCT',
104+
'a_pb_product',
105+
'B_PB_PRODUCT',
106+
'C_PB_PRODUCT'
107+
],
108+
'name_descending' => [
109+
'C_PB_PRODUCT',
110+
'B_PB_PRODUCT',
111+
'a_pb_product',
112+
'1_PB_PRODUCT'
113+
],
114+
'sku_ascending' => [
115+
'1_PB_PRODUCT',
116+
'a_pb_product',
117+
'B_PB_PRODUCT',
118+
'C_PB_PRODUCT'
119+
],
120+
'sku_descending' => [
121+
'C_PB_PRODUCT',
122+
'B_PB_PRODUCT',
123+
'a_pb_product',
124+
'1_PB_PRODUCT'
125+
],
126+
'low_stock_first' => [
127+
'1_PB_PRODUCT',
128+
'a_pb_product',
129+
'C_PB_PRODUCT',
130+
'B_PB_PRODUCT'
131+
],
132+
'high_stock_first' => [
133+
'C_PB_PRODUCT',
134+
'a_pb_product',
135+
'1_PB_PRODUCT',
136+
'B_PB_PRODUCT'
137+
],
138+
'price_high_to_low' => [
139+
'1_PB_PRODUCT',
140+
'a_pb_product',
141+
'C_PB_PRODUCT',
142+
'B_PB_PRODUCT'
143+
],
144+
'price_low_to_high' => [
145+
'B_PB_PRODUCT',
146+
'C_PB_PRODUCT',
147+
'a_pb_product',
148+
'1_PB_PRODUCT'
149+
]
150+
],
151+
]
152+
];
153+
}
154+
155+
/**
156+
* Retrieve SKUs from array
157+
*
158+
* @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
159+
* @return array
160+
*/
161+
private function getSkus(\Magento\Catalog\Model\ResourceModel\Product\Collection $collection): array
162+
{
163+
$skus = [];
164+
foreach ($collection as $product) {
165+
$skus[] = $product->getSku();
166+
}
167+
return $skus;
168+
}
169+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
8+
9+
/* @var $productRepository \Magento\Catalog\Model\ProductRepository */
10+
$productRepository = $objectManager->create(\Magento\Catalog\Model\ProductRepository::class);
11+
12+
/** @var $firstProduct \Magento\Catalog\Model\Product */
13+
$firstProduct = $objectManager->create(\Magento\Catalog\Model\Product::class);
14+
$firstProduct->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
15+
->setId(666)
16+
->setCreatedAt('2010-01-01 01:01:01')
17+
->setUpdatedAt('2010-01-01 01:01:01')
18+
->setAttributeSetId(4)
19+
->setStoreId(1)
20+
->setWebsiteIds([1])
21+
->setName('A Page Builder Product')
22+
->setSku('a_pb_product')
23+
->setPrice(50)
24+
->setWeight(0)
25+
->setStockData(
26+
[
27+
'qty' => 5,
28+
'is_in_stock' => true
29+
]
30+
)
31+
->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
32+
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
33+
34+
$productRepository->save($firstProduct);
35+
36+
/** @var $secondProduct \Magento\Catalog\Model\Product */
37+
$secondProduct = $objectManager->create(\Magento\Catalog\Model\Product::class);
38+
$secondProduct->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
39+
->setId(667)
40+
->setCreatedAt('2017-01-01 01:01:01')
41+
->setUpdatedAt('2017-01-01 01:01:01')
42+
->setAttributeSetId(4)
43+
->setStoreId(1)
44+
->setWebsiteIds([1])
45+
->setName('B Page Builder Product')
46+
->setSku('B_PB_PRODUCT')
47+
->setPrice(0)
48+
->setWeight(0)
49+
->setStockData(
50+
[
51+
'qty' => 0,
52+
'is_in_stock' => false
53+
]
54+
)
55+
->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
56+
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
57+
58+
$productRepository->save($secondProduct);
59+
60+
/** @var $thirdProduct \Magento\Catalog\Model\Product */
61+
$thirdProduct = $objectManager->create(\Magento\Catalog\Model\Product::class);
62+
$thirdProduct->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
63+
->setId(668)
64+
->setCreatedAt('2000-01-01 01:01:01')
65+
->setUpdatedAt('2000-01-01 01:01:01')
66+
->setAttributeSetId(4)
67+
->setStoreId(1)
68+
->setWebsiteIds([1])
69+
->setName('c Page Builder Product')
70+
->setSku('C_PB_PRODUCT')
71+
->setPrice(35)
72+
->setWeight(0)
73+
->setStockData(
74+
[
75+
'qty' => 150,
76+
'is_in_stock' => true
77+
]
78+
)
79+
->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
80+
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
81+
82+
$productRepository->save($thirdProduct);
83+
84+
/** @var $fourthProduct \Magento\Catalog\Model\Product */
85+
$fourthProduct = $objectManager->create(\Magento\Catalog\Model\Product::class);
86+
$fourthProduct->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
87+
->setId(669)
88+
->setCreatedAt('2017-01-05 01:01:01')
89+
->setUpdatedAt('2017-01-05 01:01:01')
90+
->setAttributeSetId(4)
91+
->setStoreId(1)
92+
->setWebsiteIds([1])
93+
->setName('1 Page Builder Product')
94+
->setSku('1_PB_PRODUCT')
95+
->setPrice(99)
96+
->setWeight(0)
97+
->setStockData(
98+
[
99+
'qty' => 2,
100+
'is_in_stock' => true
101+
]
102+
)
103+
->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
104+
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
105+
106+
$productRepository->save($fourthProduct);

0 commit comments

Comments
 (0)