Skip to content

Commit d97f5a9

Browse files
author
Oleksii Korshenko
committed
MAGETWO-85534: #8647: [GitHub] Order of how arguments are merged in multiple di.xml-… #995
- Merge Pull Request magento-engcom/magento2ce#995 from serhii-balko/magento2:github-8647 - Merged commits: 1. 3620313 2. cf7477a
2 parents a1ee98a + cf7477a commit d97f5a9

File tree

2 files changed

+58
-16
lines changed

2 files changed

+58
-16
lines changed

lib/internal/Magento/Framework/Webapi/Rest/Response/RendererFactory.php

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,9 @@ protected function _getRendererClass()
7272
$acceptTypes = [$acceptTypes];
7373
}
7474
foreach ($acceptTypes as $acceptType) {
75-
foreach ($this->_renders as $rendererConfig) {
76-
$rendererType = $rendererConfig['type'];
77-
if ($acceptType == $rendererType || $acceptType == current(
78-
explode('/', $rendererType)
79-
) . '/*' || $acceptType == '*/*'
80-
) {
81-
return $rendererConfig['model'];
82-
}
75+
$renderer = $this->getRendererConfig($acceptType);
76+
if ($renderer !== null) {
77+
return $renderer['model'];
8378
}
8479
}
8580
/** If server does not have renderer for any of the accepted types it SHOULD send 406 (not acceptable). */
@@ -93,4 +88,30 @@ protected function _getRendererClass()
9388
\Magento\Framework\Webapi\Exception::HTTP_NOT_ACCEPTABLE
9489
);
9590
}
91+
92+
/**
93+
* Get renderer config by accept type.
94+
*
95+
* @param string $acceptType
96+
* @return array|null
97+
*/
98+
private function getRendererConfig($acceptType)
99+
{
100+
// If Accept type = '*/*' then return default renderer.
101+
if ($acceptType == '*/*' && isset($this->_renders['default'])) {
102+
return $this->_renders['default'];
103+
}
104+
105+
foreach ($this->_renders as $rendererConfig) {
106+
$rendererType = $rendererConfig['type'];
107+
if ($acceptType == $rendererType
108+
|| $acceptType == current(explode('/', $rendererType)) . '/*'
109+
|| $acceptType == '*/*'
110+
) {
111+
return $rendererConfig;
112+
}
113+
}
114+
115+
return null;
116+
}
96117
}

lib/internal/Magento/Framework/Webapi/Test/Unit/Rest/Response/RendererFactoryTest.php

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,18 @@ protected function setUp()
2626
)->disableOriginalConstructor()->getMock();
2727

2828
$renders = [
29-
'default' => ['type' => '*/*', 'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class],
29+
'application_xml' => [
30+
'type' => 'application/xml',
31+
'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Xml::class,
32+
],
3033
'application_json' => [
3134
'type' => 'application/json',
3235
'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class,
3336
],
37+
'default' => [
38+
'type' => '*/*',
39+
'model' => \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class
40+
],
3441
];
3542

3643
$this->_factory = new \Magento\Framework\Webapi\Rest\Response\RendererFactory(
@@ -42,29 +49,43 @@ protected function setUp()
4249

4350
/**
4451
* Test GET method.
52+
*
53+
* @param array $acceptTypes
54+
* @param string $model
55+
* @dataProvider getTestDataProvider
4556
*/
46-
public function testGet()
57+
public function testGet($acceptTypes, $model)
4758
{
48-
$acceptTypes = ['application/json'];
49-
5059
/** Mock request getAcceptTypes method to return specified value. */
5160
$this->_requestMock->expects($this->once())->method('getAcceptTypes')->will($this->returnValue($acceptTypes));
5261
/** Mock renderer. */
53-
$rendererMock = $this->getMockBuilder(
54-
\Magento\Framework\Webapi\Rest\Response\Renderer\Json::class
55-
)->disableOriginalConstructor()->getMock();
62+
$rendererMock = $this->getMockBuilder($model)->disableOriginalConstructor()->getMock();
5663
/** Mock object to return mocked renderer. */
5764
$this->_objectManagerMock->expects(
5865
$this->once()
5966
)->method(
6067
'get'
6168
)->with(
62-
\Magento\Framework\Webapi\Rest\Response\Renderer\Json::class
69+
$model
6370
)->will(
6471
$this->returnValue($rendererMock)
6572
);
6673
$this->_factory->get();
6774
}
75+
76+
/**
77+
* Data provider for method testGet
78+
*
79+
* @return array
80+
*/
81+
public function getTestDataProvider()
82+
{
83+
return [
84+
[['*/*'], \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class],
85+
[['application/json'], \Magento\Framework\Webapi\Rest\Response\Renderer\Json::class],
86+
[['application/xml'], \Magento\Framework\Webapi\Rest\Response\Renderer\Xml::class],
87+
];
88+
}
6889

6990
/**
7091
* Test GET method with wrong Accept HTTP Header.

0 commit comments

Comments
 (0)