Skip to content

Commit d03bc98

Browse files
authored
Merge pull request #1223 from magento-tsg/MAGETWO-67048
[TSGAB] MAGETWO-67048: Cannot add translate attribute into the di.xml
2 parents 2992ee2 + 5dbe193 commit d03bc98

File tree

7 files changed

+159
-6
lines changed

7 files changed

+159
-6
lines changed

dev/tests/integration/testsuite/Magento/Framework/ObjectManager/Config/Reader/DomTest.php

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
*/
66
namespace Magento\Framework\ObjectManager\Config\Reader;
77

8+
/**
9+
* Class DomTest @covers \Magento\Framework\ObjectManager\Config\Reader\Dom
10+
*
11+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
12+
*/
813
class DomTest extends \PHPUnit_Framework_TestCase
914
{
1015
/**
@@ -58,8 +63,9 @@ protected function setUp()
5863
false
5964
);
6065
$this->_fileResolverMock->expects($this->once())->method('get')->will($this->returnValue($this->_fileList));
61-
$this->_mapper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
62-
\Magento\Framework\ObjectManager\Config\Mapper\Dom::class
66+
$this->_mapper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
67+
\Magento\Framework\ObjectManager\Config\Mapper\Dom::class,
68+
['argumentInterpreter' => $this->getArgumentInterpreterWithMockedStringUtils()]
6369
);
6470
$this->_validationState = new \Magento\Framework\App\Arguments\ValidationState(
6571
\Magento\Framework\App\State::MODE_DEFAULT
@@ -80,4 +86,47 @@ public function testRead()
8086
);
8187
$this->assertEquals($this->_mapper->convert($this->_mergedConfig), $model->read('scope'));
8288
}
89+
90+
/**
91+
* Replace Magento\Framework\Data\Argument\Interpreter\StringUtils with mock to check arguments wasn't translated.
92+
*
93+
* Check argument $data has not key $data['translate'], therefore
94+
* Magento\Framework\Data\Argument\Interpreter\StringUtils::evaluate($data) won't translate $data['value'].
95+
*
96+
* @return \Magento\Framework\Data\Argument\Interpreter\Composite
97+
*/
98+
private function getArgumentInterpreterWithMockedStringUtils()
99+
{
100+
$booleanUtils = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
101+
\Magento\Framework\Stdlib\BooleanUtils::class
102+
);
103+
$stringUtilsMock = $this->getMockBuilder(\Magento\Framework\Data\Argument\Interpreter\StringUtils::class)
104+
->setConstructorArgs(['booleanUtils' => $booleanUtils])
105+
->setMethods(['evaluate'])
106+
->getMock();
107+
$stringUtilsMock->expects($this->any())
108+
->method('evaluate')
109+
->with(self::callback(function ($data) {
110+
return !isset($data['translate']);
111+
}))
112+
->will(self::returnCallback(function ($data) {
113+
return isset($data['value']) ? $data['value'] : '';
114+
}));
115+
$constInterpreter = new \Magento\Framework\Data\Argument\Interpreter\Constant();
116+
$composite = new \Magento\Framework\Data\Argument\Interpreter\Composite(
117+
[
118+
'boolean' => new \Magento\Framework\Data\Argument\Interpreter\Boolean($booleanUtils),
119+
'string' => $stringUtilsMock,
120+
'number' => new \Magento\Framework\Data\Argument\Interpreter\Number(),
121+
'null' => new \Magento\Framework\Data\Argument\Interpreter\NullType(),
122+
'object' => new \Magento\Framework\Data\Argument\Interpreter\DataObject($booleanUtils),
123+
'const' => $constInterpreter,
124+
'init_parameter' => new \Magento\Framework\App\Arguments\ArgumentInterpreter($constInterpreter),
125+
],
126+
\Magento\Framework\ObjectManager\Config\Reader\Dom::TYPE_ATTRIBUTE
127+
);
128+
$composite->addInterpreter('array', new \Magento\Framework\Data\Argument\Interpreter\ArrayType($composite));
129+
130+
return $composite;
131+
}
83132
}

dev/tests/integration/testsuite/Magento/Framework/ObjectManager/_files/config_one.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<item name="boolZero" xsi:type="boolean">false</item>
2020
<item name="intValue" xsi:type="number">100500</item>
2121
<item name="nullValue" xsi:type="null"/>
22-
<item name="stringPattern" xsi:type="string">az-value</item>
22+
<item name="stringPattern" xsi:type="string" translate="true">az-value</item>
2323
</argument>
2424
<argument name="constParam" xsi:type="const">Magento\Store\Model\Website::CACHE_TAG</argument>
2525
<argument name="boolFalseParam" xsi:type="boolean">false</argument>
@@ -28,7 +28,7 @@
2828
<argument name="boolZeroParam" xsi:type="boolean">false</argument>
2929
<argument name="intValueParam" xsi:type="number">100500</argument>
3030
<argument name="nullValueParam" xsi:type="null"/>
31-
<argument name="stringPatternParam" xsi:type="string">az-value</argument>
31+
<argument name="stringPatternParam" xsi:type="string" translate="true">az-value</argument>
3232
</arguments>
3333
</type>
3434
</config>

