Skip to content

Commit 273d67a

Browse files
committed
ACP2E-64: Bundle Products Special Price Column in Grid should have % sign not currency sign
- Fixed the CR comments
1 parent 135ad9c commit 273d67a

File tree

3 files changed

+95
-91
lines changed

3 files changed

+95
-91
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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="AdminAssertSpecialPriceAttributeValueOnProductGridPageActionGroup">
12+
<annotations>
13+
<description>Assert special price attribute value from the catalog product grid page</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="expectedValue" type="string"/>
17+
<argument name="actualValue" type="string"/>
18+
</arguments>
19+
<assertStringContainsString stepKey="assertSpecialPricePercentageSymbol">
20+
<expectedResult type="string">{{expectedValue}}</expectedResult>
21+
<actualResult type="variable">{{actualValue}}</actualResult>
22+
</assertStringContainsString>
23+
</actionGroup>
24+
</actionGroups>

app/code/Magento/Bundle/Test/Mftf/Test/AdminValidateSpecialPricePercentageSymbolInCatalogProductGridTest.xml

Lines changed: 54 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
1010
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11-
<test name="AdminValidateSpecialPricePercentageSymbolInCatalogProductGridTest">
11+
<test name="AdminBundleProductPriceSymbolValidationInGridTest">
1212
<annotations>
1313
<features value="Bundle"/>
1414
<stories value="Bundle Products Special Price Column in admin Grid should have % sign not currency sign"/>
@@ -20,71 +20,85 @@
2020
<group value="Bundle"/>
2121
</annotations>
2222
<before>
23+
<!-- Create a simple product -->
2324
<createData entity="SimpleProduct2" stepKey="simpleProduct1"/>
24-
<!--Admin login-->
25-
<actionGroup stepKey="loginToAdminPanel" ref="AdminLoginActionGroup"/>
25+
<!-- Admin login -->
26+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginToAdminPanel"/>
2627
</before>
2728
<after>
28-
<deleteData createDataKey="simpleProduct1" stepKey="deleteSimpleProduct1"/>
29+
<!-- Navigate to catalog product index page -->
2930
<actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="navigateToProductIndexPage"/>
31+
<!-- Clear all the search filter -->
32+
<conditionalClick selector="{{AdminProductGridFilterSection.clearAll}}" dependentSelector="{{AdminProductGridFilterSection.clearAll}}" visible="true" stepKey="clickClearAll"/>
33+
<!-- Set product grid to default columns -->
34+
<actionGroup ref="ResetProductGridToDefaultViewActionGroup" stepKey="setProductGridToDefaultColumns"/>
35+
<!-- Open the column dropdown to reset the default columns from the catalog product grid -->
36+
<actionGroup ref="ToggleAdminProductGridColumnsDropdownActionGroup" stepKey="openColumnsDropdownToReset"/>
37+
<actionGroup ref="ResetAdminProductGridColumnsActionGroup" stepKey="resetProductGridColumns"/>
38+
<actionGroup ref="ToggleAdminProductGridColumnsDropdownActionGroup" stepKey="closeColumnsDropdownAfterReset"/>
39+
<!-- Delete all the products from the catalog product grid -->
3040
<actionGroup ref="DeleteProductsIfTheyExistActionGroup" stepKey="deleteAllProducts"/>
31-
<!--Logging out-->
41+
<!-- Logging out -->
3242
<actionGroup ref="AdminLogoutActionGroup" stepKey="logout"/>
3343
</after>
34-
<!--Go to bundle product creation page-->
35-
<amOnPage url="{{AdminProductCreatePage.url(BundleProduct.set, BundleProduct.type)}}" stepKey="goToBundleProductCreationPage"/>
36-
<waitForPageLoad stepKey="waitForBundleProductCreatePageToLoad"/>
44+
<!-- Go to bundle product creation page -->
45+
<actionGroup ref="AdminOpenNewProductFormPageActionGroup" stepKey="openNewBundleProductPage">
46+
<argument name="productType" value="{{BundleProduct.type}}"/>
47+
<argument name="attributeSetId" value="{{BundleProduct.set}}"/>
48+
</actionGroup>
49+
<!-- Sets the provided Special Price on the Admin Product creation/edit page. -->
3750
<actionGroup ref="AddSpecialPriceToProductActionGroup" stepKey="addSpecialPrice">
3851
<argument name="price" value="{{SimpleProductWithSpecialPrice.special_price}}"/>
3952
</actionGroup>
40-
<!-- Add single bundle item -->
41-
<conditionalClick selector="{{AdminProductFormBundleSection.bundleItemsToggle}}" dependentSelector="{{AdminProductFormBundleSection.bundleItemsToggle}}" visible="false" stepKey="conditionallyOpenSectionBundleItems"/>
42-
<click selector="{{AdminProductFormBundleSection.addOption}}" stepKey="clickAddOption3"/>
43-
<waitForElementVisible selector="{{AdminProductFormBundleSection.bundleOptionXTitle('0')}}" stepKey="waitForBundleOptions"/>
44-
<fillField selector="{{AdminProductFormBundleSection.bundleOptionXTitle('0')}}" userInput="{{BundleProduct.optionTitle1}}" stepKey="fillOptionTitle"/>
45-
<selectOption selector="{{AdminProductFormBundleSection.bundleOptionXInputType('0')}}" userInput="{{BundleProduct.optionInputType1}}" stepKey="selectInputType"/>
46-
<actionGroup ref="AdminClickAddProductToOptionActionGroup" stepKey="clickAddProductsToOption"/>
47-
<actionGroup ref="FilterProductGridBySkuActionGroup" stepKey="filterBundleProductOptions">
48-
<argument name="product" value="$$simpleProduct1$$"/>
53+
<!-- Add the bundle option to the product -->
54+
<actionGroup ref="AddBundleOptionWithOneProductActionGroup" stepKey="addBundleOption">
55+
<argument name="x" value="0"/>
56+
<argument name="n" value="1"/>
57+
<argument name="prodOneSku" value="$$simpleProduct1.sku$$"/>
58+
<argument name="prodTwoSku" value=""/>
59+
<argument name="optionTitle" value="{{BundleProduct.optionTitle1}}"/>
60+
<argument name="inputType" value="{{BundleProduct.optionInputType1}}"/>
4961
</actionGroup>
50-
<checkOption selector="{{AdminAddProductsToOptionPanel.firstCheckbox}}" stepKey="selectFirstGridRow"/>
51-
<click selector="{{AdminAddProductsToOptionPanel.addSelectedProducts}}" stepKey="clickAddSelectedBundleProducts"/>
52-
<fillField selector="{{AdminProductFormBundleSection.bundleOptionXProductYQuantity('0', '0')}}" userInput="{{BundleProduct.defaultQuantity}}" stepKey="fillProductDefaultQty1"/>
53-
54-
<!--Create a bundle product with ancillary data-->
62+
<!-- Add the default attribute value for the bundle product creation page-->
5563
<actionGroup ref="CreateBasicBundleProductActionGroup" stepKey="createBundledProduct">
5664
<argument name="bundleProduct" value="BundleProduct"/>
5765
</actionGroup>
66+
<!-- Save the bundle product -->
67+
<actionGroup ref="SaveProductFormActionGroup" stepKey="saveProductForm"/>
5868

