Skip to content

Commit d3e9c19

Browse files
merge magento/2.4-develop into magento-borg/MC-34573
2 parents bf6ef85 + 2d65211 commit d3e9c19

4 files changed

+251
-2
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,8 @@
265265
<data key="level">0</data>
266266
<var key="parent_id" entityType="category" entityKey="id"/>
267267
</entity>
268+
<entity name="AssignProductToCategory" type="category_product_link">
269+
<var key="category_id" entityKey="id" entityType="category"/>
270+
<var key="sku" entityKey="sku" entityType="product"/>
271+
</entity>
268272
</entities>

app/code/Magento/Catalog/Test/Mftf/Metadata/CategoryMeta.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,12 @@
5757
<operation name="DeleteCategory" dataType="category" type="delete" auth="adminOauth" url="/V1/categories/{id}" method="DELETE">
5858
<contentType>application/json</contentType>
5959
</operation>
60+
61+
<operation name="AssignProductToCategory" dataType="category_product_link" type="create" auth="adminOauth" url="/V1/categories/{id}/products" method="POST">
62+
<contentType>application/json</contentType>
63+
<object key="productLink" dataType="category_product_link">
64+
<field key="sku">string</field>
65+
<field key="category_id">string</field>
66+
</object>
67+
</operation>
6068
</operations>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
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="StorefrontVerifyCategoryProductAndProductCategoryPartialReindexTest">
12+
<annotations>
13+
<features value="Catalog"/>
14+
<stories value="Product Categories Indexer"/>
15+
<title value="Verify Category Product and Product Category partial reindex"/>
16+
<description value="Verify that Merchant Developer can use console commands to perform partial reindex for Category Products, Product Categories, and Catalog Search"/>
17+
<severity value="CRITICAL"/>
18+
<testCaseId value="MC-11386"/>
19+
<useCaseId value="MAGETWO-88184"/>
20+
<group value="catalog"/>
21+
<group value="indexer"/>
22+
</annotations>
23+
<before>
24+
<!-- Change "Category Products", "Product Categories" and "Catalog Search" indexers to "Update by Schedule" mode -->
25+
<magentoCLI command="indexer:set-mode" arguments="schedule catalog_category_product catalog_product_category catalogsearch_fulltext" stepKey="setIndexerMode"/>
26+
27+
<!-- Create categories K, L, M, N with different nesting in the tree and Anchor = Yes/No-->
28+
<!-- Category K is an anchor category -->
29+
<createData entity="_defaultCategory" stepKey="categoryK"/>
30+
<!-- Category L is a non-anchor subcategory of category K -->
31+
<createData entity="SubCategoryNonAnchor" stepKey="categoryL">
32+
<requiredEntity createDataKey="categoryK"/>
33+
</createData>
34+
<!-- Category M is a subcategory of category L -->
35+
<createData entity="SubCategoryWithParent" stepKey="categoryM">
36+
<requiredEntity createDataKey="categoryL"/>
37+
</createData>
38+
<!-- Category N is a subcategory of category K -->
39+
<createData entity="SubCategoryWithParent" stepKey="categoryN">
40+
<requiredEntity createDataKey="categoryK"/>
41+
</createData>
42+
43+
<!-- Create different Products with different settings, assign to categories: -->
44+
<!-- Product A in 0 categories, i.e. not assigned to any category -->
45+
<createData entity="SimpleProduct2" stepKey="productA"/>
46+
<!-- Product B in 1 category M -->
47+
<createData entity="SimpleProduct3" stepKey="productB">
48+
<requiredEntity createDataKey="categoryM"/>
49+
</createData>
50+
<!-- Product C in 2 categories M and N -->
51+
<createData entity="SimpleProduct2" stepKey="productC"/>
52+
<createData entity="AssignProductToCategory" stepKey="assignCategoryMToProductC">
53+
<requiredEntity createDataKey="categoryM"/>
54+
<requiredEntity createDataKey="productC"/>
55+
</createData>
56+
<createData entity="AssignProductToCategory" stepKey="assignCategoryNToProductC">
57+
<requiredEntity createDataKey="categoryN"/>
58+
<requiredEntity createDataKey="productC"/>
59+
</createData>
60+
<magentoCron groups="index" stepKey="reindexInvalidatedIndices"/>
61+
</before>
62+
<after>
63+
<!-- Change indexers to "Update on Save" mode -->
64+
<magentoCLI command="indexer:set-mode" arguments="realtime" stepKey="setRealtimeMode"/>
65+
66+
<!-- Delete data -->
67+
<deleteData createDataKey="productA" stepKey="deleteProductA"/>
68+
<deleteData createDataKey="productB" stepKey="deleteProductB"/>
69+
<deleteData createDataKey="productC" stepKey="deleteProductC"/>
70+
<deleteData createDataKey="categoryN" stepKey="deleteCategoryN"/>
71+
<deleteData createDataKey="categoryM" stepKey="deleteCategoryM"/>
72+
<deleteData createDataKey="categoryL" stepKey="deleteCategoryL"/>
73+
<deleteData createDataKey="categoryK" stepKey="deleteCategoryK"/>
74+
<magentoCron groups="index" stepKey="reindexInvalidatedIndices"/>
75+
</after>
76+
77+
<!-- Open categories K, L, M, N on Storefront -->
78+
<!-- Category K contains only Products B & C -->
79+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$)}}" stepKey="onCategoryK"/>
80+
<see userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductBOnCategoryK"/>
81+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductCOnCategoryK"/>
82+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAOnCategoryK"/>
83+
84+
<!-- Category L contains no Products -->
85+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$)}}" stepKey="onCategoryL"/>
86+
<see userInput="We can't find products matching the selection." selector="{{StorefrontCategoryMainSection.emptyProductMessage}}" stepKey="seeMessage"/>
87+
<dontSeeElement selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontseeProducts"/>
88+
89+
<!-- Category M contains only Products B & C -->
90+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$/$categoryM.custom_attributes[url_key]$)}}" stepKey="onCategoryM"/>
91+
<see userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductBOnCategoryM"/>
92+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductCOnCategoryM"/>
93+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAOnCategoryM"/>
94+
95+
<!-- Category N contains only Product C -->
96+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryN.custom_attributes[url_key]$)}}" stepKey="onCategoryN"/>
97+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductCOnCategoryN"/>
98+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAOnCategoryN"/>
99+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductBOnCategoryN"/>
100+
101+
<!-- Assign category K to Product A -->
102+
<createData entity="AssignProductToCategory" stepKey="assignCategoryKToProductA">
103+
<requiredEntity createDataKey="categoryK"/>
104+
<requiredEntity createDataKey="productA"/>
105+
</createData>
106+
107+
<!-- Unassign category M from Product B -->
108+
<deleteData url="/V1/categories/$categoryM.id$/products/$productB.sku$" stepKey="unassignCategoryMFromProductB"/>
109+
110+
<!-- Assign category L to Product C -->
111+
<createData entity="AssignProductToCategory" stepKey="assignCategoryLToProductC">
112+
<requiredEntity createDataKey="categoryL"/>
113+
<requiredEntity createDataKey="productC"/>
114+
</createData>
115+
116+
<!-- Open categories K, L, M, N on Storefront in order to make sure that new assignments are not applied yet -->
117+
<!-- Category K contains only Products B & C -->
118+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$)}}" stepKey="amOnCategoryK"/>
119+
<see userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductBCategoryK"/>
120+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductCCategoryK"/>
121+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductACategoryN"/>
122+
123+
<!-- Category L contains no Products -->
124+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$)}}" stepKey="amOnCategoryL"/>
125+
<see userInput="We can't find products matching the selection." selector="{{StorefrontCategoryMainSection.emptyProductMessage}}" stepKey="seeEmptyMessage"/>
126+
<dontSeeElement selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontseeProduct"/>
127+
128+
<!-- Category M contains only Products B & C -->
129+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$/$categoryM.custom_attributes[url_key]$)}}" stepKey="amOnCategoryM"/>
130+
<see userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductBCategoryM"/>
131+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductCCategoryM"/>
132+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAInCategoryM"/>
133+
134+
<!-- Category N contains only Product C -->
135+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryN.custom_attributes[url_key]$)}}" stepKey="amOnCategoryN"/>
136+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductInCategoryN"/>
137+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAInCategoryN"/>
138+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductBInCategoryN"/>
139+
140+
<!-- Run cron -->
141+
<magentoCron groups="index" stepKey="runCronIndex"/>
142+
143+
<!-- Open categories K, L, M, N on Storefront in order to make sure that new assignments are applied -->
144+
<!-- Category K contains only Products A, C -->
145+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$)}}" stepKey="storefrontCategoryK"/>
146+
<see userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductAOnCategoryK"/>
147+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeCategoryKWithProductC"/>
148+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryKWithProductB"/>
149+
150+
<!-- Category L contains only Product C -->
151+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$)}}" stepKey="storefrontCategoryL"/>
152+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeCategoryLWithProductC"/>
153+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryLWithProductA"/>
154+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryLWithProductB"/>
155+
156+
<!-- Category M contains only Product C -->
157+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$/$categoryM.custom_attributes[url_key]$)}}" stepKey="storefrontCategoryM"/>
158+
<waitForPageLoad stepKey="waitForStorefrontCategoryM"/>
159+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeCategoryMAndProductC"/>
160+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryMAndProductA"/>
161+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryMAndProductB"/>
162+
163+
<!-- Category N contains only Product C -->
164+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryN.custom_attributes[url_key]$)}}" stepKey="storefrontCategoryN"/>
165+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductCAndCategoryN"/>
166+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAAndCategoryN"/>
167+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductBAndCategoryN"/>
168+
169+
<!-- Remove Product A assignment for category K -->
170+
<deleteData url="/V1/categories/$categoryK.id$/products/$productA.sku$" stepKey="unassignCategoryKFromProductA"/>
171+
172+
<!-- Remove Product C assignment for category L -->
173+
<deleteData url="/V1/categories/$categoryL.id$/products/$productC.sku$" stepKey="unassignCategoryLFromProductC"/>
174+
175+
<!-- Add Product B assignment for category N -->
176+
<createData entity="AssignProductToCategory" stepKey="assignCategoryNToProductB">
177+
<requiredEntity createDataKey="categoryN"/>
178+
<requiredEntity createDataKey="productB"/>
179+
</createData>
180+
181+
<!-- Open categories K, L, M, N on Storefront in order to make sure that new assignments are not applied yet -->
182+
<!-- Category K contains only Products A, C -->
183+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$)}}" stepKey="onStorefrontCategoryK"/>
184+
<see userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductAWithCategoryK"/>
185+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductC"/>
186+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductB"/>
187+
188+
<!-- Category L contains only Product C -->
189+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$)}}" stepKey="onStorefrontCategoryL"/>
190+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeCategoryLAndProductC"/>
191+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryLAndProductA"/>
192+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryLAndProductB"/>
193+
194+
<!-- Category M contains only Product C -->
195+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$/$categoryM.custom_attributes[url_key]$)}}" stepKey="onStorefrontCategoryM"/>
196+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeCategoryMWithProductC"/>
197+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryMWithProductA"/>
198+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryMWithProductB"/>
199+
200+
<!-- Category N contains only Product C -->
201+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryN.custom_attributes[url_key]$)}}" stepKey="onStorefrontCategoryN"/>
202+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="productCOnCategoryN"/>
203+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAOnTheCategoryN"/>
204+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductBOnTheCategoryN"/>
205+
206+
<!-- Run Cron once to reindex product changes -->
207+
<magentoCron groups="index" stepKey="runCronIndex2"/>
208+
209+
<!-- Open categories K, L, M, N on Storefront in order to make sure that new assignments are applied -->
210+
211+
<!-- Category K contains only Products B & C -->
212+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$)}}" stepKey="onFrontendCategoryK"/>
213+
<see userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="productBOnCategoryK"/>
214+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="productCOnCategoryK"/>
215+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAOnTheCategoryK"/>
216+
217+
<!-- Category L contains no Products -->
218+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$)}}" stepKey="onFrontendCategoryL"/>
219+
<see userInput="We can't find products matching the selection." selector="{{StorefrontCategoryMainSection.emptyProductMessage}}" stepKey="noProductsMessage"/>
220+
<dontSeeElement selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductsOnCategoryL"/>
221+
222+
<!-- Category M contains only Product C -->
223+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryL.custom_attributes[url_key]$/$categoryM.custom_attributes[url_key]$)}}" stepKey="onFrontendCategoryM"/>
224+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeCategoryMPageAndProductC"/>
225+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryMPageAndProductA"/>
226+
<dontSee userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeCategoryMPageAndProductB"/>
227+
228+
<!-- Category N contains only Products B and C -->
229+
<amOnPage url="{{StorefrontCategoryPage.url($categoryK.custom_attributes[url_key]$/$categoryN.custom_attributes[url_key]$)}}" stepKey="onFrontendCategoryN"/>
230+
<see userInput="$productB.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductBAndCategoryN"/>
231+
<see userInput="$productC.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductCCategoryN"/>
232+
<dontSee userInput="$productA.name$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="dontSeeProductAWithCategoryN"/>
233+
</test>
234+
</tests>

0 commit comments

Comments
 (0)