Skip to content

Commit 16771da

Browse files
committed
Merge remote-tracking branch 'origin/MC-25138' into 2.4-develop-pr5
2 parents 420a8b6 + 8027f29 commit 16771da

File tree

6 files changed

+233
-69
lines changed

6 files changed

+233
-69
lines changed
Lines changed: 72 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,72 @@
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-
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10-
xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd">
11-
<entity name="RememberPaginationCatalogStorefrontConfig" type="catalog_storefront_config">
12-
<requiredEntity type="grid_per_page_values">GridPerPageValues</requiredEntity>
13-
<requiredEntity type="remember_pagination">RememberCategoryPagination</requiredEntity>
14-
</entity>
15-
16-
<entity name="GridPerPageValues" type="grid_per_page_values">
17-
<data key="value">9,12,20,24</data>
18-
</entity>
19-
20-
<entity name="RememberCategoryPagination" type="remember_pagination">
21-
<data key="value">1</data>
22-
</entity>
23-
24-
<entity name="DefaultCatalogStorefrontConfiguration" type="default_catalog_storefront_config">
25-
<requiredEntity type="catalogStorefrontFlagZero">DefaultCatalogStorefrontFlagZero</requiredEntity>
26-
<data key="list_allow_all">DefaultListAllowAll</data>
27-
<data key="flat_catalog_product">DefaultFlatCatalogProduct</data>
28-
</entity>
29-
30-
<entity name="DefaultCatalogStorefrontFlagZero" type="catalogStorefrontFlagZero">
31-
<data key="value">0</data>
32-
</entity>
33-
34-
<entity name="DefaultListAllowAll" type="list_allow_all">
35-
<data key="value">0</data>
36-
</entity>
37-
38-
<entity name="DefaultFlatCatalogProduct" type="flat_catalog_product">
39-
<data key="value">0</data>
40-
</entity>
41-
42-
<entity name="UseFlatCatalogCategoryAndProduct" type="catalog_storefront_config">
43-
<requiredEntity type="flat_catalog_product">UseFlatCatalogProduct</requiredEntity>
44-
<requiredEntity type="flat_catalog_category">UseFlatCatalogCategory</requiredEntity>
45-
</entity>
46-
47-
<entity name="UseFlatCatalogProduct" type="flat_catalog_product">
48-
<data key="value">1</data>
49-
</entity>
50-
51-
<entity name="UseFlatCatalogCategory" type="flat_catalog_category">
52-
<data key="value">1</data>
53-
</entity>
54-
55-
<entity name="DefaultFlatCatalogCategoryAndProduct" type="catalog_storefront_config">
56-
<requiredEntity type="flat_catalog_product">DefaultFlatCatalogProduct</requiredEntity>
57-
<requiredEntity type="flat_catalog_category">DefaultFlatCatalogCategory</requiredEntity>
58-
</entity>
59-
60-
<entity name="DefaultFlatCatalogCategory" type="flat_catalog_category">
61-
<data key="value">0</data>
62-
</entity>
63-
</entities>
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+
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd">
11+
<entity name="RememberPaginationCatalogStorefrontConfig" type="catalog_storefront_config">
12+
<requiredEntity type="grid_per_page_values">GridPerPageValues</requiredEntity>
13+
<requiredEntity type="remember_pagination">RememberCategoryPagination</requiredEntity>
14+
</entity>
15+
16+
<entity name="GridPerPageValues" type="grid_per_page_values">
17+
<data key="value">9,12,20,24</data>
18+
</entity>
19+
20+
<entity name="RememberCategoryPagination" type="remember_pagination">
21+
<data key="value">1</data>
22+
</entity>
23+
24+
<entity name="DefaultCatalogStorefrontConfiguration" type="default_catalog_storefront_config">
25+
<requiredEntity type="catalogStorefrontFlagZero">DefaultCatalogStorefrontFlagZero</requiredEntity>
26+
<data key="list_allow_all">DefaultListAllowAll</data>
27+
<data key="flat_catalog_product">DefaultFlatCatalogProduct</data>
28+
</entity>
29+
30+
<entity name="DefaultCatalogStorefrontFlagZero" type="catalogStorefrontFlagZero">
31+
<data key="value">0</data>
32+
</entity>
33+
34+
<entity name="DefaultListAllowAll" type="list_allow_all">
35+
<data key="value">0</data>
36+
</entity>
37+
38+
<entity name="DefaultFlatCatalogProduct" type="flat_catalog_product">
39+
<data key="value">0</data>
40+
</entity>
41+
42+
<entity name="UseFlatCatalogCategoryAndProduct" type="catalog_storefront_config">
43+
<requiredEntity type="flat_catalog_product">UseFlatCatalogProduct</requiredEntity>
44+
<requiredEntity type="flat_catalog_category">UseFlatCatalogCategory</requiredEntity>
45+
</entity>
46+
47+
<entity name="UseFlatCatalogProduct" type="flat_catalog_product">
48+
<data key="value">1</data>
49+
</entity>
50+
51+
<entity name="UseFlatCatalogCategory" type="flat_catalog_category">
52+
<data key="value">1</data>
53+
</entity>
54+
55+
<entity name="DefaultFlatCatalogCategoryAndProduct" type="catalog_storefront_config">
56+
<requiredEntity type="flat_catalog_product">DefaultFlatCatalogProduct</requiredEntity>
57+
<requiredEntity type="flat_catalog_category">DefaultFlatCatalogCategory</requiredEntity>
58+
</entity>
59+
60+
<entity name="DefaultFlatCatalogCategory" type="flat_catalog_category">
61+
<data key="value">0</data>
62+
</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>
72+
</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" defaultValue="{{_defaultProduct.name}}"/>
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: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public function apply()
6060
{
6161
if (empty($this->searchResult->getItems())) {
6262
$this->collection->getSelect()->where('NULL');
63+
6364
return;
6465
}
6566

@@ -85,15 +86,33 @@ public function apply()
8586
private function sliceItems(array $items, int $size, int $currentPage): array
8687
{
8788
if ($size !== 0) {
88-
$totalPages = (int) ceil(count($items)/$size);
89-
$currentPage = min($currentPage, $totalPages);
90-
$offset = ($currentPage - 1) * $size;
91-
if ($offset < 0) {
92-
$offset = 0;
89+
// Check that current page is in a range of allowed page numbers, based on items count and items per page,
90+
// than calculate offset for slicing items array.
91+
$itemsCount = count($items);
92+
$maxAllowedPageNumber = ceil($itemsCount/$size);
93+
if ($currentPage < 1) {
94+
$currentPage = 1;
95+
}
96+
if ($currentPage > $maxAllowedPageNumber) {
97+
$currentPage = $maxAllowedPageNumber;
9398
}
94-
$items = array_slice($items, $offset, $this->size);
99+
100+
$offset = $this->getOffset($currentPage, $size);
101+
$items = array_slice($items, $offset, $size);
95102
}
96103

97104
return $items;
98105
}
106+
107+
/**
108+
* Get offset for given page.
109+
*
110+
* @param int $pageNumber
111+
* @param int $pageSize
112+
* @return int
113+
*/
114+
private function getOffset(int $pageNumber, int $pageSize): int
115+
{
116+
return ($pageNumber - 1) * $pageSize;
117+
}
99118
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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-28917"/>
19+
<useCaseId value="MC-25138"/>
20+
<group value="catalog"/>
21+
<group value="elasticsearch"/>
22+
<group value="SearchEngineElasticsearch"/>
23+
<group value="catalog_search"/>
24+
</annotations>
25+
<before>
26+
<createData entity="SimpleProduct2" stepKey="createFirstProduct">
27+
<field key="name">AAA Product Simple AAA</field>
28+
</createData>
29+
<createData entity="SimpleProduct2" stepKey="createSecondProduct">
30+
<field key="name">Product Simple AAA</field>
31+
</createData>
32+
<magentoCLI command="config:set {{CustomGridPerPageValuesConfigData.path}} {{CustomGridPerPageValuesConfigData.value}}" stepKey="setCustomGridPerPageValues"/>
33+
</before>
34+
35+
<after>
36+
<deleteData createDataKey="createFirstProduct" stepKey="deleteFirstProduct"/>
37+
<deleteData createDataKey="createSecondProduct" stepKey="deleteSecondProduct"/>
38+
<magentoCLI command="config:set {{DefaultGridPerPageValuesConfigData.path}} {{DefaultGridPerPageValuesConfigData.value}}" stepKey="setDefaultGridPerPageValues"/>
39+
</after>
40+
41+
<actionGroup ref="StorefrontOpenHomePageActionGroup" stepKey="openStorefrontHomePage"/>
42+
<actionGroup ref="StorefrontCheckQuickSearchStringActionGroup" stepKey="quickSearchSimpleProduct">
43+
<argument name="phrase" value="AAA"/>
44+
</actionGroup>
45+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertFirstProductOnCatalogSearchPage">
46+
<argument name="product" value="$createFirstProduct$"/>
47+
</actionGroup>
48+
<actionGroup ref="StorefrontCheckProductIsMissingInCategoryProductsPageActionGroup" stepKey="assertSecondProductIsMissingOnCatalogSearchPage">
49+
<argument name="productName" value="$createSecondProduct.name$"/>
50+
</actionGroup>
51+
<click selector="{{StorefrontCategoryBottomToolbarSection.nextPage}}" stepKey="clickNextPageCatalogSearchPager"/>
52+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertSecondProductOnCatalogSearchPage">
53+
<argument name="product" value="$createSecondProduct$"/>
54+
</actionGroup>
55+
<actionGroup ref="StorefrontCheckProductIsMissingInCategoryProductsPageActionGroup" stepKey="assertFirstProductIsMissingOnCatalogSearchPage">
56+
<argument name="productName" value="$createFirstProduct.name$"/>
57+
</actionGroup>
58+
<selectOption selector="{{StorefrontCategoryBottomToolbarSection.perPage}}" userInput="2" stepKey="selectDisplayedProductInGridPerPage"/>
59+
<waitForPageLoad stepKey="waitForPageLoad"/>
60+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertFirstProductDisplayedOnCatalogSearchPage">
61+
<argument name="product" value="$createFirstProduct$"/>
62+
</actionGroup>
63+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertSecondProductDisplayedOnCatalogSearchPage">
64+
<argument name="product" value="$createSecondProduct$"/>
65+
</actionGroup>
66+
</test>
67+
</tests>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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="StorefrontProductQuickSearchUsingElasticSearch6WithNotAvailablePageTest" extends="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 selected page out of range"/>
16+
<description value="Verify no elastic search exception is thrown when try to get page with selected page out of range."/>
17+
<severity value="BLOCKER"/>
18+
<testCaseId value="MC-29383"/>
19+
<useCaseId value="MC-25138"/>
20+
<group value="catalog"/>
21+
<group value="elasticsearch"/>
22+
<group value="SearchEngineElasticsearch"/>
23+
<group value="catalog_search"/>
24+
</annotations>
25+
<remove keyForRemoval="selectDisplayedProductInGridPerPage"/>
26+
<remove keyForRemoval="assertFirstProductDisplayedOnCatalogSearchPage"/>
27+
<remove keyForRemoval="assertSecondProductDisplayedOnCatalogSearchPage"/>
28+
<grabTextFrom selector="{{StorefrontCategoryBottomToolbarSection.currentPage}}" stepKey="grabNumberOfLastPage"/>
29+
<actionGroup ref="StorefrontQuickSearchWithPaginationActionGroup" stepKey="navigateToUnavailableCatalogSearchResultPage">
30+
<argument name="phrase" value="AAA"/>
31+
<argument name="pageNumber" value="999"/>
32+
</actionGroup>
33+
<scrollTo selector="{{StorefrontCategoryBottomToolbarSection.currentPage}}" stepKey="scrollToBottomToolbarPager"/>
34+
<grabTextFrom selector="{{StorefrontCategoryBottomToolbarSection.currentPage}}" stepKey="grabNumberOfCurrentPage"/>
35+
<assertEquals stepKey="assertCurrentPageIsLastPageOfCatalogSearchResult">
36+
<expectedResult type="variable">grabNumberOfLastPage</expectedResult>
37+
<actualResult type="variable">grabNumberOfCurrentPage</actualResult>
38+
</assertEquals>
39+
<actionGroup ref="AssertProductOnCategoryPageActionGroup" stepKey="assertProductOnLastCatalogSearchPage">
40+
<argument name="product" value="$createSecondProduct$"/>
41+
</actionGroup>
42+
<actionGroup ref="StorefrontCheckProductIsMissingInCategoryProductsPageActionGroup" stepKey="assertFirstProductIsMissingOnLastCatalogSearchPage">
43+
<argument name="productName" value="$createFirstProduct.name$"/>
44+
</actionGroup>
45+
</test>
46+
</tests>

0 commit comments

Comments
 (0)