Skip to content

Commit

Permalink
magento#9961: Unused product attributes display with value N/A or NO …
Browse files Browse the repository at this point in the history
…on storefront.
  • Loading branch information
p-bystritsky committed Nov 6, 2017
1 parent 13a933a commit c2a2450
Show file tree
Hide file tree
Showing 2 changed files with 160 additions and 1 deletion.
4 changes: 3 additions & 1 deletion app/code/Magento/Catalog/Block/Product/View/Attributes.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,15 @@ public function getAdditionalData(array $excludeAttr = [])

if (!$product->hasData($attribute->getAttributeCode())) {
$value = __('N/A');
} elseif ($value instanceof Phrase) {
$value = (string)$value;
} elseif ((string)$value == '') {
$value = __('No');
} elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) {
$value = $this->priceCurrency->convertAndFormat($value);
}

if ($value instanceof Phrase || (is_string($value) && strlen($value))) {
if (is_string($value) && strlen($value)) {
$data[$attribute->getAttributeCode()] = [
'label' => __($attribute->getStoreLabel()),
'value' => $value,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Magento\Catalog\Test\Unit\Block\Product\View;

use \PHPUnit\Framework\TestCase;
use \Magento\Framework\Phrase;
use \Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
use \Magento\Eav\Model\Entity\Attribute\Frontend\AbstractFrontend;
use \Magento\Catalog\Model\Product;
use \Magento\Framework\View\Element\Template\Context;
use \Magento\Framework\Registry;
use \Magento\Framework\Pricing\PriceCurrencyInterface;
use \Magento\Catalog\Block\Product\View\Attributes as AttributesBlock;

/**
* Test class for \Magento\Catalog\Block\Product\View\Attributes
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class AttributesTest extends TestCase
{
/**
* @var \Magento\Framework\Phrase
*/
private $phrase;

/**
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Eav\Model\Entity\Attribute\AbstractAttribute
*/
private $attribute;

/**
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Eav\Model\Entity\Attribute\Frontend\AbstractFrontend
*/
private $frontendAttribute;

/**
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Product
*/
private $product;

/**
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\View\Element\Template\Context
*/
private $context;

/**
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Registry
*/
private $registry;

/**
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Pricing\PriceCurrencyInterface
*/
private $priceCurrencyInterface;

/**
* @var \Magento\Catalog\Block\Product\View\Attributes
*/
private $attributesBlock;

protected function setUp()
{
$this->phrase = new Phrase(__(''));
$this->attribute = $this
->getMockBuilder(AbstractAttribute::class)
->disableOriginalConstructor()
->getMock();
$this->attribute
->expects($this->any())
->method('getIsVisibleOnFront')
->willReturn(true);
$this->attribute
->expects($this->any())
->method('getAttributeCode')
->willReturn('phrase');
$this->frontendAttribute = $this
->getMockBuilder(AbstractFrontend::class)
->disableOriginalConstructor()
->getMock();
$this->attribute
->expects($this->any())
->method('getFrontendInput')
->willReturn('phrase');
$this->attribute
->expects($this->any())
->method('getFrontend')
->willReturn($this->frontendAttribute);
$this->product = $this
->getMockBuilder(Product::class)
->disableOriginalConstructor()
->getMock();
$this->product
->expects($this->any())
->method('getAttributes')
->willReturn([$this->attribute]);
$this->product
->expects($this->any())
->method('hasData')
->willReturn(true);
$this->context = $this
->getMockBuilder(Context::class)
->disableOriginalConstructor()
->getMock();
$this->registry = $this
->getMockBuilder(Registry::class)
->disableOriginalConstructor()
->getMock();
$this->registry
->expects($this->any())
->method('registry')
->willReturn($this->product);
$this->priceCurrencyInterface = $this
->getMockBuilder(PriceCurrencyInterface::class)
->disableOriginalConstructor()
->getMock();
$this->attributesBlock = new AttributesBlock(
$this->context,
$this->registry,
$this->priceCurrencyInterface
);
}

/**
* @return void
*/
public function testGetAttributeNoValue()
{
$this->phrase = new Phrase(__(''));
$this->frontendAttribute
->expects($this->any())
->method('getValue')
->willReturn($this->phrase);
$attributes = $this->attributesBlock->getAdditionalData();
$this->assertTrue(empty($attributes['phrase']));
}

/**
* @return void
*/
public function testGetAttributeHasValue()
{
$this->phrase = new Phrase(__('Yes'));
$this->frontendAttribute
->expects($this->any())
->method('getValue')
->willReturn($this->phrase);
$attributes = $this->attributesBlock->getAdditionalData();
$this->assertNotTrue(empty($attributes['phrase']));
$this->assertNotTrue(empty($attributes['phrase']['value']));
$this->assertEquals('Yes', $attributes['phrase']['value']);
}
}

0 comments on commit c2a2450

Please sign in to comment.