59-
<!--save the product/published by default-->
60-
<actionGroup ref="AdminProductFormSaveActionGroup" stepKey="clickSaveButton"/>
61-
<seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="messageYouSavedTheProductIsShown"/>
69+
<!-- Navigate to catalog product grid page -->
6270
<actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="navigateToProductIndexPage"/>
6371

64-
<click selector="{{AdminProductGridFilterSection.columnsDropdown}}" stepKey="openColumnsDropdownToReset"/>
65-
<click selector="{{AdminProductGridFilterSection.resetGridColumns}}" stepKey="resetProductGridColumns"/>
66-
<click selector="{{AdminProductGridFilterSection.columnsDropdown}}" stepKey="closeColumnsDropdownAfterReset"/>
67-
68-
<!--Reload the catalog product page -->
69-
<reloadPage stepKey="reloadCatalogProductPage"/>
70-
<waitForPageLoad stepKey="waitForPageLoaded"/>
72+
<!-- Set product grid to default columns -->
73+
<actionGroup ref="ResetProductGridToDefaultViewActionGroup" stepKey="setProductGridToDefaultColumns"/>
74+
<!-- Open the column dropdown to reset the default columns from the catalog product grid -->
75+
<actionGroup ref="ToggleAdminProductGridColumnsDropdownActionGroup" stepKey="openToResetColumnsDropdown"/>
76+
<actionGroup ref="ResetAdminProductGridColumnsActionGroup" stepKey="resetAdminProductGridColumns"/>
77+
<actionGroup ref="ToggleAdminProductGridColumnsDropdownActionGroup" stepKey="closeColumnsDropdownAfterReset"/>
7178

