Skip to content

Commit

Permalink
Merge pull request #2855 from magento-borg/MAGETWO-91528
Browse files Browse the repository at this point in the history
[borg] MAGETWO-91528: Customizable options truncated when displaying ordered product in admin
  • Loading branch information
cpartica authored Jul 19, 2018
2 parents 21990f7 + 74cac07 commit af2ec60
Show file tree
Hide file tree
Showing 12 changed files with 446 additions and 6 deletions.
4 changes: 4 additions & 0 deletions app/code/Magento/Catalog/Test/Mftf/Data/ProductData.xml
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,10 @@
<requiredEntity type="product_option">ProductOptionDateTime</requiredEntity>
<requiredEntity type="product_option">ProductOptionTime</requiredEntity>
</entity>
<entity name="productWithOptions2" type="product">
<var key="sku" entityType="product" entityKey="sku" />
<requiredEntity type="product_option">ProductOptionDropDownWithLongValuesTitle</requiredEntity>
</entity>
<entity name="ApiVirtualProductWithDescription" type="product">
<data key="sku" unique="suffix">api-virtual-product</data>
<data key="type_id">virtual</data>
Expand Down
11 changes: 10 additions & 1 deletion app/code/Magento/Catalog/Test/Mftf/Data/ProductOptionData.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,15 @@
<requiredEntity type="product_option_value">ProductOptionValueDropdown1</requiredEntity>
<requiredEntity type="product_option_value">ProductOptionValueDropdown2</requiredEntity>
</entity>
<entity name="ProductOptionDropDownWithLongValuesTitle" type="product_option">
<var key="product_sku" entityType="product" entityKey="sku" />
<data key="title">OptionDropDownWithLongTitles</data>
<data key="type">drop_down</data>
<data key="sort_order">4</data>
<data key="is_require">true</data>
<requiredEntity type="product_option_value">ProductOptionValueDropdownLongTitle1</requiredEntity>
<requiredEntity type="product_option_value">ProductOptionValueDropdownLongTitle2</requiredEntity>
</entity>
<entity name="ProductOptionRadiobutton" type="product_option">
<var key="product_sku" entityType="product" entityKey="sku" />
<data key="title">OptionRadioButtons</data>
Expand Down Expand Up @@ -112,4 +121,4 @@
<data key="price">0.00</data>
<data key="price_type">percent</data>
</entity>
</entities>
</entities>
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,16 @@
<data key="price">2</data>
<data key="price_type">fixed</data>
</entity>
</entities>
<entity name="ProductOptionValueDropdownLongTitle1" type="product_option_value">
<data key="title">Optisfvdklvfnkljvnfdklpvnfdjklfdvnjkvfdkjnvfdjkfvndj11111Optisfvdklvfnkljvnfdklpvnfdjklfdvnjkvfdkjnvfdjkfvndj11111</data>
<data key="sort_order">1</data>
<data key="price">10</data>
<data key="price_type">fixed</data>
</entity>
<entity name="ProductOptionValueDropdownLongTitle2" type="product_option_value">
<data key="title">Optisfvdklvfnkljvnfdklpvnfdjklfdvnjkvfdkjnvfdjkfvndj22222Optisfvdklvfnkljvnfdklpvnfdjklfdvnjkvfdkjnvfdjkfvndj22222</data>
<data key="sort_order">2</data>
<data key="price">20</data>
<data key="price_type">percent</data>
</entity>
</entities>
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->

<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../../../../../dev/tests/acceptance/vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/testSchema.xsd">
<test name="StorefrontPurchaseProductWithCustomOptionsWithLongValuesTitle">
<annotations>
<group value="Catalog"/>
<title value="Admin should be able to see the full title of the selected custom option value in the order"/>
<description value="Admin should be able to see the full title of the selected custom option value in the order"/>
<severity value="MAJOR"/>
<testCaseId value="MC-3043"/>
<group value="skip"/>
<!-- Skip due to MQE-1128 -->
</annotations>
<before>
<!--Create Simple Product with Custom Options-->
<createData entity="_defaultCategory" stepKey="createCategory"/>
<createData entity="_defaultProduct" stepKey="createProduct">
<requiredEntity createDataKey="createCategory"/>
<field key="price">17</field>
</createData>
<updateData createDataKey="createProduct" entity="productWithOptions2" stepKey="updateProductWithOptions"/>

<createData entity="Simple_US_Customer" stepKey="createCustomer"/>
</before>
<after>
<deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/>
<deleteData createDataKey="createProduct" stepKey="deleteProduct"/>
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
</after>

<!-- Login Customer Storefront -->

<amOnPage url="{{StorefrontCustomerSignInPage.url}}" stepKey="amOnSignInPage"/>
<fillField userInput="$$createCustomer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}" stepKey="fillEmail"/>
<fillField userInput="$$createCustomer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}" stepKey="fillPassword"/>
<click selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}" stepKey="clickSignInAccountButton"/>

