Skip to content

Commit 95e671d

Browse files
committed
MAGETWO-90863: Error handling responses from MBI
1 parent fe11b39 commit 95e671d

File tree

5 files changed

+113
-35
lines changed

5 files changed

+113
-35
lines changed

app/code/Magento/Analytics/Model/Connector/Http/ResponseResolver.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,15 @@ public function __construct(ConverterInterface $converter, array $responseHandle
3838
public function getResult(\Zend_Http_Response $response)
3939
{
4040
$result = false;
41-
$responseBody = $this->converter->fromBody($response->getBody());
41+
preg_match('#(?:Content-Type:\s*)(\w\S+)#i', $this->converter->getContentTypeHeader(), $contentType);
42+
$converterContentType = $contentType[1];
43+
44+
if ($response->getBody() && is_int(strripos($response->getHeader('Content-Type'), $converterContentType))) {
45+
$responseBody = $this->converter->fromBody($response->getBody());
46+
} else {
47+
$responseBody = [];
48+
}
49+
4250
if (array_key_exists($response->getStatus(), $this->responseHandlers)) {
4351
$result = $this->responseHandlers[$response->getStatus()]->handleResponse($responseBody);
4452
}

app/code/Magento/Analytics/Model/Connector/OTPRequest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,9 @@ public function call()
103103
if (!$result) {
104104
$this->logger->warning(
105105
sprintf(
106-
'Obtaining of an OTP from the MBI service has been failed: %s',
107-
!empty($response->getBody()) ? $response->getBody() : 'Response body is empty.'
106+
'Obtaining of an OTP from the MBI service has been failed: %s. Content-Type: %s',
107+
!empty($response->getBody()) ? $response->getBody() : 'Response body is empty',
108+
$response->getHeader('Content-Type')
108109
)
109110
);
110111
}

app/code/Magento/Analytics/Model/Connector/SignUpCommand.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,10 @@ public function execute()
110110
if (!$result) {
111111
$this->logger->warning(
112112
sprintf(
113-
'Subscription for MBI service has been failed. An error occurred during token exchange: %s',
114-
!empty($response->getBody()) ? $response->getBody() : 'Response body is empty.'
113+
'Subscription for MBI service has been failed. An error occurred during token exchange: %s.'
114+
. ' Content-Type: %s',
115+
!empty($response->getBody()) ? $response->getBody() : 'Response body is empty',
116+
$response->getHeader('Content-Type')
115117
)
116118
);
117119
}

app/code/Magento/Analytics/Model/Connector/UpdateCommand.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ public function execute()
101101
if (!$result) {
102102
$this->logger->warning(
103103
sprintf(
104-
'Update of the subscription for MBI service has been failed: %s',
105-
!empty($response->getBody()) ? $response->getBody() : 'Response body is empty.'
104+
'Update of the subscription for MBI service has been failed: %s. Content-Type: %s',
105+
!empty($response->getBody()) ? $response->getBody() : 'Response body is empty',
106+
$response->getHeader('Content-Type')
106107
)
107108
);
108109
}

app/code/Magento/Analytics/Test/Unit/Model/Connector/Http/ResponseResolverTest.php

Lines changed: 94 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,115 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Analytics\Test\Unit\Model\Connector\Http;
79

8-
use Magento\Analytics\Model\Connector\Http\JsonConverter;
10+
use Magento\Analytics\Model\Connector\Http\ConverterInterface;
911
use Magento\Analytics\Model\Connector\Http\ResponseHandlerInterface;
1012
use Magento\Analytics\Model\Connector\Http\ResponseResolver;
11-
use Magento\Framework\Serialize\Serializer\Json;
12-
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
13+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
1314

1415
class ResponseResolverTest extends \PHPUnit\Framework\TestCase
1516
{
16-
public function testGetResultHandleResponseSuccess()
17+
/**
18+
* @var ObjectManagerHelper
19+
*/
20+
private $objectManagerHelper;
21+
22+
/**
23+
* @var ConverterInterface|\PHPUnit_Framework_MockObject_MockObject
24+
*/
25+
private $converterMock;
26+
27+
/**
28+
* @var ResponseHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
29+
*/
30+
private $successResponseHandlerMock;
31+
32+
/**
33+
* @var ResponseHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
34+
*/
35+
private $notFoundResponseHandlerMock;
36+
37+
/**
38+
* @var ResponseResolver
39+
*/
40+
private $responseResolver;
41+
42+
/**
43+
* @return void
44+
*/
45+
protected function setUp()
1746
{
18-
$expectedBody = ['test' => 'testValue'];
19-
$response = new \Zend_Http_Response(201, [], json_encode($expectedBody));
20-
$responseHandlerMock = $this->getMockBuilder(ResponseHandlerInterface::class)
21-
->getMockForAbstractClass();
22-
$responseHandlerMock->expects($this->once())
23-
->method('handleResponse')
24-
->with($expectedBody)
25-
->willReturn(true);
26-
$notFoundResponseHandlerMock = $this->getMockBuilder(ResponseHandlerInterface::class)
27-
->getMockForAbstractClass();
28-
$notFoundResponseHandlerMock->expects($this->never())->method('handleResponse');
29-
$serializerMock = $this->getMockBuilder(Json::class)
47+
$this->objectManagerHelper = new ObjectManagerHelper($this);
48+
$this->converterMock = $this->getMockBuilder(ConverterInterface::class)
3049
->disableOriginalConstructor()
3150
->getMock();
32-
$serializerMock->expects($this->once())
33-
->method('unserialize')
34-
->willReturn($expectedBody);
35-
$objectManager = new ObjectManager($this);
36-
$responseResolver = $objectManager->getObject(
51+
$this->successResponseHandlerMock = $this->getMockBuilder(ResponseHandlerInterface::class)
52+
->getMockForAbstractClass();
53+
$this->notFoundResponseHandlerMock = $this->getMockBuilder(ResponseHandlerInterface::class)
54+
->getMockForAbstractClass();
55+
$this->responseResolver = $this->objectManagerHelper->getObject(
3756
ResponseResolver::class,
3857
[
39-
'converter' => $objectManager->getObject(
40-
JsonConverter::class,
41-
['serializer' => $serializerMock]
42-
),
58+
'converter' => $this->converterMock,
4359
'responseHandlers' => [
44-
201 => $responseHandlerMock,
45-
404 => $notFoundResponseHandlerMock,
60+
201 => $this->successResponseHandlerMock,
61+
404 => $this->notFoundResponseHandlerMock,
4662
]
4763
]
4864
);
49-
$this->assertTrue($responseResolver->getResult($response));
65+
}
66+
67+
/**
68+
* @return void
69+
* @throws \Zend_Http_Exception
70+
*/
71+
public function testGetResultHandleResponseSuccess()
72+
{
73+
$expectedBody = ['test' => 'testValue'];
74+
$response = new \Zend_Http_Response(201, ['Content-Type' => 'application/json'], json_encode($expectedBody));
75+
$this->converterMock
76+
->method('getContentTypeHeader')
77+
->willReturn('Content-Type: application/json');
78+
79+
$this->successResponseHandlerMock
80+
->expects($this->once())
81+
->method('handleResponse')
82+
->with($expectedBody)
83+
->willReturn(true);
84+
$this->notFoundResponseHandlerMock
85+
->expects($this->never())
86+
->method('handleResponse');
87+
$this->converterMock
88+
->method('fromBody')
89+
->willReturn($expectedBody);
90+
$this->assertTrue($this->responseResolver->getResult($response));
91+
}
92+
93+
/**
94+
* @return void
95+
* @throws \Zend_Http_Exception
96+
*/
97+
public function testGetResultHandleResponseUnexpectedContentType()
98+
{
99+
$expectedBody = 'testString';
100+
$response = new \Zend_Http_Response(201, ['Content-Type' => 'plain/text'], $expectedBody);
101+
$this->converterMock
102+
->method('getContentTypeHeader')
103+
->willReturn('Content-Type: application/json');
104+
$this->converterMock
105+
->expects($this->never())
106+
->method('fromBody');
107+
$this->successResponseHandlerMock
108+
->expects($this->once())
109+
->method('handleResponse')
110+
->with([])
111+
->willReturn(false);
112+
$this->notFoundResponseHandlerMock
113+
->expects($this->never())
114+
->method('handleResponse');
115+
$this->assertFalse($this->responseResolver->getResult($response));
50116
}
51117
}

0 commit comments

Comments
 (0)