Skip to content

Commit cc13bb9

Browse files
committed
MC-22852: 24/36 product limit on Category page occur fatal
1 parent d9df1c2 commit cc13bb9

File tree

5 files changed

+172
-2
lines changed

5 files changed

+172
-2
lines changed

app/code/Magento/Catalog/Test/Mftf/Data/CatalogStorefrontConfigData.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,13 @@
6060
<entity name="DefaultFlatCatalogCategory" type="flat_catalog_category">
6161
<data key="value">0</data>
6262
</entity>
63+
64+
<entity name="DefaultGridPerPageValuesConfigData">
65+
<data key="path">catalog/frontend/grid_per_page_values</data>
66+
<data key="value">12,24,36</data>
67+
</entity>
68+
<entity name="CustomGridPerPageValuesConfigData">
69+
<data key="path">catalog/frontend/grid_per_page_values</data>
70+
<data key="value">1,2</data>
71+
</entity>
6372
</entities>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
<element name="previousPage" type="button" selector=".//*[@class='toolbar toolbar-products'][2]//a[contains(@class, 'previous')]" timeout="30"/>
1313
<element name="pageNumber" type="text" selector="//*[@class='toolbar toolbar-products'][2]//a[contains(@class, 'page')]//span[2][contains(text() ,'{{var1}}')]" parameterized="true"/>
1414
<element name="perPage" type="select" selector="//*[@class='toolbar toolbar-products'][2]//select[@id='limiter']"/>
15+
<element name="currentPage" type="text" selector=".products.wrapper + .toolbar-products .pages .current span:nth-of-type(2)"/>
1516
</section>
1617
</sections>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="StorefrontQuickSearchWithPaginationActionGroup">
12+
<annotations>
13+
<description>Navigate to catalog search page with prepared GET params to get search results with particular page number.</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="phrase" type="string"/>
17+
<argument name="pageNumber" type="string" defaultValue="1"/>
18+
</arguments>
19+
<amOnPage url="{{StorefrontCatalogSearchPage.url}}?q={{phrase}}&amp;p={{pageNumber}}" stepKey="navigateToCatalogSearchPageWithPreparedRequest"/>
20+
<waitForPageLoad stepKey="waitForCatalogSearchPageLoad"/>
21+
</actionGroup>
22+
</actionGroups>

