Skip to content

Commit 74aa6b4

Browse files
committed
MTO-134: [Variation] Add Simple Product with required Custom Options to Cart
- Variations added
1 parent 45f2cae commit 74aa6b4

File tree

8 files changed

+290
-3
lines changed

8 files changed

+290
-3
lines changed

dev/tests/functional/tests/app/Magento/Backend/Test/Block/Messages.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ class Messages extends Block
2121
*/
2222
protected $successMessage = '[data-ui-id$=message-success]';
2323

24+
/**
25+
* "This is a required field." validation error message.
26+
*
27+
* @var string
28+
*/
29+
protected $validationErrorMessage = '//div[@class="mage-error"][contains(text(), "This is required field")]';
30+
2431
/**
2532
* Last success message selector.
2633
*
@@ -66,6 +73,18 @@ public function waitSuccessMessage()
6673
return $this->waitForElementVisible($this->successMessage, Locator::SELECTOR_CSS);
6774
}
6875

76+
/**
77+
* Wait for success or JS validation error message.
78+
*
79+
* @return bool
80+
*/
81+
public function waitMessage()
82+
{
83+
return $this->_rootElement->find($this->successMessage, Locator::SELECTOR_CSS)->isVisible() ?
84+
$this->waitForElementVisible($this->successMessage, Locator::SELECTOR_CSS) :
85+
$this->waitForElementVisible($this->validationErrorMessage, Locator::SELECTOR_XPATH);
86+
}
87+
6988
/**
7089
* Get all success messages which are present on the page.
7190
*

dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View/CustomOptions.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,27 @@ class CustomOptions extends Form
109109
*/
110110
protected $optionByName = '//*[label[contains(.,"%s")] or legend[contains(.,"%s")]]';
111111

112+
/**
113+
* Locator for custom option field.
114+
*
115+
* @var string
116+
*/
117+
private $customOptionField = './/div[contains(@class, "field")';
118+
119+
/**
120+
* Locator for required custom option title.
121+
*
122+
* @var string
123+
*/
124+
private $requiredOption = 'and contains(@class, "required") and contains(.//span, "%s")]';
125+
126+
/**
127+
* Locator for validation error message after option.
128+
*
129+
* @var string
130+
*/
131+
private $validationErrorMessage = '//div[@class="mage-error"][contains(text(), "required field")]';
132+
112133
/**
113134
* Get product options
114135
*
@@ -166,6 +187,23 @@ protected function getListOptions()
166187
return $customOptions;
167188
}
168189

190+
/**
191+
* Check that validation error message beside custom option is visible.
192+
*
193+
* @param string $customOptionTitle
194+
* @return bool
195+
*/
196+
public function validationErrorMessageIsVisible($customOptionTitle)
197+
{
198+
return $this->_rootElement
199+
->find(
200+
sprintf(
201+
$this->customOptionField . $this->requiredOption . $this->validationErrorMessage, $customOptionTitle
202+
),
203+
Locator::SELECTOR_XPATH
204+
)->isVisible() ? true : false;
205+
}
206+
169207
/**
170208
* Get data of "Field" custom option
171209
*
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Catalog\Test\Constraint;
8+
9+
use Magento\Mtf\Constraint\AbstractConstraint;
10+
use Magento\Catalog\Test\Page\Product\CatalogProductView;
11+
12+
/**
13+
* Assert that JS validation error message is visible beside every required product option.
14+
*/
15+
class AssertProductCustomOptionsErrors extends AbstractConstraint
16+
{
17+
/**
18+
* Assert that JS validation error message is visible beside every required product option.
19+
*
20+
* @param CatalogProductView $catalogProductView
21+
* @param array $products
22+
* @return void
23+
*/
24+
public function processAssert(
25+
CatalogProductView $catalogProductView,
26+
array $products
27+
) {
28+
foreach ($products as $product) {
29+
foreach ($product->getData('custom_options') as $option) {
30+
\PHPUnit_Framework_Assert::assertTrue(
31+
$catalogProductView->getCustomOptionsBlock()->validationErrorMessageIsVisible($option['title']),
32+
'JS validation error message is absent after required product option ' . $option['title']
33+
);
34+
}
35+
}
36+
}
37+
38+
/**
39+
* Assert success message that JS validation error message is visible beside every required product option.
40+
*
41+
* @return string
42+
*/
43+
public function toString()
44+
{
45+
return 'JS validation error message is visible beside every required product option.';
46+
}
47+
}

dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,27 @@
985985
</field>
986986
</dataset>
987987

988+
<dataset name="with_all_required_custom_option">
989+
<field name="attribute_set_id" xsi:type="array">
990+
<item name="dataset" xsi:type="string">default</item>
991+
</field>
992+
<field name="name" xsi:type="string">Simple Product With Custom Option %isolation%</field>
993+
<field name="sku" xsi:type="string">sku_simple_product_%isolation%</field>
994+
<field name="price" xsi:type="array">
995+
<item name="value" xsi:type="string">300</item>
996+
</field>
997+
<field name="product_has_weight" xsi:type="string">This item has weight</field>
998+
<field name="weight" xsi:type="string">1</field>
999+
<field name="quantity_and_stock_status" xsi:type="array">
1000+
<item name="qty" xsi:type="string">953</item>
1001+
<item name="is_in_stock" xsi:type="string">In Stock</item>
1002+
</field>
1003+
<field name="url_key" xsi:type="string">simple-product-%isolation%</field>
1004+
<field name="custom_options" xsi:type="array">
1005+
<item name="dataset" xsi:type="string">all_types_options_required</item>
1006+
</field>
1007+
</dataset>
1008+
9881009
<dataset name="low_stock_product">
9891010
<field name="sku" xsi:type="string">low_stock_product%isolation%</field>
9901011
<field name="name" xsi:type="string">low_stock_product%isolation%</field>

dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/Product/CustomOptions.xml

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,154 @@
359359
</field>
360360
</dataset>
361361

