Skip to content

Commit ec4017f

Browse files
author
Stas Puga
committed
MC-11512: Remove custom options from product
1 parent 6e534ad commit ec4017f

File tree

6 files changed

+163
-11
lines changed

6 files changed

+163
-11
lines changed

app/code/Magento/Catalog/Test/Mftf/ActionGroup/CustomOptionsActionGroup.xml

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,26 @@
4747
<fillField selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" userInput="{{option.title}}" stepKey="fillTitle"/>
4848
<click selector="{{AdminProductCustomizableOptionsSection.lastOptionTypeParent}}" stepKey="openTypeSelect"/>
4949
<click selector="{{AdminProductCustomizableOptionsSection.optionType('File')}}" stepKey="selectTypeFile"/>
50-
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPrice('0')}}" stepKey="waitForElements"/>
51-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPrice('0')}}" userInput="{{option.price}}" stepKey="fillPrice"/>
52-
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceType('0')}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
53-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionFileExtensions('0')}}" userInput="{{option.file_extension}}" stepKey="fillCompatibleExtensions"/>
50+
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" stepKey="waitForElements"/>
51+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" userInput="{{option.price}}" stepKey="fillPrice"/>
52+
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceTypeByTitle(option.title)}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
53+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionFileExtensionByTitle(option.title)}}" userInput="{{option.file_extension}}" stepKey="fillCompatibleExtensions"/>
5454
</actionGroup>
5555
<actionGroup name="AddProductCustomOptionField">
5656
<arguments>
5757
<argument name="option" defaultValue="ProductOptionField"/>
58-
<argument name="optionIndex" type="string"/>
5958
</arguments>
59+
<scrollTo selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" stepKey="scrollToAddButtonOption"/>
6060
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.addOptionBtn}}" visible="false" stepKey="openCustomOptionSection"/>
6161
<click selector="{{AdminProductCustomizableOptionsSection.addOptionBtn}}" stepKey="clickAddOption"/>
6262
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" stepKey="waitForOption"/>
6363
<fillField selector="{{AdminProductCustomizableOptionsSection.lastOptionTitle}}" userInput="{{option.title}}" stepKey="fillTitle"/>
6464
<click selector="{{AdminProductCustomizableOptionsSection.lastOptionTypeParent}}" stepKey="openTypeSelect"/>
6565
<click selector="{{AdminProductCustomizableOptionsSection.optionType('Field')}}" stepKey="selectTypeFile"/>
66-
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPrice(optionIndex)}}" stepKey="waitForElements"/>
67-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPrice(optionIndex)}}" userInput="{{option.price}}" stepKey="fillPrice"/>
68-
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceType(optionIndex)}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
69-
<fillField selector="{{AdminProductCustomizableOptionsSection.optionSku(optionIndex)}}" userInput="{{option.title}}" stepKey="fillSku"/>
66+
<waitForElementVisible selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" stepKey="waitForElements"/>
67+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionPriceByTitle(option.title)}}" userInput="{{option.price}}" stepKey="fillPrice"/>
68+
<selectOption selector="{{AdminProductCustomizableOptionsSection.optionPriceTypeByTitle(option.title)}}" userInput="{{option.price_type}}" stepKey="selectPriceType"/>
69+
<fillField selector="{{AdminProductCustomizableOptionsSection.optionSkuByTitle(option.title)}}" userInput="{{option.title}}" stepKey="fillSku"/>
7070
</actionGroup>
7171
<actionGroup name="importProductCustomizableOptions">
7272
<arguments>
@@ -99,4 +99,45 @@
9999
<assertEquals expected="{{option.price}}" expectedType="string" actual="$grabOptionPrice" stepKey="assertOptionPrice"/>
100100
<assertEquals expected="{{option.title}}" expectedType="string" actual="$grabOptionSku" stepKey="assertOptionSku"/>
101101
</actionGroup>
102+
<!-- Assumes we are on product edit page -->
103+
<actionGroup name="AdminDeleteAllProductCustomOptions">
104+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.checkIfCustomizableOptionsTabOpen}}" visible="true" stepKey="expandContentTab"/>
105+
<waitForPageLoad time="10" stepKey="waitCustomizableOptionsTabOpened"/>
106+
<executeInSelenium function="function($webdriver) use ($I) {
107+
$buttons = $webdriver->findElements(\Facebook\WebDriver\WebDriverBy::cssSelector('[data-index=\'options\'] [data-index=\'delete_button\']'));
108+
while(!empty($buttons)) {
109+
$button = reset($buttons);
110+
$I->executeJS('arguments[0].scrollIntoView(false)', [$button]);
111+
$button->click();
112+
$webdriver->wait()->until(\Facebook\WebDriver\WebDriverExpectedCondition::stalenessOf($button));
113+
$buttons = $webdriver->findElements(\Facebook\WebDriver\WebDriverBy::cssSelector('[data-index=\'options\'] [data-index=\'delete_button\']'));
114+
}
115+
}" stepKey="deleteCustomOptions"/>
116+
<dontSeeElement selector="{{AdminProductCustomizableOptionsSection.customOptionButtonDelete}}" stepKey="assertNoCustomOptions"/>
117+
</actionGroup>
118+
<!-- Assumes we are on product edit page -->
119+
<actionGroup name="AdminAssertProductHasNoCustomOptions">
120+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.checkIfCustomizableOptionsTabOpen}}" visible="true" stepKey="expandContentTab"/>
121+
<waitForPageLoad time="10" stepKey="waitCustomizableOptionsTabOpened"/>
122+
<dontSeeElement selector="{{AdminProductCustomizableOptionsSection.customOption}}" stepKey="assertNoCustomOptions"/>
123+
</actionGroup>
124+
<!-- Assumes we are on product edit page -->
125+
<actionGroup name="AdminAssertProductHasNoCustomOption" extends="AdminAssertProductCustomOptionVisible">
126+
<remove keyForRemoval="assertCustomOptionVisible"/>
127+
<dontSeeElement selector="{{AdminProductCustomizableOptionsSection.fillOptionTitle(option.title)}}" after="waitCustomizableOptionsTabOpened" stepKey="assertNoCustomOption"/>
128+
</actionGroup>
129+
<!-- Assumes we are on product edit page -->
130+
<actionGroup name="AdminAssertProductCustomOptionVisible">
131+
<arguments>
132+
<argument name="option" defaultValue="ProductOptionField"/>
133+
</arguments>
134+
<conditionalClick selector="{{AdminProductCustomizableOptionsSection.customizableOptions}}" dependentSelector="{{AdminProductCustomizableOptionsSection.checkIfCustomizableOptionsTabOpen}}" visible="true" stepKey="expandContentTab"/>
135+
<waitForPageLoad time="10" stepKey="waitCustomizableOptionsTabOpened"/>
136+
<seeElement selector="{{AdminProductCustomizableOptionsSection.fillOptionTitle(option.title)}}" stepKey="assertCustomOptionVisible"/>
137+
</actionGroup>
138+
<!-- Assumes we are on product edit page -->
139+
<actionGroup name="AdminDeleteProductCustomOption" extends="AdminAssertProductCustomOptionVisible">
140+
<remove keyForRemoval="assertCustomOptionVisible"/>
141+
<click selector="{{AdminProductCustomizableOptionsSection.deleteCustomOptions(option.title)}}" after="waitCustomizableOptionsTabOpened" stepKey="clickDeleteCustomOption"/>
142+
</actionGroup>
102143
</actionGroups>

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,12 @@
506506
<requiredEntity type="product_option">ProductOptionField</requiredEntity>
507507
<requiredEntity type="product_option">ProductOptionArea</requiredEntity>
508508
</entity>
509+
<entity name="ProductWithTextFieldAndAreaAndFileOptions" type="product">
510+
<var key="sku" entityType="product" entityKey="sku" />
511+
<requiredEntity type="product_option">ProductOptionField</requiredEntity>
512+
<requiredEntity type="product_option">ProductOptionArea</requiredEntity>
513+
<requiredEntity type="product_option">ProductOptionFile</requiredEntity>
514+
</entity>
509515
<entity name="ApiVirtualProductWithDescription" type="product">
510516
<data key="sku" unique="suffix">api-virtual-product</data>
511517
<data key="type_id">virtual</data>

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,10 @@
176176
<data key="is_require">true</data>
177177
<requiredEntity type="product_option_value">ProductOptionPercentPriceValueDropdown</requiredEntity>
178178
</entity>
179+
<entity name="ProductOptionFieldSecond" extends="ProductOptionField">
180+
<data key="title" unique="suffix">fifth option</data>
181+
</entity>
182+
<entity name="ProductOptionFileSecond" extends="ProductOptionFile">
183+
<data key="title" unique="suffix">fourth option</data>
184+
</entity>
179185
</entities>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
<element name="optionTypeOpenDropDown" type="button" selector=".admin__dynamic-rows[data-index='options'] .action-select" timeout="30"/>
2020
<element name="optionTypeTextField" type="button" selector=".admin__dynamic-rows[data-index='options'] .action-menu._active li li" timeout="30"/>
2121
<element name="maxCharactersInput" type="input" selector="input[name='product[options][0][max_characters]']"/>
22+
<element name="deleteCustomOptions" type="button" selector="//div[contains(@class, 'fieldset-wrapper-title')]//span[contains(., '{{optionTitle}}')]/parent::div/parent::div//button[@class='action-delete']" parameterized="true" timeout="30"/>
23+
<element name="customOption" type="block" selector="[data-index='options'] tbody tr.data-row"/>
24+
<element name="customOptionButtonDelete" type="button" selector="[data-index='options'] [data-index='delete_button']"/>
2225

