Skip to content

Commit 081dbeb

Browse files
authored
Merge pull request #3319 from magento-borg/BugFixPR
[2.3.0-regression] Bug Fixes
2 parents 3b1fb97 + 5009c31 commit 081dbeb

File tree

19 files changed

+1136
-1063
lines changed

19 files changed

+1136
-1063
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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="placeholderBaseImage" type="imageFile">
12+
<data key="file">adobe-base.jpg</data>
13+
<data key="name">adobe-base</data>
14+
<data key="extension">jpg</data>
15+
</entity>
16+
17+
<entity name="placeholderSmallImage" type="imageFile">
18+
<data key="file">adobe-small.jpg</data>
19+
<data key="name">adobe-small</data>
20+
<data key="extension">jpg</data>
21+
</entity>
22+
23+
<entity name="placeholderThumbnailImage" type="imageFile">
24+
<data key="file">adobe-thumb.jpg</data>
25+
<data key="name">adobe-thumb</data>
26+
<data key="extension">jpg</data>
27+
</entity>
28+
</entities>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd">
11+
<section name="AdminProductImagePlaceholderConfigSection">
12+
<element name="sectionHeader" type="text" selector="#catalog_placeholder-head"/>
13+
<!--Base image placeholder-->
14+
<element name="baseImageInput" type="file" selector="#catalog_placeholder_image_placeholder" timeout="10"/>
15+
<element name="baseImageDelete" type="checkbox" selector="#catalog_placeholder_image_placeholder_delete"/>
16+
<element name="baseImage" type="text" selector="#catalog_placeholder_image_placeholder_image"/>
17+
<element name="baseImageBySrc" type="text" selector="#catalog_placeholder_image_placeholder_image[src*='{{var}}']" parameterized="true"/>
18+
19+
<!--Small image placeholder-->
20+
<element name="smallImageInput" type="file" selector="#catalog_placeholder_small_image_placeholder" timeout="10"/>
21+
<element name="smallImageDelete" type="checkbox" selector="#catalog_placeholder_small_image_placeholder_delete"/>
22+
<element name="smallImage" type="text" selector="#catalog_placeholder_small_image_placeholder_image"/>
23+
<element name="smallImageBySrc" type="text" selector="#catalog_placeholder_small_image_placeholder_image[src*='{{var}}']" parameterized="true"/>
24+
25+
<!--Swatch image placeholder-->
26+
<element name="swatchImageInput" type="file" selector="#catalog_placeholder_swatch_image_placeholder" timeout="10"/>
27+
<element name="swatchImageDelete" type="checkbox" selector="#catalog_placeholder_swatch_image_placeholder_delete"/>
28+
<element name="swatchImage" type="text" selector="#catalog_placeholder_swatch_image_placeholder_image"/>
29+
<element name="swatchImageBySrc" type="text" selector="#catalog_placeholder_swatch_image_placeholder_image[src*='{{var}}']" parameterized="true"/>
30+
31+
<!--Thumbnail image placeholder-->
32+
<element name="thumbnailImageInput" type="file" selector="#catalog_placeholder_thumbnail_placeholder" timeout="10"/>
33+
<element name="thumbnailImageDelete" type="checkbox" selector="#catalog_placeholder_thumbnail_placeholder_delete"/>
34+
<element name="thumbnailImage" type="text" selector="#catalog_placeholder_thumbnail_placeholder_image"/>
35+
<element name="thumbnailImageBySrc" type="text" selector="#catalog_placeholder_thumbnail_placeholder_image[src*='{{var}}']" parameterized="true"/>
36+
</section>
37+
</sections>
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
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="AdminConfigureProductImagePlaceholderTest">
12+
13+
<annotations>
14+
<features value="Configuration"/>
15+
<stories value="Configure product placeholder images"/>
16+
<title value="Admin is able to configure product placeholder images"/>
17+
<description value="Admin should be able to configure the images used for product image placeholders. The configured placeholders should be seen on the frontend when an image has no image."/>
18+
<severity value="MAJOR"/>
19+
<testCaseId value="MC-5005"/>
20+
<group value="configuration"/>
21+
</annotations>
22+
23+
<before>
24+
<createData entity="ApiCategory" stepKey="category"/>
25+
<!--Create product with no images-->
26+
<createData entity="ApiSimpleProduct" stepKey="productNoImages">
27+
<requiredEntity createDataKey="category"/>
28+
</createData>
29+
<!--Create product with small, base, and thumbnail image-->
30+
<createData entity="ApiSimpleProduct" stepKey="productWithImages">
31+
<requiredEntity createDataKey="category"/>
32+
</createData>
33+
<createData entity="ApiProductAttributeMediaGalleryEntryTestImage" stepKey="productImage">
34+
<requiredEntity createDataKey="productWithImages"/>
35+
</createData>
36+
</before>
37+
38+
<after>
39+
<!--Unset product image placeholders-->
40+
<amOnPage url="{{CatalogConfigPage.url}}" stepKey="goToCatalogConfigurationPageAfter"/>
41+
<waitForPageLoad stepKey="waitForConfigurationPageLoadAfter"/>
42+
<conditionalClick selector="{{AdminProductImagePlaceholderConfigSection.sectionHeader}}" dependentSelector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" visible="false" stepKey="openPlaceholderSectionAfter"/>
43+
<waitForElementVisible selector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" stepKey="waitForPlaceholderSectionOpenAfter"/>
44+
<!--Delete base placeholder-->
45+
<checkOption selector="{{AdminProductImagePlaceholderConfigSection.baseImageDelete}}" stepKey="checkDeleteBasePlaceholder"/>
46+
<!--Delete small placeholder-->
47+
<checkOption selector="{{AdminProductImagePlaceholderConfigSection.smallImageDelete}}" stepKey="checkDeleteSmallPlaceholder"/>
48+
<!--Delete thumbnail placeholder-->
49+
<checkOption selector="{{AdminProductImagePlaceholderConfigSection.thumbnailImageDelete}}" stepKey="checkDeleteThumbnailPlaceholder"/>
50+
<!--Save config to delete placeholders-->
51+
<click selector="{{AdminMainActionsSection.save}}" stepKey="saveConfigWithPlaceholders"/>
52+
<!--See placeholders are empty-->
53+
<conditionalClick selector="{{AdminProductImagePlaceholderConfigSection.sectionHeader}}" dependentSelector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" visible="false" stepKey="openPlaceholderSection2"/>
54+
<waitForElementVisible selector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" stepKey="waitForPlaceholderSectionOpen2"/>
55+
<dontSeeElement selector="{{AdminProductImagePlaceholderConfigSection.baseImage}}" stepKey="dontSeeBaseImageSet"/>
56+
<dontSeeElement selector="{{AdminProductImagePlaceholderConfigSection.smallImage}}" stepKey="dontSeeSmallImageSet"/>
57+
<dontSeeElement selector="{{AdminProductImagePlaceholderConfigSection.thumbnailImage}}" stepKey="dontSeeThumbnailImageSet"/>
58+
<dontSeeElement selector="{{AdminProductImagePlaceholderConfigSection.swatchImage}}" stepKey="dontSeeSwatchImageSet"/>
59+
60+
<!--Delete prerequisite entities-->
61+
<deleteData createDataKey="category" stepKey="deleteCategory"/>
62+
<deleteData createDataKey="productNoImages" stepKey="deleteProductNoImages"/>
63+
<deleteData createDataKey="productWithImages" stepKey="deleteProductWithImages"/>
64+
</after>
65+
66+
<actionGroup ref="LoginAsAdmin" stepKey="loginToAdminArea"/>
67+
68+
<!--Admin area: configure Product Image Placeholders-->
69+
<comment userInput="Configure product image placeholders in store config" stepKey="configurePlaceholderComment"/>
70+
<amOnPage url="{{CatalogConfigPage.url}}" stepKey="goToCatalogConfigurationPage"/>
71+
<waitForPageLoad stepKey="waitForConfigurationPageLoad1"/>
72+
<conditionalClick selector="{{AdminProductImagePlaceholderConfigSection.sectionHeader}}" dependentSelector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" visible="false" stepKey="openPlaceholderSection1"/>
73+
<waitForElementVisible selector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" stepKey="waitForPlaceholderSectionOpen1"/>
74+
<!--Set base placeholder-->
75+
<attachFile selector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" userInput="{{placeholderBaseImage.file}}" stepKey="uploadBasePlaceholder"/>
76+
<!--Set small placeholder-->
77+
<attachFile selector="{{AdminProductImagePlaceholderConfigSection.smallImageInput}}" userInput="{{placeholderSmallImage.file}}" stepKey="uploadSmallPlaceholder"/>
78+
<!--Set thumbnail placeholder-->
79+
<attachFile selector="{{AdminProductImagePlaceholderConfigSection.thumbnailImageInput}}" userInput="{{placeholderThumbnailImage.file}}" stepKey="uploadThumbnailPlaceholder"/>
80+
<!--Save config with placeholders-->
81+
<click selector="{{AdminMainActionsSection.save}}" stepKey="saveConfigWithPlaceholders"/>
82+
<!--See images are saved-->
83+
<conditionalClick selector="{{AdminProductImagePlaceholderConfigSection.sectionHeader}}" dependentSelector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" visible="false" stepKey="openPlaceholderSection2"/>
84+
<waitForElementVisible selector="{{AdminProductImagePlaceholderConfigSection.baseImageInput}}" stepKey="waitForPlaceholderSectionOpen2"/>
85+
<seeElement selector="{{AdminProductImagePlaceholderConfigSection.baseImageBySrc(placeholderBaseImage.name)}}" stepKey="seeBasePlaceholderSet"/>
86+
<seeElement selector="{{AdminProductImagePlaceholderConfigSection.smallImageBySrc(placeholderSmallImage.name)}}" stepKey="seeSmallPlaceholderSet"/>
87+
<seeElement selector="{{AdminProductImagePlaceholderConfigSection.thumbnailImageBySrc(placeholderThumbnailImage.name)}}" stepKey="seeThumbnailPlaceholderSet"/>
88+
<dontSeeElement selector="{{AdminProductImagePlaceholderConfigSection.swatchImage}}" stepKey="dontSeeSwatchImageSet"/>
89+
90+
<!--See correct placeholder images on category page-->
91+
<comment userInput="Check placeholder images on the storefront" stepKey="checkStorefrontComment"/>
92+
<amOnPage url="$$category.name$$.html" stepKey="goToCategoryStorefront1"/>
93+
<waitForPageLoad stepKey="waitForStorefrontCategory1"/>
94+
<!--Product with no images uses placeholder-->
95+
<seeElement selector="{{StorefrontCategoryProductSection.ProductImageByName($$productNoImages.name$$)}}" stepKey="seeProductNoImagesInCategory"/>
96+
<grabAttributeFrom selector="{{StorefrontCategoryProductSection.ProductImageByName($$productNoImages.name$$)}}" userInput="src" stepKey="getSmallPlaceholderImageSrc"/>
97+
<assertContains stepKey="checkSmallPlaceholderImage">
98+
<actualResult type="variable">$getSmallPlaceholderImageSrc</actualResult>
99+
<expectedResult type="string">{{placeholderSmallImage.name}}</expectedResult>
100+
</assertContains>
101+
<!--Product with images does not use placeholder-->
102+
<seeElement selector="{{StorefrontCategoryProductSection.ProductTitleByName($$productWithImages.name$$)}}" stepKey="seeProductWithImagesInCategory"/>
103+
<grabAttributeFrom selector="{{StorefrontCategoryProductSection.ProductImageByName($$productWithImages.name$$)}}" userInput="src" stepKey="getSmallNonPlaceholderImageSrc"/>
104+
<assertNotContains stepKey="checkSmallPlaceholderImageNotUsed">
105+
<actualResult type="variable">$getSmallNonPlaceholderImageSrc</actualResult>
106+
<expectedResult type="string">{{placeholderSmallImage.name}}</expectedResult>
107+
</assertNotContains>
108+
109+
<!--Check base image on product page-->
110+
<!--Product which is using placeholder-->
111+
<click selector="{{StorefrontCategoryProductSection.ProductImageByName($$productNoImages.name$$)}}" stepKey="goToProductNoImages"/>
112+
<waitForPageLoad stepKey="waitForProductPageLoad1"/>
113+
<seeInCurrentUrl url="$$productNoImages.sku$$" stepKey="seeCorrectProductPage1"/>
114+
<seeElement selector="{{StorefrontProductMediaSection.imageFile(placeholderBaseImage.name)}}" stepKey="seeBasePlaceholderImage"/>
115+
<click selector="{{StorefrontProductPageSection.addToCartBtn}}" stepKey="addProductToCart1"/>
116+
<waitForElementVisible selector="{{StorefrontProductPageSection.successMsg}}" stepKey="waitForProductAdded1"/>
117+
<click selector="{{StorefrontMinicartSection.showCart}}" stepKey="openMiniCart1"/>
118+
<grabAttributeFrom selector="{{StorefrontMinicartSection.productImageByName($$productNoImages.name$$)}}" userInput="src" stepKey="getThumbnailPlaceholderImageSrc"/>
119+
<assertContains stepKey="checkThumbnailPlaceholderImage">
120+
<actualResult type="variable">$getThumbnailPlaceholderImageSrc</actualResult>
121+
<expectedResult type="string">{{placeholderThumbnailImage.name}}</expectedResult>
122+
</assertContains>
123+
<actionGroup ref="removeProductFromMiniCart" stepKey="removeProductFromCart1">
124+
<argument name="productName" value="$$productNoImages.name$$"/>
125+
</actionGroup>
126+
<!--Product which is NOT using placeholder-->
127+
<amOnPage url="$$category.name$$.html" stepKey="goToCategoryStorefront2"/>
128+
<waitForPageLoad stepKey="waitForStorefrontCategory2"/>
129+
<click selector="{{StorefrontCategoryProductSection.ProductImageByName($$productWithImages.name$$)}}" stepKey="goToProductWithImages"/>
130+
<waitForPageLoad stepKey="waitForProductPageLoad2"/>
131+
<seeInCurrentUrl url="$$productWithImages.sku$$" stepKey="seeCorrectProductPage2"/>
132+
<dontSeeElement selector="{{StorefrontProductMediaSection.imageFile(placeholderBaseImage.name)}}" stepKey="dontSeeBasePlaceholderImage"/>
133+
<click selector="{{StorefrontProductPageSection.addToCartBtn}}" stepKey="addProductToCart2"/>
134+
<waitForElementVisible selector="{{StorefrontProductPageSection.successMsg}}" stepKey="waitForProductAdded2"/>
135+
<click selector="{{StorefrontMinicartSection.showCart}}" stepKey="openMiniCart2"/>
136+
<grabAttributeFrom selector="{{StorefrontMinicartSection.productImageByName($$productWithImages.name$$)}}" userInput="src" stepKey="getThumbnailImageSrc"/>
137+
<assertNotContains stepKey="checkThumbnailImage">
138+
<actualResult type="variable">$getThumbnailImageSrc</actualResult>
139+
<expectedResult type="string">{{placeholderThumbnailImage.name}}</expectedResult>
140+
</assertNotContains>
141+
<actionGroup ref="removeProductFromMiniCart" stepKey="removeProductFromCart2">
142+
<argument name="productName" value="$$productWithImages.name$$"/>
143+
</actionGroup>
144+
</test>
145+
</tests>