362+
<dataset name="all_types_options_required">
363+
<field name="0" xsi:type="array">
364+
<item name="title" xsi:type="string">custom option field %isolation%</item>
365+
<item name="is_require" xsi:type="string">Yes</item>
366+
<item name="type" xsi:type="string">Text/Field</item>
367+
<item name="options" xsi:type="array">
368+
<item name="0" xsi:type="array">
369+
<item name="price" xsi:type="string">10</item>
370+
<item name="price_type" xsi:type="string">Fixed</item>
371+
<item name="sku" xsi:type="string">sku_field_option_%isolation%</item>
372+
<item name="max_characters" xsi:type="string">1024</item>
373+
</item>
374+
</item>
375+
</field>
376+
<field name="1" xsi:type="array">
377+
<item name="title" xsi:type="string">custom option Area %isolation%</item>
378+
<item name="is_require" xsi:type="string">Yes</item>
379+
<item name="type" xsi:type="string">Text/Area</item>
380+
<item name="options" xsi:type="array">
381+
<item name="0" xsi:type="array">
382+
<item name="price" xsi:type="string">10</item>
383+
<item name="price_type" xsi:type="string">Fixed</item>
384+
<item name="sku" xsi:type="string">sku_area_row_%isolation%</item>
385+
<item name="max_characters" xsi:type="string">100</item>
386+
</item>
387+
</item>
388+
</field>
389+
<field name="2" xsi:type="array">
390+
<item name="title" xsi:type="string">custom option File %isolation%</item>
391+
<item name="is_require" xsi:type="string">Yes</item>
392+
<item name="type" xsi:type="string">File/File</item>
393+
<item name="options" xsi:type="array">
394+
<item name="0" xsi:type="array">
395+
<item name="price" xsi:type="string">10</item>
396+
<item name="price_type" xsi:type="string">Fixed</item>
397+
<item name="sku" xsi:type="string">sku_file_row_%isolation%</item>
398+
<item name="file_extension" xsi:type="string">jpg</item>
399+
<item name="image_size_x" xsi:type="string">100</item>
400+
<item name="image_size_y" xsi:type="string">100</item>
401+
</item>
402+
</item>
403+
</field>
404+
<field name="3" xsi:type="array">
405+
<item name="title" xsi:type="string">custom option drop down %isolation%</item>
406+
<item name="is_require" xsi:type="string">Yes</item>
407+
<item name="type" xsi:type="string">Select/Drop-down</item>
408+
<item name="options" xsi:type="array">
409+
<item name="0" xsi:type="array">
410+
<item name="title" xsi:type="string">10 percent</item>
411+
<item name="price" xsi:type="string">10</item>
412+
<item name="price_type" xsi:type="string">Percent</item>
413+
<item name="sku" xsi:type="string">sku_drop_down_row_1_%isolation%</item>
414+
<item name="sort_order" xsi:type="string">0</item>
415+
</item>
416+
<item name="1" xsi:type="array">
417+
<item name="title" xsi:type="string">20 percent</item>
418+
<item name="price" xsi:type="string">20</item>
419+
<item name="price_type" xsi:type="string">Percent</item>
420+
<item name="sku" xsi:type="string">sku_drop_down_row_2_%isolation%</item>
421+
<item name="sort_order" xsi:type="string">1</item>
422+
</item>
423+
<item name="2" xsi:type="array">
424+
<item name="title" xsi:type="string">30 fixed</item>
425+
<item name="price" xsi:type="string">30</item>
426+
<item name="price_type" xsi:type="string">Fixed</item>
427+
<item name="sku" xsi:type="string">sku_drop_down_row_3_%isolation%</item>
428+
<item name="sort_order" xsi:type="string">2</item>
429+
</item>
430+
</item>
431+
</field>
432+
<field name="4" xsi:type="array">
433+
<item name="title" xsi:type="string">custom option Radio Buttons %isolation%</item>
434+
<item name="is_require" xsi:type="string">Yes</item>
435+
<item name="type" xsi:type="string">Select/Radio Buttons</item>
436+
<item name="options" xsi:type="array">
437+
<item name="0" xsi:type="array">
438+
<item name="title" xsi:type="string">20 fixed</item>
439+
<item name="price" xsi:type="string">20</item>
440+
<item name="price_type" xsi:type="string">Fixed</item>
441+
<item name="sku" xsi:type="string">sku_radio_buttons_row%isolation%</item>
442+
</item>
443+
</item>
444+
</field>
445+
<field name="5" xsi:type="array">
446+
<item name="title" xsi:type="string">custom option Checkbox %isolation%</item>
447+
<item name="is_require" xsi:type="string">Yes</item>
448+
<item name="type" xsi:type="string">Select/Checkbox</item>
449+
<item name="options" xsi:type="array">
450+
<item name="0" xsi:type="array">
451+
<item name="title" xsi:type="string">20 fixed</item>
452+
<item name="price" xsi:type="string">20</item>
453+
<item name="price_type" xsi:type="string">Fixed</item>
454+
<item name="sku" xsi:type="string">sku_checkbox_row%isolation%</item>
455+
</item>
456+
</item>
457+
</field>
458+
<field name="6" xsi:type="array">
459+
<item name="title" xsi:type="string">custom option Multiple Select %isolation%</item>
460+
<item name="is_require" xsi:type="string">Yes</item>
461+
<item name="type" xsi:type="string">Select/Multiple Select</item>
462+
<item name="options" xsi:type="array">
463+
<item name="0" xsi:type="array">
464+
<item name="title" xsi:type="string">20 fixed</item>
465+
<item name="price" xsi:type="string">20</item>
466+
<item name="price_type" xsi:type="string">Fixed</item>
467+
<item name="sku" xsi:type="string">sku_multiple_select_row%isolation%</item>
468+
<item name="sort_order" xsi:type="string">0</item>
469+
</item>
470+
</item>
471+
</field>
472+
<field name="7" xsi:type="array">
473+
<item name="title" xsi:type="string">custom option Date %isolation%</item>
474+
<item name="is_require" xsi:type="string">Yes</item>
475+
<item name="type" xsi:type="string">Date/Date</item>
476+
<item name="options" xsi:type="array">
477+
<item name="0" xsi:type="array">
478+
<item name="price" xsi:type="string">20</item>
479+
<item name="price_type" xsi:type="string">Fixed</item>
480+
<item name="sku" xsi:type="string">sku_date_row%isolation%</item>
481+
</item>
482+
</item>
483+
</field>
484+
<field name="8" xsi:type="array">
485+
<item name="title" xsi:type="string">custom option Date &amp; Time %isolation%</item>
486+
<item name="is_require" xsi:type="string">Yes</item>
487+
<item name="type" xsi:type="string">Date/Date &amp; Time</item>
488+
<item name="options" xsi:type="array">
489+
<item name="0" xsi:type="array">
490+
<item name="price" xsi:type="string">20</item>
491+
<item name="price_type" xsi:type="string">Fixed</item>
492+
<item name="sku" xsi:type="string">sku_date_and_time_row%isolation%</item>
493+
</item>
494+
</item>
495+
</field>
496+
<field name="9" xsi:type="array">
497+
<item name="title" xsi:type="string">custom option Time %isolation%</item>
498+
<item name="is_require" xsi:type="string">Yes</item>
499+
<item name="type" xsi:type="string">Date/Time</item>
500+
<item name="options" xsi:type="array">
501+
<item name="0" xsi:type="array">
502+
<item name="price" xsi:type="string">20</item>
503+
<item name="price_type" xsi:type="string">Fixed</item>
504+
<item name="sku" xsi:type="string">sku_time_row%isolation%</item>
505+
</item>
506+
</item>
507+
</field>
508+
</dataset>
509+
362510
<dataset name="percent_and_fixed_radio_options">
363511
<field name="0" xsi:type="array">
364512
<item name="title" xsi:type="string">custom menu</item>

dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* 4. Perform all asserts
2727
*
2828
* @group Shopping_Cart
29-
* @ZephyrId MAGETWO-25382, MAGETWO-42677
29+
* @ZephyrId MAGETWO-25382, MAGETWO-42677, MAGETWO-45389
3030
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
3131
*/
3232
class AddProductsToShoppingCartEntityTest extends Injectable
@@ -156,7 +156,10 @@ public function test(array $productsData, array $cart, $configData = null, $flus
156156
$this->addToCart($products);
157157

158158
$cart['data']['items'] = ['products' => $products];
159-
return ['cart' => $this->fixtureFactory->createByCode('cart', $cart)];
159+
return [
160+
'cart' => $this->fixtureFactory->createByCode('cart', $cart),
161+
'products' => $products
162+
];
160163
}
161164

162165
/**

dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/AddProductsToShoppingCartEntityTest.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,5 +251,16 @@
251251
<constraint name="Magento\Checkout\Test\Constraint\AssertVisibleItemsQtyInCheckoutSummaryBlock" />
252252
<constraint name="Magento\Checkout\Test\Constraint\AssertLinkGoToCartPresentInSummaryBlock" />
253253
</variation>
254+
<variation name="AddProductsToShoppingCartEntityTestVariation10" summary="Create product with all types of custom options that are required and trigger JS validation" ticketId="MAGETWO-45389">
255+
<data name="productsData/0" xsi:type="string">catalogProductSimple::with_all_required_custom_option</data>
256+
<data name="cart/data/subtotal" xsi:type="string">6160.00</data>
257+
<constraint name="Magento\Catalog\Test\Constraint\AssertProductCustomOptionsErrors" />
258+
<constraint name="Magento\Checkout\Test\Constraint\AssertProductsAbsentInShoppingCart" />
259+
</variation>
260+
<variation name="AddProductsToShoppingCartEntityTestVariation11" summary="Create product with all types of custom options that are required and check that item options for product(s) display with correct information" ticketId="MAGETWO-45389">
261+
<data name="productsData/0" xsi:type="string">catalogProductSimple::with_all_required_custom_option</data>
262+
<data name="cart/data/subtotal" xsi:type="string">6160.00</data>
263+
<constraint name="Magento\Checkout\Test\Constraint\AssertCartItemsOptions" />
264+
</variation>
254265
</testCase>
255266
</config>

dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/AddProductsToTheCartStep.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public function run()
105105
$this->browser->open($_ENV['app_frontend_url'] . $product->getUrlKey() . '.html');
106106
$this->catalogProductView->getViewBlock()->waitForElementNotVisible($this->loadingSelector);
107107
$this->catalogProductView->getViewBlock()->addToCart($product);
108-
$this->catalogProductView->getMessagesBlock()->waitSuccessMessage();
108+
$this->catalogProductView->getMessagesBlock()->waitMessage();
109109
}
110110
$cart['data']['items'] = ['products' => $this->products];
111111
return ['cart' => $this->fixtureFactory->createByCode('cart', $cart)];

0 commit comments

Comments
 (0)