2326
<element name="optionTypeDropDown" type="select" selector="//table[@data-index='options']//tr[{{index}}]//div[@data-index='type']//div[contains(@class, 'action-select-wrap')]" parameterized="true" />
2427
<element name="optionTypeItem" type="select" selector="//table[@data-index='options']//tr[{{index}}]//div[@data-index='type']//*[contains(@class, 'action-menu-item')]//*[contains(., '{{optionValue}}')]" parameterized="true" />
2528
<element name="checkSelect" type="select" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//span[text()='Option Type']/parent::label/parent::div/parent::div//div[@data-role='selected-option']" parameterized="true"/>
29+
<element name="checkOptionType" type="select" selector="//span[text()='{{optionTitle}}']/parent::div/parent::div/parent::div//parent::label/parent::div/parent::div//li[@class='admin__action-multiselect-menu-inner-item']//label[text()='{{optionType}}']" parameterized="true"/>
2630
<element name="checkDropDown" type="select" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//parent::label/parent::div/parent::div//li[@class='admin__action-multiselect-menu-inner-item']//label[text()='Drop-down']" parameterized="true"/>
2731
<element name="clickAddValue" type="button" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//tfoot//button" parameterized="true"/>
2832
<element name="fillOptionValueTitle" type="input" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//tbody/tr[@data-repeat-index='{{var2}}']//span[text()='Title']/parent::label/parent::div/parent::div//div[@class='admin__field-control']/input" parameterized="true"/>
@@ -32,8 +36,13 @@
3236
<element name="checkboxUseDefaultOption" type="checkbox" selector="//table[@data-index='values']//tbody//tr[@data-repeat-index='{{var1}}']//div[@class='admin__field-control']//input[@type='checkbox']" parameterized="true"/>
3337
<element name="requiredCheckBox" type="checkbox" selector="input[name='product[options][{{index}}][is_require]']" parameterized="true" />
3438
<element name="fillOptionValueSku" type="input" selector="//span[text()='{{var1}}']/parent::div/parent::div/parent::div//tbody/tr[@data-repeat-index='{{var2}}']//span[text()='SKU']/parent::label/parent::div/parent::div//div[@class='admin__field-control']/input" parameterized="true"/>
39+
<element name="fillOptionCompatibleFileExtensions" type="input" selector="input[name='product[options][{{index}}][file_extension]']" parameterized="true"/>
3540