app/code/Magento/Checkout/Plugin/Model/Quote/ResetQuoteAddresses.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
class ResetQuoteAddresses
1616
{
1717
/**
18+
* Clears the quote addresses when all the items are removed from the cart
19+
*
1820
* @param Quote $quote
1921
* @param Quote $result
2022
* @param mixed $itemId
21-
*
2223
* @return Quote
2324
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
2425
*/
@@ -28,6 +29,10 @@ public function afterRemoveItem(Quote $quote, Quote $result, $itemId): Quote
2829
foreach ($result->getAllAddresses() as $address) {
2930
$result->removeAddress($address->getId());
3031
}
32+
$extensionAttributes = $result->getExtensionAttributes();
33+
if (!$result->isVirtual() && $extensionAttributes && $extensionAttributes->getShippingAssignments()) {
34+
$extensionAttributes->setShippingAssignments([]);
35+
}
3136
}
3237

3338
return $result;

app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontMiniCartActionGroup.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,18 @@
2121
<waitForElementVisible selector="{{StorefrontMinicartSection.viewAndEditCart}}" stepKey="waitForViewAndEditCartVisible"/>
2222
<see selector="{{StorefrontMinicartSection.miniCartItemsText}}" userInput="{{productName}}" stepKey="seeInMiniCart"/>
2323
</actionGroup>
24+
25+
<!--Remove an item from the cart using minicart-->
26+
<actionGroup name="removeProductFromMiniCart">
27+
<arguments>
28+
<argument name="productName" type="string"/>
29+
</arguments>
30+
<conditionalClick selector="{{StorefrontMinicartSection.showCart}}" dependentSelector="{{StorefrontMinicartSection.miniCartOpened}}" visible="false" stepKey="openMiniCart"/>
31+
<waitForElementVisible selector="{{StorefrontMinicartSection.viewAndEditCart}}" stepKey="waitForMiniCartOpen"/>
32+
<click selector="{{StorefrontMinicartSection.deleteMiniCartItemByName(productName)}}" stepKey="clickDelete"/>
33+
<waitForElementVisible selector="{{StoreFrontRemoveItemModalSection.message}}" stepKey="waitForConfirmationModal"/>
34+
<see selector="{{StoreFrontRemoveItemModalSection.message}}" userInput="Are you sure you would like to remove this item from the shopping cart?" stepKey="seeDeleteConfirmationMessage"/>
35+
<click selector="{{StoreFrontRemoveItemModalSection.ok}}" stepKey="confirmDelete"/>
36+
<waitForPageLoad stepKey="waitForDeleteToFinish"/>
37+
</actionGroup>
2438
</actionGroups>

app/code/Magento/Checkout/Test/Mftf/Section/StorefrontMiniCartSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<element name="viewAndEditCart" type="button" selector=".action.viewcart" timeout="30"/>
2323
<element name="miniCartItemsText" type="text" selector=".minicart-items"/>
2424
<element name="deleteMiniCartItem" type="button" selector=".action.delete" timeout="30"/>
25+
<element name="deleteMiniCartItemByName" type="button" selector="//ol[@id='mini-cart']//div[contains(., '{{var}}')]//a[contains(@class, 'delete')]" parameterized="true"/>
2526
<element name="miniCartSubtotalField" type="text" selector=".block-minicart .amount span.price"/>
2627
<element name="itemQuantity" type="input" selector="//a[text()='{{productName}}']/../..//input[contains(@class,'cart-item-qty')]" parameterized="true"/>
2728
<element name="itemQuantityUpdate" type="button" selector="//a[text()='{{productName}}']/../..//span[text()='Update']" parameterized="true"/>

0 commit comments

Comments
 (0)