/**
  * Assert that duplicated product can be found in grid by type, template, status and stock status.
  *
  * @param InjectableFixture $product
  * @param CatalogProduct $productGrid
  * @return void
  */
 public function processAssert(InjectableFixture $product, CatalogProduct $productGrid)
 {
     $config = $product->getDataConfig();
     $filter = ['name' => $product->getName(), 'visibility' => $product->getVisibility(), 'status' => 'Disabled', 'type' => ucfirst($config['create_url_params']['type']) . ' Product', 'price_to' => number_format($product->getPrice(), 2)];
     $productGrid->open()->getProductGrid()->search($filter);
     \PHPUnit_Framework_Assert::assertTrue($productGrid->getProductGrid()->isRowVisible($filter, false, false), 'Product duplicate is absent in Products grid.');
 }
 /**
  * Get configurable product price.
  *
  * @param InjectableFixture $product
  * @return int
  */
 protected function getProductPrice(InjectableFixture $product)
 {
     $price = $product->getPrice();
     if (!$this->productsIsConfigured) {
         return $price;
     }
     $checkoutData = $product->getCheckoutData();
     if ($checkoutData === null) {
         return 0;
     }
     $attributesData = $product->getConfigurableOptions()['attributes_data'];
     foreach ($checkoutData['options']['configurable_options'] as $option) {
         $itemOption = $attributesData[$option['title']]['options'][$option['value']];
         $price += $itemOption['price_type'] == 'Fixed' ? $itemOption['price'] : $product->getPrice() / 100 * $itemOption['price'];
     }
     return $price;
 }
 /**
  * Verify displayed product price on product page(front-end) equals passed from fixture.
  *
  * @return string|null
  */
 protected function verifyPrice()
 {
     if ($this->product->hasData('price') == false) {
         return null;
     }
     $fixtureProductPrice = number_format($this->product->getPrice(), 2);
     $formProductPrice = $this->productView->getPriceBlock()->getRegularPrice();
     if ($fixtureProductPrice == $formProductPrice) {
         return null;
     }
     $error = "Displayed product price on product page(front-end) not equals passed from fixture. " . "Actual: {$formProductPrice}, expected: {$fixtureProductPrice}.";
     $verifySpecialPriceResult = $this->verifySpecialPrice();
     if ($verifySpecialPriceResult !== null) {
         $error .= $verifySpecialPriceResult;
     }
     return $error;
 }
 /**
  * Get product actual price.
  *
  * @param InjectableFixture $product
  * @return int
  */
 protected function getProductActualPrice(InjectableFixture $product)
 {
     return $product->hasData('special_price') ? $product->getSpecialPrice() : $product->getPrice();
 }
 /**
  * Prepare attribute data.
  *
  * @param InjectableFixture $product
  * @param int $key
  * @return array
  */
 protected function prepareAttributeData(InjectableFixture $product, $key)
 {
     $data = [];
     foreach ($this->attributeProduct as $attributeKey => $attribute) {
         $value = $attribute;
         $attribute = is_numeric($attributeKey) ? $attribute : $attributeKey;
         $attributeValue = $attribute != 'price' ? $product->hasData($attribute) ? $product->getData($attribute) : 'N/A' : ($product->getDataFieldConfig('price')['source']->getPreset() !== null ? $product->getDataFieldConfig('price')['source']->getPreset() : number_format($product->getPrice(), 2));
         $data['attributeValues'][$attribute] = !is_array($attributeValue) ? strtolower($attributeValue) : $attributeValue;
         $attributeName = $value === 'name' || $value === 'price' ? 'Info' : 'MetaData';
         $data['attributeValuesFromPage'][$attribute] = $this->comparePage->getCompareProductsBlock()->{'getProduct' . $attributeName}($key + 1, $value);
     }
     return $data;
 }
 /**
  * Get assigned product price.
  *
  * @param array $dataAssignedProduct
  * @param InjectableFixture $fixtureAssignedProduct
  * @param string $optionType
  * @return float
  */
 protected function getAssignedProductPrice(array $dataAssignedProduct, InjectableFixture $fixtureAssignedProduct, $optionType)
 {
     $resultPrice = $fixtureAssignedProduct->getPrice();
     if (isset($dataAssignedProduct['selection_price_value'])) {
         $assignedItemPrice = $dataAssignedProduct['selection_price_type'] == 'Fixed' ? $dataAssignedProduct['selection_price_value'] : $this->product->getPrice() * $dataAssignedProduct['selection_price_value'] / 100;
         $resultPrice = $optionType == 'Drop-down' || $optionType == 'Radio Buttons' ? $assignedItemPrice : $assignedItemPrice * $dataAssignedProduct['selection_qty'];
     }
     return $resultPrice;
 }
 /**
  * Verify product price on category view page.
  *
  * @param InjectableFixture $product
  * @param CatalogCategoryView $catalogCategoryView
  * @return void
  */
 protected function assertPrice(InjectableFixture $product, CatalogCategoryView $catalogCategoryView)
 {
     $price = $catalogCategoryView->getListProductBlock()->getProductPriceBlock($product->getName())->getRegularPrice();
     \PHPUnit_Framework_Assert::assertEquals(number_format($product->getPrice(), 2), $price, 'Product regular price on category page is not correct.');
 }
 /**
  * Prepare product price from fixture.
  *
  * @param InjectableFixture $product
  * @return float
  */
 protected function prepareFixturePrice(InjectableFixture $product)
 {
     /** @var CatalogProductSimple $product */
     $customOptions = $product->getCustomOptions();
     $checkoutData = $product->getCheckoutData();
     $checkoutCustomOptions = isset($checkoutData['options']['custom_options']) ? $checkoutData['options']['custom_options'] : [];
     if (isset($checkoutData['cartItem'])) {
         $fixturePrice = $checkoutData['cartItem']['price'];
     } else {
         $fixturePrice = $product->getPrice();
         $groupPrice = $product->getGroupPrice();
         $specialPrice = $product->getSpecialPrice();
         if ($groupPrice) {
             $groupPrice = reset($groupPrice);
             $fixturePrice = $groupPrice['price'];
         }
         if ($specialPrice) {
             $fixturePrice = $specialPrice;
         }
         foreach ($checkoutCustomOptions as $checkoutOption) {
             $attributeKey = str_replace('attribute_key_', '', $checkoutOption['title']);
             $optionKey = str_replace('option_key_', '', $checkoutOption['value']);
             $option = $customOptions[$attributeKey]['options'][$optionKey];
             if ('Fixed' == $option['price_type']) {
                 $fixturePrice += $option['price'];
             } else {
                 $fixturePrice += $fixturePrice / 100 * $option['price'];
             }
         }
     }
     return $fixturePrice;
 }
 /**
  * Get product price.
  *
  * @param InjectableFixture $product
  * @return int
  */
 protected function getProductPrice(InjectableFixture $product)
 {
     return isset($product->getCheckoutData()['cartItem']['price']) ? $product->getCheckoutData()['cartItem']['price'] : $product->getPrice();
 }