app/code/Magento/Elasticsearch/Model/ResourceModel/Fulltext/Collection/SearchResultApplier.php

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,45 @@ public function apply()
8585
private function sliceItems(array $items, int $size, int $currentPage): array
8686
{
8787
if ($size !== 0) {
88-
$offset = ($currentPage - 1) * $size;
89-
if ($offset < 0) {
88+
$offset = $this->getOffset($currentPage, $size);
89+
$itemsCount = count($items);
90+
if ($this->isOffsetOutOfRange($offset, $size, $itemsCount)) {
9091
$offset = 0;
9192
}
93+
$maxAllowedPageNumber = ceil($itemsCount/$size);
94+
if ($currentPage > $maxAllowedPageNumber) {
95+
$offset = $this->getOffset($maxAllowedPageNumber, $size);
96+
}
9297
$items = array_slice($items, $offset, $this->size);
9398
}
9499

95100
return $items;
96101
}
102+
103+
104+
105+
/**
106+
* Check that offset could be applied for search result items.
107+
*
108+
* @param int $offset
109+
* @param int $size
110+
* @param int $itemsCount
111+
* @return bool
112+
*/
113+
private function isOffsetOutOfRange(int $offset, int $size, int $itemsCount): bool
114+
{
115+
return $offset < 0 || $itemsCount <= $size;
116+
}
117+
118+
/**
119+
* Check that given page is available in search results.
120+
*
121+
* @param int $pageNumber
122+
* @param int $pageSize
123+
* @return int
124+
*/
125+
private function getOffset(int $pageNumber, int $pageSize): int
126+
{
127+
return ($pageNumber - 1) * $pageSize;
128+
}
97129
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="StorefrontProductQuickSearchUsingElasticSearch6Test">
12+
<annotations>
13+
<features value="CatalogSearch"/>
14+
<stories value="Storefront Search"/>
15+
<title value="Product quick search doesn't throw exception after ES is chosen as search engine with different amount per page"/>
16+
<description value="Verify no elastic search exception is thrown when searching for products, when displayed products per page are greater or equal the size of available products."/>
17+
<severity value="BLOCKER"/>
18+
<testCaseId value="MC-23086"/>
19+
<useCaseId value="MC-22852"/>
20+
<group value="catalog"/>
21+
<group value="elasticsearch"/>
22+
<group value="SearchEngineElasticsearch"/>
23+
<group value="catalog_search"/>
24+
</annotations>
25+
<before>
26+
<createData entity="SimpleSubCategory" stepKey="createCategory"/>
27+
<createData entity="_defaultProduct" stepKey="createFirstProduct">
28+
<field key="name">AAA Product Simple AAA</field>
29+
<requiredEntity createDataKey="createCategory"/>
30+
</createData>
31+
<createData entity="_defaultProduct" stepKey="createSecondProduct">
32+
<field key="name">Product Simple AAA</field>
33+
<requiredEntity createDataKey="createCategory"/>
34+
</createData>
35+
<magentoCLI command="config:set {{CustomGridPerPageValuesConfigData.path}} {{CustomGridPerPageValuesConfigData.value}}" stepKey="setCustomGridPerPageValues"/>
36+
</before>
37+
38+
<after>
39+
<deleteData createDataKey="createFirstProduct" stepKey="deleteFirstProduct"/>
40+
<deleteData createDataKey="createSecondProduct" stepKey="deleteSecondProduct"/>
41+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
42+
<magentoCLI command="config:set {{DefaultGridPerPageValuesConfigData.path}} {{DefaultGridPerPageValuesConfigData.value}}" stepKey="setDefaultGridPerPageValues"/>
43+
</after>
44+
45+
<actionGroup ref="StorefrontOpenHomePageActionGroup" stepKey="openStorefrontHomePage"/>
46+
<actionGroup ref="StorefrontCheckQuickSearchStringActionGroup" stepKey="quickSearchSimpleProduct">
47+
<argument name="phrase" value="AAA"/>
48+
</actionGroup>
49+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertFirstProductOnCatalogSearchPage">
50+
<argument name="product" value="$createFirstProduct$"/>
51+
</actionGroup>
52+
<actionGroup ref="StorefrontCheckProductIsMissingInCategoryProductsPageActionGroup" stepKey="assertSecondProductIsMissingOnCatalogSearchPage">
53+
<argument name="productName" value="$createSecondProduct.name$"/>
54+
</actionGroup>
55+
<click selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="clickNextPageCatalogSearchPager"/>
56+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertSecondProductOnCatalogSearchPage">
57+
<argument name="product" value="$createSecondProduct$"/>
58+
</actionGroup>
59+
<actionGroup ref="StorefrontCheckProductIsMissingInCategoryProductsPageActionGroup" stepKey="assertFirstProductIsMissingOnCatalogSearchPage">
60+
<argument name="productName" value="$createFirstProduct.name$"/>
61+
</actionGroup>
62+
<selectOption selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" userInput="2" stepKey="selectDisplayedProductInGridPerPage"/>
63+
<waitForPageLoad stepKey="waitForPageLoad"/>
64+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertFirstProductDisplayedOnCatalogSearchPage">
65+
<argument name="product" value="$createFirstProduct$"/>
66+
</actionGroup>
67+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertSecondProductDisplayedOnCatalogSearchPage">
68+
<argument name="product" value="$createSecondProduct$"/>
69+
</actionGroup>
70+
</test>
71+
<test name="StorefrontProductQuickSearchUsingElasticSearch6WithNotAvailablePageTest" extends="StorefrontProductQuickSearchUsingElasticSearch6Test">
72+
<annotations>
73+
<features value="CatalogSearch"/>
74+
<stories value="Storefront Search"/>
75+
<title value="Product quick search doesn't throw exception after ES is chosen as search engine with selected page out of range"/>
76+
<description value="Verify no elastic search exception is thrown when try to get page with selected page out of range."/>
77+
<severity value="BLOCKER"/>
78+
<testCaseId value="MC-29123"/>
79+
<useCaseId value="MC-22852"/>
80+
<group value="catalog"/>
81+
<group value="elasticsearch"/>
82+
<group value="SearchEngineElasticsearch"/>
83+
<group value="catalog_search"/>
84+
</annotations>
85+
<remove keyForRemoval="selectDisplayedProductInGridPerPage"/>
86+
<remove keyForRemoval="assertFirstProductDisplayedOnCatalogSearchPage"/>
87+
<remove keyForRemoval="assertSecondProductDisplayedOnCatalogSearchPage"/>
88+
<grabTextFrom selector="{{StorefrontCategoryBottomToolbarSection.currentPage}}" stepKey="grabNumberOfLastPage"/>
89+
<actionGroup ref="StorefrontQuickSearchWithPaginationActionGroup" stepKey="navigateToUnavailableCatalogSearchResultPage">
90+
<argument name="phrase" value="AAA"/>
91+
<argument name="pageNumber" value="999"/>
92+
</actionGroup>
93+
<scrollTo selector="{{StorefrontCategoryBottomToolbarSection.currentPage}}" stepKey="scrollToBottomToolbarPager"/>
94+
<grabTextFrom selector="{{StorefrontCategoryBottomToolbarSection.currentPage}}" stepKey="grabNumberOfCurrentPage"/>
95+
<assertEquals stepKey="assertCurrentPageIsLastPageOfCatalogSearchResult">
96+
<expectedResult type="variable">grabNumberOfLastPage</expectedResult>
97+
<actualResult type="variable">grabNumberOfCurrentPage</actualResult>
98+
</assertEquals>
99+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertProductOnLastCatalogSearchPage">
100+
<argument name="product" value="$createSecondProduct$"/>
101+
</actionGroup>
102+
<actionGroup ref="StorefrontCheckProductIsMissingInCategoryProductsPageActionGroup" stepKey="assertFirstProductIsMissingOnLastCatalogSearchPage">
103+
<argument name="productName" value="$createFirstProduct.name$"/>
104+
</actionGroup>
105+
</test>
106+
</tests>

0 commit comments

Comments
 (0)