From c7d58927f294a5b0053ab643f37dfd59c49ae40f Mon Sep 17 00:00:00 2001
From: Maksym Aposov <maposov@ebay.com>
Date: Mon, 7 Dec 2015 04:16:35 +0200
Subject: [PATCH] MAGETWO-45256: [TD] Fix functional tests related to
 Configurable products

---
 .htaccess                                     |  3 +
 .../Test/Block/Product/View.php               |  1 +
 .../Product/View/ConfigurableOptions.php      | 57 ++++++++++++++++---
 .../AssertConfigurableProductPage.php         | 38 +++++++++----
 .../UpdateConfigurableProductEntityTest.xml   |  5 +-
 .../UpdateConfigurableProductStep.php         |  1 -
 6 files changed, 84 insertions(+), 21 deletions(-)

diff --git a/.htaccess b/.htaccess
index 50c06d4e3ae..33c76b7a256 100644
--- a/.htaccess
+++ b/.htaccess
@@ -39,6 +39,9 @@
 
     php_value memory_limit 768M
     php_value max_execution_time 18000
+    php_value session.gc_probability 0
+    php_value session.gc_divisor 100000000
+    php_value session.save_path /var/tmp
 
 ############################################
 ## disable automatic session start
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php
index ea17b756ba5..567192cf279 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View.php
@@ -78,6 +78,7 @@ class View extends \Magento\Catalog\Test\Block\Product\View
     {
         $options = [
             'configurable_options' => $this->getConfigurableOptionsBlock()->getOptions($product),
+            'matrix' => $this->getConfigurableOptionsBlock()->getOptionsPrices($product)
         ];
         $options += parent::getOptions($product);
 
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View/ConfigurableOptions.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View/ConfigurableOptions.php
index 61dee6b3552..14ba9f7c020 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View/ConfigurableOptions.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Product/View/ConfigurableOptions.php
@@ -68,10 +68,35 @@ class ConfigurableOptions extends CustomOptions
                 ? 'Yes'
                 : 'No';
 
-            foreach ($optionData['options'] as $key => $value) {
-                $optionData['options'][$key]['price'] = $this->getOptionPrice($title, $value['title']);
-            }
             $result[$title] = $optionData;
+            // Select first attribute option to be able proceed with next attribute
+            $this->selectOption($title, $optionData['options'][0]['title']);
+        }
+
+        return $result;
+    }
+
+    /**
+     * Get configurable attributes options prices
+     *
+     * @param FixtureInterface $product
+     * @return array
+     */
+    public function getOptionsPrices(FixtureInterface $product)
+    {
+        /** @var ConfigurableProduct $product */
+        $attributesData = $product->hasData('configurable_attributes_data')
+            ? $product->getConfigurableAttributesData()['attributes_data']
+            : [];
+        $productVariations = $product->hasData('configurable_attributes_data')
+            ? $product->getConfigurableAttributesData()['matrix']
+            : [];
+        $productVariations = array_keys($productVariations);
+
+        $result = [];
+        foreach ($productVariations as $variation) {
+            $variationOptions = explode(' ', $variation);
+            $result[$variation]['price'] = $this->getOptionPrice($variationOptions, $attributesData);
         }
 
         return $result;
@@ -80,14 +105,20 @@ class ConfigurableOptions extends CustomOptions
     /**
      * Get option price
      *
-     * @param $attributeTitle
-     * @param $optionTitle
+     * @param array $variationOptions
+     * @param array $attributesData
      * @return null|string
      */
-    protected function getOptionPrice($attributeTitle, $optionTitle)
+    protected function getOptionPrice($variationOptions, $attributesData)
     {
-        $this->_rootElement->find(sprintf($this->optionSelector, $attributeTitle), Locator::SELECTOR_XPATH, 'select')
-            ->setValue($optionTitle);
+        //Select all options specified in variation
+        foreach ($variationOptions as $variationSelection) {
+            list ($attribute, $option) = explode(':', $variationSelection);
+            $attributeTitle = $attributesData[$attribute]['label'];
+            $optionTitle = $attributesData[$attribute]['options'][$option]['label'];
+            $this->selectOption($attributeTitle, $optionTitle);
+        }
+
         $priceBlock = $this->getPriceBlock();
         $price = ($priceBlock->isOldPriceVisible()) ? $priceBlock->getOldPrice() : $priceBlock->getPrice();
         return $price;
@@ -105,4 +136,14 @@ class ConfigurableOptions extends CustomOptions
             ['element' => $this->_rootElement->find($this->priceBlock, Locator::SELECTOR_XPATH)]
         );
     }