<!-- Checking the correctness of displayed prices for user parameters -->

<amOnPage url="{{StorefrontHomePage.url}}$$createProduct.custom_attributes[url_key]$$.html" stepKey="amOnProductPage"/>
<seeElement selector="{{StorefrontProductInfoMainSection.productAttributeOptionsDropDown(ProductOptionDropDownWithLongValuesTitle.title, ProductOptionValueDropdownLongTitle1.price)}}" stepKey="checkDropDownProductOption"/>

<!-- Adding items to the checkout -->

<selectOption userInput="{{ProductOptionValueDropdownLongTitle1.price}}" selector="{{StorefrontProductInfoMainSection.productOptionSelect(ProductOptionDropDownWithLongValuesTitle.title)}}" stepKey="seeProductOptionDropDown"/>
<grabTextFrom selector="{{StorefrontProductInfoMainSection.productPrice}}" stepKey="finalProductPrice"/>

<actionGroup ref="StorefrontAddToCartCustomOptionsProductPageActionGroup" stepKey="addToCartFromStorefrontProductPage">
<argument name="productName" value="$$createProduct.name$$"/>
</actionGroup>

<!-- Checking the correctness of displayed custom options for user parameters on checkout -->

<actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="goToCheckoutFromMinicart" />

<conditionalClick selector="{{CheckoutPaymentSection.cartItemsArea}}" dependentSelector="{{CheckoutPaymentSection.cartItemsArea}}" visible="true" stepKey="exposeMiniCart"/>

<waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskForCartItem"/>
<waitForElement selector="{{CheckoutPaymentSection.cartItemsAreaActive}}" time="30" stepKey="waitForCartItemsAreaActive"/>

<see selector="{{CheckoutPaymentSection.cartItems}}" userInput="$$createProduct.name$$" stepKey="seeProductInCart"/>

<conditionalClick selector="{{CheckoutPaymentSection.ProductOptionsByProductItemName($$createProduct.name$$)}}" dependentSelector="{{CheckoutPaymentSection.ProductOptionsActiveByProductItemName($$createProduct.name$$)}}" visible="false" stepKey="exposeProductOptions"/>

<see selector="{{CheckoutPaymentSection.ProductOptionsActiveByProductItemName($$createProduct.name$$)}}" userInput="{{ProductOptionValueDropdownLongTitle1.title}}" stepKey="seeProductOptionValueDropdown1Input1"/>

<click selector="{{CheckoutShippingSection.next}}" stepKey="clickNext"/>

<!-- Place Order -->

<waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30" stepKey="waitForPlaceOrderButton"/>
<click selector="{{CheckoutPaymentSection.placeOrder}}" stepKey="clickPlaceOrder"/>

<grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber22}}" stepKey="grabOrderNumber"/>

<!-- Login to Admin and open Order -->

<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin1"/>

<amOnPage url="{{AdminOrdersPage.url}}" stepKey="onOrdersPage"/>
<waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappearOnOrdersPage"/>
<fillField selector="{{AdminOrdersGridSection.search}}" userInput="{$grabOrderNumber}" stepKey="fillOrderNum"/>
<click selector="{{AdminOrdersGridSection.submitSearch}}" stepKey="submitSearchOrderNum"/>
<waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappearOnSearch"/>
<click selector="{{AdminOrdersGridSection.firstRow}}" stepKey="clickOrderRow"/>

<!-- Checking the correctness of displayed custom options for user parameters on Order -->

<dontSee selector="{{AdminOrderItemsOrderedSection.productNameOptions}}" userInput="{{ProductOptionValueDropdownLongTitle1.title}}" stepKey="dontSeeAdminOrderProductOptionValueDropdown1"/>
<grabTextFrom selector="{{AdminOrderItemsOrderedSection.productNameOptions}} dd" stepKey="productOptionValueText"/>
<assertEquals stepKey="checkProductOptionValue">
<actualResult type="variable">productOptionValueText</actualResult>
<expectedResult type="string">Optisfvdklvfnkljvnfdklpvnfdjklfdvnjkvfdkjnvfdjkfvndj111 ...</expectedResult>
</assertEquals>
<moveMouseOver selector="{{AdminOrderItemsOrderedSection.productNameOptions}} dd" stepKey="hoverProduct"/>
<waitForElementVisible selector="{{AdminOrderItemsOrderedSection.productNameOptions}} dd:nth-child(2)" stepKey="waitForCustomOptionValueFullName"/>
<see selector="{{AdminOrderItemsOrderedSection.productNameOptions}}" userInput="{{ProductOptionValueDropdownLongTitle1.title}}" stepKey="seeAdminOrderProductOptionValueDropdown1"/>
</test>
</tests>
20 changes: 16 additions & 4 deletions app/code/Magento/Sales/Block/Adminhtml/Items/Column/Name.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
*/
namespace Magento\Sales\Block\Adminhtml\Items\Column;