72-
<!--Add Special Price column-->
79+
<!-- Check the special price attribute column is present or not -->
7380
<dontSeeElement selector="{{AdminProductGridSection.columnHeader('Special Price')}}" stepKey="dontSeeSpecialPriceColumn"/>
74-
<click selector="{{AdminProductGridFilterSection.columnsDropdown}}" stepKey="openColumnsDropdownSpecialPrice"/>
75-
<checkOption selector="{{AdminProductGridFilterSection.viewColumnOption('Special Price')}}" stepKey="showSpecialPriceColumn"/>
76-
<click selector="{{AdminProductGridFilterSection.columnsDropdown}}" stepKey="closeColumnsDropdownSpecialPrice"/>
81+
<!-- Open the column dropdown to add the special price from the catalog product grid -->
82+
<actionGroup ref="ToggleAdminProductGridColumnsDropdownActionGroup" stepKey="openColumnsDropdownSpecialPrice"/>
83+
<actionGroup ref="CheckAdminProductGridColumnOptionActionGroup" stepKey="checkSpecialPriceOption">
84+
<argument name="optionName" value="Special Price"/>
85+
</actionGroup>
86+
<actionGroup ref="ToggleAdminProductGridColumnsDropdownActionGroup" stepKey="closeColumnsDropdownSpecialPrice"/>
7787

88+
<!-- Search the created bundle product with sku -->
7889
<actionGroup ref="FilterProductGridBySku2ActionGroup" stepKey="filterBundleProductGridBySku">
7990
<argument name="sku" value="{{BundleProduct.sku}}"/>
8091
</actionGroup>
8192

93+
<!-- Check the special price column are present in catalog product grid -->
8294
<seeElement selector="{{AdminProductGridSection.columnHeader('Special Price')}}" stepKey="seeSpecialPriceColumn"/>
95+
<!-- Grab the special price value from the catalog product grid -->
8396
<grabTextFrom selector="{{AdminProductGridSection.productGridCell('1', 'Special Price')}}" stepKey="getSpecialPrice"/>
8497

85-
<assertStringContainsString stepKey="assertSpecialPricePercentageSymbol">
86-
<expectedResult type="string">%</expectedResult>
87-
<actualResult type="variable">$getSpecialPrice</actualResult>
88-
</assertStringContainsString>
98+
<!-- Asserting with the special price value contains the percentage value -->
99+
<actionGroup ref="AdminAssertSpecialPriceAttributeValueOnProductGridPageActionGroup" stepKey="assertSpecialPricePercentageSymbol">
100+
<argument name="expectedValue" value="90.00%"/>
101+
<argument name="actualValue" value="$getSpecialPrice"/>
102+
</actionGroup>
89103
</test>
90104
</tests>

app/code/Magento/Bundle/Ui/DataProvider/Product/Modifier/SpecialPriceAttributes.php

Lines changed: 17 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@
77

88
namespace Magento\Bundle\Ui\DataProvider\Product\Modifier;
99

