Skip to content
This repository was archived by the owner on Apr 29, 2019. It is now read-only.

Commit d0cb6fc

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-52783' into NORD-FIXES
2 parents ddc01d2 + ce924cd commit d0cb6fc

File tree

4 files changed

+221
-21
lines changed

4 files changed

+221
-21
lines changed

dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCustomOptionsOnProductPage.php

Lines changed: 125 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ public function processAssert(
8585
BrowserInterface $browser
8686
) {
8787
$browser->open($_ENV['app_frontend_url'] . $product->getUrlKey() . '.html');
88-
8988
$actualPrice = null;
9089
if ($this->isPrice) {
9190
$priceBlock = $catalogProductView->getViewBlock()->getPriceBlock();
@@ -95,7 +94,6 @@ public function processAssert(
9594
}
9695
$fixtureCustomOptions = $this->prepareOptions($product, $actualPrice);
9796
$formCustomOptions = $catalogProductView->getViewBlock()->getOptions($product)['custom_options'];
98-
9997
$error = $this->verifyData($fixtureCustomOptions, $formCustomOptions);
10098
\PHPUnit_Framework_Assert::assertEmpty($error, $error);
10199
}
@@ -106,33 +104,143 @@ public function processAssert(
106104
* @param FixtureInterface $product
107105
* @param int|null $actualPrice
108106
* @return array
109-
*
110-
* @SuppressWarnings(PHPMD.NPathComplexity)
111107
*/
112108
protected function prepareOptions(FixtureInterface $product, $actualPrice = null)
113109
{
114110
$result = [];
115111
$customOptions = $product->hasData('custom_options')
116112
? $product->getDataFieldConfig('custom_options')['source']->getCustomOptions()
117-
: null;
118-
$actualPrice = $actualPrice ? $actualPrice : $product->getPrice();
113+
: [];
114+
$actualPrice = $actualPrice ?: $product->getPrice();
119115
foreach ($customOptions as $customOption) {
120-
$skippedField = isset($this->skippedFieldOptions[$customOption['type']])
121-
? $this->skippedFieldOptions[$customOption['type']]
122-
: [];
123-
foreach ($customOption['options'] as &$option) {
124-
// recalculate percent price
125-
if ('Percent' == $option['price_type']) {
126-
$option['price'] = ($actualPrice * $option['price']) / 100;
127-
$option['price'] = round($option['price'], 2);
128-
}
116+
$result = $this->prepareEachCustomOption($actualPrice, $customOption, $result);
117+
}
118+
return $result;
119+
}
129120

130-
$option = array_diff_key($option, array_flip($skippedField));
121+
/**
122+
* Verify fixture and form data
123+
*
124+
* @param array $fixtureData
125+
* @param array $formData
126+
* @param bool $isStrict
127+
* @param bool $isPrepareError
128+
* @return array|string
129+
*/
130+
protected function verifyData(array $fixtureData, array $formData, $isStrict = false, $isPrepareError = true)
131+
{
132+
$errors = [];
133+
foreach ($fixtureData as $key => $value) {
134+
if (in_array($key, $this->skippedFields, true)) {
135+
continue;
131136
}
137+
$formValue = isset($formData[$key]) ? $formData[$key] : null;
138+
$errors = $this->verifyDataForErrors($formValue, $key, $errors, $value);
139+
}
140+
return $this->prepareErrorsForOutput($fixtureData, $formData, $isStrict, $isPrepareError, $errors);
141+
}
132142

133-
$result[$customOption['title']] = $customOption;
143+
/**
144+
* Checks data for not equal values error
145+
*
146+
* @param array|string $value
147+
* @param array|string $formValue
148+
* @param string $key
149+
* @return string
150+
*/
151+
private function checkNotEqualValuesErrors($value, $formValue, $key)
152+
{
153+
/**
154+
* It is needed because sorting in db begins from 1, but when selenium driver gets value from form it starts
155+
* calculate from 0. So this operation checks this case
156+
*/
157+
if ((int)$value === (int)$formValue + 1) {
158+
return '';
159+
}
160+
if (is_array($value)) {
161+
$value = $this->arrayToString($value);
134162
}
163+
if (is_array($formValue)) {
164+
$formValue = $this->arrayToString($formValue);
165+
}
166+
return sprintf('- %s: "%s" instead of "%s"', $key, $formValue, $value);
167+
}
135168

169+
/**
170+
* Prepare errors data to output
171+
*
172+
* @param array $fixtureData
173+
* @param array $formData
174+
* @param $isStrict
175+
* @param $isPrepareError
176+
* @param $errors
177+
* @return array|string
178+
*/
179+
private function prepareErrorsForOutput(array $fixtureData, array $formData, $isStrict, $isPrepareError, $errors)
180+
{
181+
if ($isStrict) {
182+
$diffData = array_diff(array_keys($formData), array_keys($fixtureData));
183+
if ($diffData) {
184+
$errors[] = '- fields ' . implode(', ', $diffData) . ' is absent in fixture';
185+
}
186+
}
187+
if ($isPrepareError) {
188+
return $this->prepareErrors($errors);
189+
}
190+
return $errors;
191+
}
192+
193+
/**
194+
* Checks data for errors
195+
*
196+
* @param array|string $formValue
197+
* @param string $key
198+
* @param array $errors
199+
* @param string $value
200+
* @return array
201+
*/
202+
private function verifyDataForErrors($formValue, $key, $errors, $value)
203+
{
204+
if (is_numeric($formValue)) {
205+
$formValue = (float)$formValue;
206+
}
207+
if (null === $formValue) {
208+
$errors[] = '- field "' . $key . '" is absent in form';
209+
} elseif (is_array($value) && is_array($formValue)) {
210+
$valueErrors = $this->verifyData($value, $formValue, true, false);
211+
if (!empty($valueErrors)) {
212+
$errors[$key] = $valueErrors;
213+
}
214+
} elseif ($value != $formValue) {
215+
$notEqualValuesErrors = $this->checkNotEqualValuesErrors($value, $formValue, $key);
216+
if ($notEqualValuesErrors) {
217+
$errors[] = $notEqualValuesErrors;
218+
}
219+
}
220+
return $errors;
221+
}
222+
223+
/**
224+
* @param $actualPrice
225+
* @param $customOption
226+
* @param $result
227+
* @return array
228+
*/
229+
private function prepareEachCustomOption($actualPrice, $customOption, $result)
230+
{
231+
$skippedField = isset($this->skippedFieldOptions[$customOption['type']])
232+
? $this->skippedFieldOptions[$customOption['type']]
233+
: [];
234+
foreach ($customOption['options'] as &$option) {
235+
// recalculate percent price
236+
if ('Percent' == $option['price_type']) {
237+
$option['price'] = ($actualPrice * $option['price']) / 100;
238+
$option['price'] = round($option['price'], 2);
239+
}
240+
241+
$option = array_diff_key($option, array_flip($skippedField));
242+
}
243+
$result[$customOption['title']] = $customOption;
136244
return $result;
137245
}
138246

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,35 @@
953953
</field>
954954
</dataset>
955955

956+
<dataset name="with_two_custom_option_sort_order">
957+
<field name="attribute_set_id" xsi:type="array">
958+
<item name="dataset" xsi:type="string">default</item>
959+
</field>
960+
<field name="name" xsi:type="string">Simple Product %isolation%</field>
961+
<field name="sku" xsi:type="string">sku_simple_product_%isolation%</field>
962+
<field name="price" xsi:type="array">
963+
<item name="value" xsi:type="string">300</item>
964+
</field>
965+
<field name="product_has_weight" xsi:type="string">This item has weight</field>
966+
<field name="weight" xsi:type="string">1</field>
967+
<field name="quantity_and_stock_status" xsi:type="array">
968+
<item name="qty" xsi:type="string">23</item>
969+
<item name="is_in_stock" xsi:type="string">In Stock</item>
970+
</field>
971+
<field name="website_ids" xsi:type="array">
972+
<item name="0" xsi:type="array">
973+
<item name="dataset" xsi:type="string">default</item>
974+
</item>
975+
</field>
976+
<field name="custom_options" xsi:type="array">
977+
<item name="dataset" xsi:type="string">two_options_sort_order</item>
978+
</field>
979+
<field name="url_key" xsi:type="string">simple-product-%isolation%</field>
980+
<field name="checkout_data" xsi:type="array">
981+
<item name="dataset" xsi:type="string">simple_with_two_custom_option</item>
982+
</field>
983+
</dataset>
984+
956985
<dataset name="with_one_custom_option_and_category">
957986
<field name="attribute_set_id" xsi:type="array">
958987
<item name="dataset" xsi:type="string">default</item>

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

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
</item>
3838
</field>
3939
</dataset>
40-
4140
<dataset name="two_options">
4241
<field name="0" xsi:type="array">
4342
<item name="title" xsi:type="string">custom option drop down %isolation%</item>
@@ -56,8 +55,74 @@
5655
<item name="price" xsi:type="string">20</item>
5756
<item name="price_type" xsi:type="string">Percent</item>
5857
<item name="sku" xsi:type="string">sku_drop_down_row_2</item>
58+
<item name="sort_order" xsi:type="string">0</item>
59+
</item>
60+
</item>
61+
</field>
62+
<field name="1" xsi:type="array">
63+
<item name="title" xsi:type="string">custom option field %isolation%</item>
64+
<item name="is_require" xsi:type="string">Yes</item>
65+
<item name="type" xsi:type="string">Text/Field</item>
66+
<item name="options" xsi:type="array">
67+
<item name="0" xsi:type="array">
68+
<item name="price" xsi:type="string">10</item>
69+
<item name="price_type" xsi:type="string">Fixed</item>
70+
<item name="sku" xsi:type="string">sku_field_option_%isolation%</item>
71+
<item name="max_characters" xsi:type="string">1024</item>
72+
</item>
73+
</item>
74+
</field>
75+
</dataset>
76+
<dataset name="default_sort_order">
77+
<field name="0" xsi:type="array">
78+
<item name="title" xsi:type="string">custom option drop down %isolation%</item>
79+
<item name="is_require" xsi:type="string">Yes</item>
80+
<item name="type" xsi:type="string">Select/Drop-down</item>
81+
<item name="options" xsi:type="array">
82+
<item name="0" xsi:type="array">
83+
<item name="title" xsi:type="string">10 percent</item>
84+
<item name="price" xsi:type="string">10</item>
85+
<item name="price_type" xsi:type="string">Percent</item>
86+
<item name="sku" xsi:type="string">sku_drop_down_row_1</item>
87+
<item name="sort_order" xsi:type="string">1</item>
88+
</item>
89+
</item>
90+
</field>
91+
<field name="1" xsi:type="array">
92+
<item name="title" xsi:type="string">custom option drop down2 %isolation%</item>
93+
<item name="is_require" xsi:type="string">Yes</item>
94+
<item name="type" xsi:type="string">Select/Drop-down</item>
95+
<item name="options" xsi:type="array">
96+
<item name="0" xsi:type="array">
97+
<item name="title" xsi:type="string">20 percent</item>
98+
<item name="price" xsi:type="string">20</item>
99+
<item name="price_type" xsi:type="string">Percent</item>
100+
<item name="sku" xsi:type="string">sku_drop_down_row_2</item>
101+
<item name="sort_order" xsi:type="string">2</item>
102+
</item>
103+
</item>
104+
</field>
105+
</dataset>
106+
<dataset name="two_options_sort_order">
107+
<field name="0" xsi:type="array">
108+
<item name="title" xsi:type="string">custom option drop down %isolation%</item>
109+
<item name="is_require" xsi:type="string">Yes</item>
110+
<item name="type" xsi:type="string">Select/Drop-down</item>
111+
<item name="options" xsi:type="array">
112+
<item name="0" xsi:type="array">
113+
<item name="title" xsi:type="string">10 percent</item>
114+
<item name="price" xsi:type="string">10</item>
115+
<item name="price_type" xsi:type="string">Percent</item>
116+
<item name="sku" xsi:type="string">sku_drop_down_row_1</item>
59117
<item name="sort_order" xsi:type="string">1</item>
60118
</item>
119+
<item name="1" xsi:type="array">
120+
<item name="title" xsi:type="string">20 percent</item>
121+
<item name="price" xsi:type="string">20</item>
122+
<item name="price_type" xsi:type="string">Percent</item>
123+
<item name="sku" xsi:type="string">sku_drop_down_row_2</item>
124+
<item name="sort_order" xsi:type="string">2</item>
125+
</item>
61126
</item>
62127
</field>
63128
<field name="1" xsi:type="array">
@@ -74,7 +139,6 @@
74139
</item>
75140
</field>
76141
</dataset>
77-
78142
<dataset name="percent_and_fixed_drop_down_options">
79143
<field name="0" xsi:type="array">
80144
<item name="title" xsi:type="string">custom option drop down %isolation%</item>

dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateVirtualProductEntityTest.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
<constraint name="Magento\Catalog\Test\Constraint\AssertProductTierPriceOnProductPageWithCustomer" />
7272
</variation>
7373
<variation name="CreateVirtualProductEntityTestVariation5">
74-
<data name="issue" xsi:type="string">MAGETWO-67206: [FT] Magento\Catalog\Test\TestCase\Product\CreateVirtualProductEntityTest fails on CI</data>
7574
<data name="description" xsi:type="string">Create product with custom options suite and import options</data>
7675
<data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data>
7776
<data name="product/data/name" xsi:type="string">VirtualProduct %isolation%</data>
@@ -80,7 +79,7 @@
8079
<data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data>
8180
<data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data>
8281
<data name="product/data/custom_options/dataset" xsi:type="string">options_suite</data>
83-
<data name="product/data/custom_options/import_products" xsi:type="string">catalogProductSimple::with_two_custom_option,catalogProductSimple::with_all_custom_option</data>
82+
<data name="product/data/custom_options/import_products" xsi:type="string">catalogProductSimple::with_two_custom_option_sort_order,catalogProductSimple::with_all_custom_option</data>
8483
<constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" />
8584
<constraint name="Magento\Catalog\Test\Constraint\AssertProductSearchableBySku" />
8685
<constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" />

0 commit comments

Comments
 (0)