3641
<!-- Elements that make it easier to select the most recently added element -->
42+
<element name="optionPriceByTitle" type="input" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='price']//input" parameterized="true"/>
43+
<element name="optionPriceTypeByTitle" type="select" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='price_type']//select" parameterized="true"/>
44+
<element name="optionSkuByTitle" type="input" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='sku']//input" parameterized="true"/>
45+
<element name="optionFileExtensionByTitle" type="input" selector="//*[@data-index='options']//*[@data-role='collapsible-title' and contains(., '{{optionTitle}}')]/ancestor::tr//*[@data-index='file_extension']//input" parameterized="true"/>
3746
<element name="lastOptionTitle" type="input" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr[last()]//*[contains(@class, '_required')]//input" />
3847
<element name="lastOptionTypeParent" type="block" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr[last()]//*[contains(@class, 'admin__action-multiselect-text')]" />
3948
<element name="lastOptionPrice" type="input" selector="//*[@data-index='custom_options']//*[@data-index='options']/tbody/tr[last()]//*[contains(@name, '[price]')]"/>

app/code/Magento/Catalog/Test/Mftf/Test/AdminImportCustomizableOptionToProductWithSKUTest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@
5252
<waitForPageLoad stepKey="waitForProductEditPageLoad"/>
5353
<actionGroup ref="AddProductCustomOptionField" stepKey="addCutomOption1">
5454
<argument name="option" value="ProductOptionField"/>
55-
<argument name="optionIndex" value="0"/>
5655
</actionGroup>
5756
<actionGroup ref="AddProductCustomOptionField" stepKey="addCutomOption2">
5857
<argument name="option" value="ProductOptionField2"/>
59-
<argument name="optionIndex" value="1"/>
6058
</actionGroup>
6159
<actionGroup ref="saveProductForm" stepKey="saveProduct"/>
6260
<!--Change second product sku to first product sku-->
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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="AdminRemoveCustomOptionsFromProductTest">
12+
<annotations>
13+
<features value="Catalog"/>
14+
<stories value="Create product with custom options"/>
15+
<title value="Remove custom options from product"/>
16+
<description value="Remove custom options from product"/>
17+
<severity value="MAJOR"/>
18+
<testCaseId value="MC-11512"/>
19+
<group value="catalog"/>
20+
</annotations>
21+
<before>
22+
<createData entity="SimpleProduct2" stepKey="createProduct"/>
23+
<updateData entity="ProductWithTextFieldAndAreaAndFileOptions" createDataKey="createProduct" stepKey="updateProductWithOptions">
24+
<requiredEntity createDataKey="createProduct"/>
25+
</updateData>
26+
</before>
27+
<after>
28+
<deleteData createDataKey="createProduct" stepKey="deleteProductWithOptions"/>
29+
<amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/>
30+
<actionGroup ref="clearFiltersAdminDataGrid" stepKey="clearProductFilter"/>
31+
<actionGroup ref="logout" stepKey="logout"/>
32+
</after>
33+
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
34+
<!-- Edit Simple Product -->
35+
<amOnPage url="{{AdminProductEditPage.url($$createProduct.id$$)}}" stepKey="goToProduct"/>
36+
<!-- See 3 options are present -->
37+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertCustomOptionsField">
38+
<argument name="option" value="ProductOptionField"/>
39+
</actionGroup>
40+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertCustomOptionsArea">
41+
<argument name="option" value="ProductOptionArea"/>
42+
</actionGroup>
43+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertCustomOptionsFile">
44+
<argument name="option" value="ProductOptionFile"/>
45+
</actionGroup>
46+
<!-- Click delete "Area" and "File" options -->
47+
<actionGroup ref="AdminDeleteProductCustomOption" stepKey="deleteCustomOptionArea">
48+
<argument name="option" value="ProductOptionArea"/>
49+
</actionGroup>
50+
<actionGroup ref="AdminDeleteProductCustomOption" stepKey="deleteCustomOptionFile">
51+
<argument name="option" value="ProductOptionFile"/>
52+
</actionGroup>
53+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertVisibleCustomOptionField">
54+
<argument name="option" value="ProductOptionField"/>
55+
</actionGroup>
56+
<actionGroup ref="saveProductForm" stepKey="saveProduct"/>
57+
<!-- See only "Field option" left Also we shouldn't see any other options -->
58+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertVisibleSecondCustomOptionField">
59+
<argument name="option" value="ProductOptionField"/>
60+
</actionGroup>
61+
<actionGroup ref="AdminAssertProductHasNoCustomOption" stepKey="assertNoCustomOptionsFile">
62+
<argument name="option" value="ProductOptionFileSecond"/>
63+
</actionGroup>
64+
<actionGroup ref="AdminAssertProductHasNoCustomOption" stepKey="assertNoCustomOptionsField">
65+
<argument name="option" value="ProductOptionFieldSecond"/>
66+
</actionGroup>
67+
<!-- Click Add option "File" -->
68+
<actionGroup ref="AddProductCustomOptionFile" stepKey="createAddOptionFile">
69+
<argument name="option" value="ProductOptionFileSecond"/>
70+
</actionGroup>
71+
<!-- Click Add option "Field" -->
72+
<actionGroup ref="AddProductCustomOptionField" stepKey="createCustomOptionField">
73+
<argument name="option" value="ProductOptionFieldSecond"/>
74+
</actionGroup>
75+
<actionGroup ref="saveProductForm" stepKey="saveProductWithNewlyAddedOptions"/>
76+
<!-- See 3 options are present -->
77+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertPresentCustomOptionField">
78+
<argument name="option" value="ProductOptionField"/>
79+
</actionGroup>
80+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertPresenceOfFileOption">
81+
<argument name="option" value="ProductOptionFileSecond"/>
82+
</actionGroup>
83+
<actionGroup ref="AdminAssertProductCustomOptionVisible" stepKey="assertPresenceOfFieldOption">
84+
<argument name="option" value="ProductOptionFieldSecond"/>
85+
</actionGroup>
86+
<!-- Delete All options and See no more options present on the page -->
87+
<actionGroup ref="AdminDeleteAllProductCustomOptions" stepKey="deleteAllCustomOptions"/>
88+
<!-- Product successfully saved and it has no options -->
89+
<actionGroup ref="saveProductForm" stepKey="saveProductWithoutCustomOptions"/>
90+
<actionGroup ref="AdminAssertProductHasNoCustomOptions" stepKey="assertNoCustomOptions"/>
91+
</test>
92+
</tests>

0 commit comments

Comments
 (0)