10+
use Magento\Bundle\Model\Product\Type;
1011
use Magento\Directory\Model\Currency as DirectoryCurrency;
11-
use Magento\Framework\Currency;
1212
use Magento\Framework\Exception\NoSuchEntityException;
13-
use Magento\Framework\Locale\CurrencyInterface;
14-
use Magento\Store\Api\Data\StoreInterface;
15-
use Magento\Store\Model\StoreManagerInterface;
13+
use Magento\Framework\Locale\ResolverInterface;
1614
use Magento\Ui\DataProvider\Modifier\ModifierInterface;
17-
use Magento\Bundle\Model\Product\Type;
15+
use NumberFormatter;
1816
use Zend_Currency;
1917
use Zend_Currency_Exception;
2018

@@ -24,19 +22,14 @@
2422
class SpecialPriceAttributes implements ModifierInterface
2523
{
2624
/**
27-
* @var array
28-
*/
29-
private $priceAttributeList;
30-
31-
/**
32-
* @var StoreManagerInterface
25+
* @var ResolverInterface
3326
*/
34-
private $storeManager;
27+
private $localeResolver;
3528

3629
/**
37-
* @var CurrencyInterface
30+
* @var array
3831
*/
39-
private $localeCurrency;
32+
private $priceAttributeList;
4033

4134
/**
4235
* @var DirectoryCurrency
@@ -46,21 +39,18 @@ class SpecialPriceAttributes implements ModifierInterface
4639
/**
4740
* PriceAttributes constructor.
4841
*
49-
* @param StoreManagerInterface $storeManager
50-
* @param CurrencyInterface $localeCurrency
5142
* @param DirectoryCurrency $directoryCurrency
5243
* @param array $priceAttributeList
44+
* @param ResolverInterface $localeResolver
5345
*/
5446
public function __construct(
55-
StoreManagerInterface $storeManager,
56-
CurrencyInterface $localeCurrency,
5747
DirectoryCurrency $directoryCurrency,
58-
array $priceAttributeList = []
48+
array $priceAttributeList = [],
49+
ResolverInterface $localeResolver
5950
) {
60-
$this->storeManager = $storeManager;
61-
$this->localeCurrency = $localeCurrency;
6251
$this->priceAttributeList = $priceAttributeList;
6352
$this->directoryCurrency = $directoryCurrency;
53+
$this->localeResolver = $localeResolver;
6454
}
6555

6656
/**
@@ -73,7 +63,11 @@ public function modifyData(array $data): array
7363
if (empty($data) || empty($this->priceAttributeList)) {
7464
return $data;
7565
}
76-
66+
$numberFormatter = new NumberFormatter(
67+
$this->localeResolver->getLocale(),
68+
NumberFormatter::PERCENT
69+
);
70+
$numberFormatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 2);
7771
foreach ($data['items'] as &$item) {
7872
foreach ($this->priceAttributeList as $priceAttribute) {
7973
if (isset($item[$priceAttribute]) && $item['type_id'] == Type::TYPE_CODE) {
@@ -83,11 +77,7 @@ public function modifyData(array $data): array
8377
['display' => Zend_Currency::NO_SYMBOL],
8478
false
8579
);
86-
$item[$priceAttribute] =
87-
$this->getCurrency()->toCurrency(
88-
sprintf("%f", $item[$priceAttribute]),
89-
['symbol' => '%']
90-
);
80+
$item[$priceAttribute] = $numberFormatter->format($item[$priceAttribute] / 100);
9181
}
9282
}
9383
}
@@ -101,28 +91,4 @@ public function modifyMeta(array $meta): array
10191
{
10292
return $meta;
10393
}
104-
105-
/**
106-
* Retrieve store
107-
*
108-
* @return StoreInterface
109-
* @throws NoSuchEntityException
110-
*/
111-
private function getStore(): StoreInterface
112-
{
113-
return $this->storeManager->getStore();
114-
}
115-
116-
/**
117-
* Retrieve currency
118-
*
119-
* @return Currency
120-
* @throws NoSuchEntityException
121-
*/
122-
private function getCurrency(): Currency
123-
{
124-
$baseCurrencyCode = $this->getStore()->getBaseCurrencyCode();
125-
126-
return $this->localeCurrency->getCurrency($baseCurrencyCode);
127-
}
12894
}

0 commit comments

Comments
 (0)