+
+    /**
+     * @param string $attributeTitle
+     * @param string $optionTitle
+     */
+    protected function selectOption($attributeTitle, $optionTitle)
+    {
+        $this->_rootElement->find(sprintf($this->optionSelector, $attributeTitle), Locator::SELECTOR_XPATH, 'select')
+            ->setValue($optionTitle);
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php
index a1f917925dc..f6fa5eac2bf 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Constraint/AssertConfigurableProductPage.php
@@ -58,11 +58,11 @@ class AssertConfigurableProductPage extends AssertProductPage
      */
     protected function verifyAttributes()
     {
-        $attributesData = $this->product->getConfigurableAttributesData()['attributes_data'];
+        $attributesData = $this->product->getConfigurableAttributesData();
         $configurableOptions = [];
-        $formOptions = $this->productView->getOptions($this->product)['configurable_options'];
+        $formOptions = $this->productView->getOptions($this->product);
 
-        foreach ($attributesData as $attributeKey => $attributeData) {
+        foreach ($attributesData['attributes_data'] as $attributeKey => $attributeData) {
             $optionData = [
                 'title' => $attributeData['frontend_label'],
                 'type' => $attributeData['frontend_input'],
@@ -70,11 +70,10 @@ class AssertConfigurableProductPage extends AssertProductPage
             ];
 
             foreach ($attributeData['options'] as $optionKey => $option) {
-                $price = $option['pricing_value'];
-
                 $optionData['options'][$optionKey] = [
                     'title' => $option['label'],
-                    'price' => number_format($price, 2),
+                    //Mock price validation
+                    'price' => 0
                 ];
             }
 
@@ -86,15 +85,34 @@ class AssertConfigurableProductPage extends AssertProductPage
         foreach ($configurableOptions as $key => $configurableOption) {
             $configurableOptions[$key] = $this->sortDataByPath($configurableOption, 'options::title');
         }
-        $formOptions = $this->sortDataByPath($formOptions, '::title');
-        foreach ($formOptions as $key => $formOption) {
-            $formOptions[$key] = $this->sortDataByPath($formOption, 'options::title');
+        $configurableFormOptions = $formOptions['configurable_options'];
+        $configurableFormOptions = $this->sortDataByPath($configurableFormOptions, '::title');
+        foreach ($configurableFormOptions as $key => $formOption) {
+            $configurableFormOptions[$key] = $this->sortDataByPath($formOption, 'options::title');
         }
 
-        $errors = $this->verifyData($configurableOptions, $formOptions, true, false);
+        //Verify Attribute and options
+        $errors = $this->verifyData($configurableOptions, $configurableFormOptions, true, false);
+
+        //Verify Attribute options prices
+        $errors += $this->verifyAttributesMatrix($formOptions['matrix'], $attributesData['matrix']);
         return empty($errors) ? null : $this->prepareErrors($errors, 'Error configurable options:');
     }
 
+    /**
+     * Verify displayed product attributes prices on product page(front-end) equals passed from fixture
+     *
+     * @return string|null
+     */
+    protected function verifyAttributesMatrix($variationsMatrix, $generatedMatrix)
+    {
+        $allowedKeys = ['price'];
+        foreach ($generatedMatrix as $key => $value) {
+            $generatedMatrix[$key] = array_intersect_key($value, array_flip($allowedKeys));
+        }
+        return $this->verifyData($generatedMatrix, $variationsMatrix, true, false);
+    }
+
     /**
      * Returns lowest possible price of configurable product.
      *
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml
index 543ffade21f..681d453f3b3 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestCase/UpdateConfigurableProductEntityTest.xml
@@ -14,10 +14,11 @@
             <data name="updatedProduct/data/url_key" xsi:type="string">configurable-product-%isolation%</data>
             <data name="updatedProduct/data/configurable_attributes_data/dataset" xsi:type="string">one_new_options</data>
             <data name="updatedProduct/data/checkout_data/dataset" xsi:type="string">configurable_two_attributes</data>
-            <data name="updatedProduct/data/checkout_data/cartItem/price" xsi:type="string">153</data>
+            <data name="updatedProduct/data/checkout_data/cartItem/price" xsi:type="string">42</data>
             <data name="updatedProduct/data/name" xsi:type="string">Configurable Product %isolation%</data>
             <data name="updatedProduct/data/sku" xsi:type="string">configurable_sku_%isolation%</data>
-            <data name="updatedProduct/data/price/value" xsi:type="string">99</data>
+            <!--lowest price of option-->
+            <data name="updatedProduct/data/price/value" xsi:type="string">40</data>
             <data name="updatedProduct/data/category_ids/dataset" xsi:type="string">default_subcategory</data>
             <data name="updatedProduct/data/short_description" xsi:type="string">Configurable short description</data>
             <data name="updatedProduct/data/description" xsi:type="string">Configurable Product description %isolation%</data>
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestStep/UpdateConfigurableProductStep.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestStep/UpdateConfigurableProductStep.php
index 1381828eae8..d7c19a21e48 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestStep/UpdateConfigurableProductStep.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/TestStep/UpdateConfigurableProductStep.php
@@ -134,7 +134,6 @@ class UpdateConfigurableProductStep implements TestStepInterface
 
         $dataProduct['configurable_attributes_data'] = [
             'attributes_data' => $attributesData,
-            'matrix' => $oldMatrix,
         ];
 
         if ($product->hasData('category_ids')) {
-- 
GitLab