use Magento\Framework\Filter\TruncateFilter\Result;

/**
* Sales Order items name column renderer
*
Expand All @@ -13,6 +15,11 @@
*/
class Name extends \Magento\Sales\Block\Adminhtml\Items\Column\DefaultColumn
{
/**
* @var Result
*/
private $truncateResult = null;

/**
* Truncate string
*
Expand All @@ -22,13 +29,15 @@ class Name extends \Magento\Sales\Block\Adminhtml\Items\Column\DefaultColumn
* @param string &$remainder
* @param bool $breakWords
* @return string
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function truncateString($value, $length = 80, $etc = '...', &$remainder = '', $breakWords = true)
{
return $this->filterManager->truncate(
$this->truncateResult = $this->filterManager->truncateFilter(
$value,
['length' => $length, 'etc' => $etc, 'remainder' => $remainder, 'breakWords' => $breakWords]
['length' => $length, 'etc' => $etc, 'breakWords' => $breakWords]
);
return $this->truncateResult->getValue();
}

/**
Expand All @@ -40,8 +49,11 @@ public function truncateString($value, $length = 80, $etc = '...', &$remainder =
public function getFormattedOption($value)
{
$remainder = '';
$value = $this->truncateString($value, 55, '', $remainder);
$result = ['value' => nl2br($value), 'remainder' => nl2br($remainder)];
$this->truncateString($value, 55, '', $remainder);
$result = [
'value' => nl2br($this->truncateResult->getValue()),
'remainder' => nl2br($this->truncateResult->getRemainder())
];

return $result;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Framework\Filter;

class TruncateFilterTest extends \PHPUnit\Framework\TestCase
{
/**
* @param string $expectedValue
* @param string $expectedRemainder
* @param string $string
* @param int $length
* @param string $etc
* @param bool $breakWords
* @dataProvider truncateDataProvider
*/
public function testFilter(
$expectedValue,
$expectedRemainder,
$string,
$length = 5,
$etc = '...',
$breakWords = true
) {
/** @var TruncateFilter $truncateFilter */
$truncateFilter = \Magento\TestFramework\ObjectManager::getInstance()->create(
TruncateFilter::class,
[
'length' => $length,
'etc' => $etc,
'breakWords' => $breakWords,
]
);
$result = $truncateFilter->filter($string);
$this->assertEquals($expectedValue, $result->getValue());
$this->assertEquals($expectedRemainder, $result->getRemainder());
}

public function truncateDataProvider() : array
{
return [
'1' => [
'12...',
'34567890',
'1234567890',
],
'2' => [
'123..',
' 456 789',
'123 456 789',
8,
'..',
false
]
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Sales\Block\Adminhtml\Items\Column;

/**
* @magentoAppArea adminhtml
*/
class NameTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Name
*/
private $block;

protected function setUp()
{
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
/** @var $layout \Magento\Framework\View\Layout */
$layout = $objectManager->create(\Magento\Framework\View\LayoutInterface::class);
/** @var $block \Magento\Sales\Block\Adminhtml\Items\AbstractItems */
$this->block = $layout->createBlock(Name::class, 'block');
}

public function testTruncateString() : void
{
$remainder = '';
$this->assertEquals(
'12345',
$this->block->truncateString('1234567890', 5, '', $remainder)
);
}

public function testGetFormattedOptiong() : void
{
$this->assertEquals(
[
'value' => '1234567890123456789012345678901234567890123456789012345',
'remainder' => '67890',
],
$this->block->getFormattedOption(
'123456789012345678901234567890123456789012345678901234567890'
)
);
}
}
1 change: 1 addition & 0 deletions lib/internal/Magento/Framework/Filter/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class Factory extends AbstractFactory
'decrypt' => \Magento\Framework\Filter\Decrypt::class,
'translit' => \Magento\Framework\Filter\Translit::class,
'translitUrl' => \Magento\Framework\Filter\TranslitUrl::class,
'truncateFilter' => \Magento\Framework\Filter\TruncateFilter::class,
];

/**
Expand Down
1 change: 1 addition & 0 deletions lib/internal/Magento/Framework/Filter/FilterManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
* @method string removeTags(string $value, $params = array())
* @method string stripTags(string $value, $params = array())
* @method string truncate(string $value, $params = array())
* @method string truncateFilter(string $value, $params = array())
* @method string encrypt(string $value, $params = array())
* @method string decrypt(string $value, $params = array())
* @method string translit(string $value)
Expand Down
3 changes: 3 additions & 0 deletions lib/internal/Magento/Framework/Filter/Truncate.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
*
* Truncate a string to a certain length if necessary, appending the $etc string.
* $remainder will contain the string that has been replaced with $etc.
*
* @deprecated
* @see \Magento\Framework\Filter\TruncateFilter
*/
class Truncate implements \Zend_Filter_Interface
{
Expand Down
Loading

0 comments on commit af2ec60

Please sign in to comment.