dev/tests/integration/testsuite/Magento/Framework/ObjectManager/_files/config_two.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<item name="boolTrue" xsi:type="number">10</item>
1717
<item name="boolOne" xsi:type="string">1</item>
1818
<item name="boolZero" xsi:type="boolean">false</item>
19-
<item name="stringPattern" xsi:type="string">Az-Value</item>
19+
<item name="stringPattern" xsi:type="string" translate="true">Az-Value</item>
2020
</argument>
2121
<argument name="constParam" xsi:type="const">Magento\Store\Model\Website::CACHE_TAG</argument>
2222
<argument name="boolFalseParam" xsi:type="number">100</argument>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Framework\Config\Converter\Dom;
8+
9+
/**
10+
* Converter of XML data to an array representation with no data loss excluding argument translation.
11+
*/
12+
class DiFlat extends Flat
13+
{
14+
/**
15+
* Retrieve key-value pairs of node attributes excluding translate attribute.
16+
*
17+
* @param \DOMNode $node
18+
* @return array
19+
*/
20+
protected function getNodeAttributes(\DOMNode $node)
21+
{
22+
$result = parent::getNodeAttributes($node);
23+
unset($result['translate']);
24+
25+
return $result;
26+
}
27+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Framework\Config\Test\Unit\Converter\Dom;
8+
9+
/**
10+
* Class DiFlatTest @covers \Magento\Framework\Config\Converter\Dom\DiFlat
11+
*/
12+
class DiFlatTest extends \PHPUnit_Framework_TestCase
13+
{
14+
/**
15+
* Test subject.
16+
*
17+
* @var \Magento\Framework\Config\Converter\Dom\DiFlat
18+
*/
19+
private $model;
20+
21+
/**
22+
* @inheritdoc
23+
*/
24+
protected function setUp()
25+
{
26+
$arrayNodeConfig = new \Magento\Framework\Config\Dom\ArrayNodeConfig(
27+
new \Magento\Framework\Config\Dom\NodePathMatcher(),
28+
[
29+
'/root/multipleNode' => 'id',
30+
'/root/wrongArray' => 'id',
31+
],
32+
[
33+
'/root/node_one/subnode',
34+
]
35+
);
36+
$this->model = new \Magento\Framework\Config\Converter\Dom\DiFlat($arrayNodeConfig);
37+
}
38+
39+
/**
40+
* Test \Magento\Framework\Config\Converter\Dom\DiFlat::convert() exclude attribute 'translate'.
41+
*
42+
* @covers \Magento\Framework\Config\Converter\Dom\DiFlat::convert()
43+
*/
44+
public function testConvert()
45+
{
46+
$fixturePath = __DIR__ . '/../../_files/converter/dom/flat/';
47+
$expected = require $fixturePath . 'result.php';
48+
49+
$dom = new \DOMDocument();
50+
$dom->load($fixturePath . 'di_source.xml');
51+
52+
$actual = $this->model->convert($dom);
53+
$this->assertEquals($expected, $actual);
54+
}
55+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<root>
9+
<node_one attributeOne = '10' attributeTwo = '20' translate="true" >
10+
<subnode attributeThree = '30' translate="true" ></subnode>
11+
<subnode attributeThree = '40' attributeFour = '40' translate="true" >Value1</subnode>
12+
<books attributeFive = '50' translate="true" />
13+
</node_one>
14+
<multipleNode id="one" name="name1" translate="true" >
15+
<value>1</value>
16+
</multipleNode>
17+
<multipleNode id="two" name="name2" translate="true" >
18+
<value>2</value>
19+
</multipleNode>
20+
<someOtherVal translate="true" ></someOtherVal>
21+
<someDataVal translate="true" ><![CDATA[]]></someDataVal>
22+
</root>

lib/internal/Magento/Framework/ObjectManager/Config/Mapper/ArgumentParser.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
namespace Magento\Framework\ObjectManager\Config\Mapper;
77

8-
use Magento\Framework\Config\Converter\Dom\Flat as FlatConverter;
8+
use Magento\Framework\Config\Converter\Dom\DiFlat as FlatConverter;
99
use Magento\Framework\Config\Dom\ArrayNodeConfig;
1010
use Magento\Framework\Config\Dom\NodePathMatcher;
1111

0 commit comments

Comments
 (0)