Skip to content

Commit 96d1ee0

Browse files
Merge remote-tracking branch 'magento-epam-ce/mto-134' into pr3
2 parents 6399587 + 9e586e5 commit 96d1ee0

File tree

9 files changed

+311
-4
lines changed

9 files changed

+311
-4
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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\Block;
8+
9+
use Magento\Mtf\Client\Locator;
10+
11+
/**
12+
* Catalog messages block.
13+
*/
14+
class Messages extends \Magento\Backend\Test\Block\Messages
15+
{
16+
/**
17+
* Selector for "This is a required field." validation error message.
18+
*
19+
* @var string
20+
*/
21+
private $validationErrorMessage = '.mage-error';
22+
23+
/**
24+
* Wait for Success message or JS validation error message.
25+
*
26+
* @param string $strategy
27+
* @return bool
28+
*/
29+
public function waitMessage($strategy = Locator::SELECTOR_CSS)
30+
{
31+
$browser = $this->browser;
32+
$successMessage = $this->successMessage;
33+
$errorMessage = $this->validationErrorMessage;
34+
return $browser->waitUntil(
35+
function () use ($browser, $successMessage, $errorMessage, $strategy) {
36+
$success = $browser->find($successMessage, $strategy);
37+
$error = $browser->find($errorMessage, $strategy);
38+
return $success->isVisible() || $error->isVisible() ? true : null;
39+
}
40+
);
41+
}
42+
}

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

Lines changed: 35 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,20 @@ protected function getListOptions()
166187
return $customOptions;
167188
}
168189

190+
/**
191+
* Check option's validation message is visible or not.
192+
*
193+
* @param string $customOptionTitle
194+
* @return bool
195+
*/
196+
public function isJsMessageVisible($customOptionTitle)
197+
{
198+
$optionSelector = $this->customOptionField . $this->requiredOption . $this->validationErrorMessage;
199+
$title = sprintf($optionSelector, $customOptionTitle);
200+
201+
return $this->_rootElement->find($title, Locator::SELECTOR_XPATH)->isVisible();
202+
}
203+
169204
/**
170205
* Get data of "Field" custom option
171206
*
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 every required product's Custom Option contains JS validation error.
14+
*/
15+
class AssertProductCustomOptionsErrors extends AbstractConstraint
16+
{
17+
/**
18+
* Assert that every required product's Custom Option contains JS validation error.
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()->isJsMessageVisible($option['title']),
32+
'Required Custom Option ' . $option['title'] . " doesn't contain JS validation error."
33+
);
34+
}
35+
}
36+
}
37+
38+
/**
39+
* Assert success message that every required product's Custom Option contains JS validation error.
40+
*
41+
* @return string
42+
*/
43+
public function toString()
44+
{
45+
return "Every required product's Custom Option contains JS validation error.";
46+
}
47+
}

dev/tests/functional/tests/app/Magento/Catalog/Test/Page/Product/CatalogProductView.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<block name="upsellBlock" class="Magento\Catalog\Test\Block\Product\ProductList\Upsell" locator=".block.upsell" strategy="css selector" />
1515
<block name="crosssellBlock" class="Magento\Catalog\Test\Block\Product\ProductList\Crosssell" locator=".block.crosssell" strategy="css selector" />
1616
<block name="downloadableLinksBlock" class="Magento\Downloadable\Test\Block\Catalog\Product\View\Links" locator="[data-container-for=downloadable-links]" strategy="css selector" />
17-
<block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator=".page.messages" strategy="css selector" />
17+
<block name="messagesBlock" class="Magento\Catalog\Test\Block\Messages" locator=".page.messages" strategy="css selector" />
1818
<block name="titleBlock" class="Magento\Theme\Test\Block\Html\Title" locator=".page-title-wrapper h1.page-title .base" strategy="css selector" />
1919
<block name="widgetView" class="Magento\Widget\Test\Block\WidgetView" locator=".column.main .widget" strategy="css selector" />
2020
</page>

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)