Skip to content

Commit 8d53fe6

Browse files
author
Joan He
committed
Merge remote-tracking branch 'arcticfoxes/MC-6297' into MC-4245
2 parents d68203b + 84036d5 commit 8d53fe6

File tree

8 files changed

+590
-3
lines changed

8 files changed

+590
-3
lines changed

app/code/Magento/Dhl/Model/Carrier.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1669,7 +1669,7 @@ protected function _shipmentDetails($xml, $rawRequest, $originRegion = '')
16691669
* Get tracking
16701670
*
16711671
* @param string|string[] $trackings
1672-
* @return Result|null
1672+
* @return \Magento\Shipping\Model\Tracking\Result|null
16731673
*/
16741674
public function getTracking($trackings)
16751675
{
@@ -1693,12 +1693,15 @@ protected function _getXMLTracking($trackings)
16931693
'<req:KnownTrackingRequest' .
16941694
' xmlns:req="http://www.dhl.com"' .
16951695
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' .
1696-
' xsi:schemaLocation="http://www.dhl.com TrackingRequestKnown.xsd" />';
1696+
' xsi:schemaLocation="http://www.dhl.com TrackingRequestKnown-1.0.xsd"' .
1697+
' schemaVersion="1.0" />';
16971698

16981699
$xml = $this->_xmlElFactory->create(['data' => $xmlStr]);
16991700

17001701
$requestNode = $xml->addChild('Request', '', '');
17011702
$serviceHeaderNode = $requestNode->addChild('ServiceHeader', '', '');
1703+
$serviceHeaderNode->addChild('MessageTime', $this->buildMessageTimestamp());
1704+
$serviceHeaderNode->addChild('MessageReference', $this->buildMessageReference(self::SERVICE_PREFIX_TRACKING));
17021705
$serviceHeaderNode->addChild('SiteID', (string)$this->getConfigData('id'));
17031706
$serviceHeaderNode->addChild('Password', (string)$this->getConfigData('password'));
17041707

@@ -1942,12 +1945,14 @@ protected function _prepareShippingLabelContent(\SimpleXMLElement $xml)
19421945
}
19431946

19441947
/**
1948+
* Verify if the shipment is dutiable
1949+
*
19451950
* @param string $origCountryId
19461951
* @param string $destCountryId
19471952
*
19481953
* @return bool
19491954
*/
1950-
protected function isDutiable($origCountryId, $destCountryId)
1955+
protected function isDutiable($origCountryId, $destCountryId) : bool
19511956
{
19521957
$this->_checkDomesticStatus($origCountryId, $destCountryId);
19531958

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Dhl\Model;
9+
10+
use Magento\Framework\HTTP\ZendClient;
11+
use Magento\Framework\HTTP\ZendClientFactory;
12+
use Magento\Framework\Simplexml\Element;
13+
use Magento\Shipping\Model\Tracking\Result\Error;
14+
use Magento\Shipping\Model\Tracking\Result\Status;
15+
use PHPUnit_Framework_MockObject_MockObject as MockObject;
16+
17+
class CarrierTest extends \PHPUnit\Framework\TestCase
18+
{
19+
/**
20+
* @var \Magento\Dhl\Model\Carrier
21+
*/
22+
private $dhlCarrier;
23+
24+
/**
25+
* @var ZendClient|MockObject
26+
*/
27+
private $httpClientMock;
28+
29+
/**
30+
* @var \Zend_Http_Response|MockObject
31+
*/
32+
private $httpResponseMock;
33+
34+
protected function setUp()
35+
{
36+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
37+
$this->dhlCarrier = $objectManager->create(
38+
\Magento\Dhl\Model\Carrier::class,
39+
['httpClientFactory' => $this->getHttpClientFactory()]
40+
);
41+
}
42+
43+
/**
44+
* @magentoConfigFixture default_store carriers/dhl/id CustomerSiteID
45+
* @magentoConfigFixture default_store carriers/dhl/password CustomerPassword
46+
* @param string[] $trackingNumbers
47+
* @param string $responseXml
48+
* @param $expectedTrackingData
49+
* @param string $expectedRequestXml
50+
* @dataProvider getTrackingDataProvider
51+
*/
52+
public function testGetTracking(
53+
$trackingNumbers,
54+
string $responseXml,
55+
$expectedTrackingData,
56+
string $expectedRequestXml = ''
57+
) {
58+
$this->httpResponseMock->method('getBody')
59+
->willReturn($responseXml);
60+
$trackingResult = $this->dhlCarrier->getTracking($trackingNumbers);
61+
$this->assertTrackingResult($expectedTrackingData, $trackingResult->getAllTrackings());
62+
if ($expectedRequestXml !== '') {
63+
$method = new \ReflectionMethod($this->httpClientMock, '_prepareBody');
64+
$method->setAccessible(true);
65+
$requestXml = $method->invoke($this->httpClientMock);
66+
$this->assertRequest($expectedRequestXml, $requestXml);
67+
}
68+
}
69+
70+
/**
71+
* Get tracking data provider
72+
* @return array
73+
*/
74+
public function getTrackingDataProvider() : array
75+
{
76+
$expectedMultiAWBRequestXml = file_get_contents(__DIR__ . '/../_files/TrackingRequest_MultipleAWB.xml');
77+
$multiAWBResponseXml = file_get_contents(__DIR__ . '/../_files/TrackingResponse_MultipleAWB.xml');
78+
$expectedSingleAWBRequestXml = file_get_contents(__DIR__ . '/../_files/TrackingRequest_SingleAWB.xml');
79+
$singleAWBResponseXml = file_get_contents(__DIR__ . '/../_files/TrackingResponse_SingleAWB.xml');
80+
$singleNoDataResponseXml = file_get_contents(__DIR__ . '/../_files/SingleknownTrackResponse-no-data-found.xml');
81+
$failedResponseXml = file_get_contents(__DIR__ . '/../_files/Track-res-XML-Parse-Err.xml');
82+
$expectedTrackingDataA = [
83+
'carrier' => 'dhl',
84+
'carrier_title' => 'DHL',
85+
'tracking' => 4781584780,
86+
'service' => 'DOCUMENT',
87+
'progressdetail' => [
88+
[
89+
'activity' => 'SD Shipment information received',
90+
'deliverydate' => '2017-12-25',
91+
'deliverytime' => '14:38:00',
92+
'deliverylocation' => 'BEIJING-CHN [PEK]'
93+
]
94+
],
95+
'weight' => '0.5 K',
96+
];
97+
$expectedTrackingDataB = [
98+
'carrier' => 'dhl',
99+
'carrier_title' => 'DHL',
100+
'tracking' => 4781585060,
101+
'service' => 'NOT RESTRICTED FOR TRANSPORT,',
102+
'progressdetail' => [
103+
[
104+
'activity' => 'SD Shipment information received',
105+
'deliverydate' => '2017-12-24',
106+
'deliverytime' => '13:35:00',
107+
'deliverylocation' => 'HONG KONG-HKG [HKG]'
108+
]
109+
],
110+
'weight' => '2.0 K',
111+
];
112+
$expectedTrackingDataC = [
113+
'carrier' => 'dhl',
114+
'carrier_title' => 'DHL',
115+
'tracking' => 5702254250,
116+
'service' => 'CD',
117+
'progressdetail' => [
118+
[
119+
'activity' => 'SD Shipment information received',
120+
'deliverydate' => '2017-12-24',
121+
'deliverytime' => '04:12:00',
122+
'deliverylocation' => 'BIRMINGHAM-GBR [BHX]'
123+
]
124+
],
125+
'weight' => '0.12 K',
126+
];
127+
$expectedTrackingDataD = [
128+
'carrier' => 'dhl',
129+
'carrier_title' => 'DHL',
130+
'tracking' => 4781585060,
131+
'error_message' => __('Unable to retrieve tracking')
132+
];
133+
$expectedTrackingDataE = [
134+
'carrier' => 'dhl',
135+
'carrier_title' => 'DHL',
136+
'tracking' => 111,
137+
'error_message' => __(
138+
'Error #%1 : %2',
139+
'111',
140+
' Error Parsing incoming request XML
141+
Error: The content of element type
142+
"ShipperReference" must match
143+
"(ReferenceID,ReferenceType?)". at line
144+
16, column 22'
145+
)
146+
];
147+
return [
148+
'multi-AWB' => [
149+
['4781584780', '4781585060', '5702254250'],
150+
$multiAWBResponseXml,
151+
[$expectedTrackingDataA, $expectedTrackingDataB, $expectedTrackingDataC],
152+
$expectedMultiAWBRequestXml
153+
],
154+
'single-AWB' => [
155+
['4781585060'],
156+
$singleAWBResponseXml,
157+
[$expectedTrackingDataB],
158+
$expectedSingleAWBRequestXml
159+
],
160+
'single-AWB-no-data' => [
161+
['4781585061'],
162+
$singleNoDataResponseXml,
163+
[$expectedTrackingDataD]
164+
],
165+
'failed-response' => [
166+
['4781585060-failed'],
167+
$failedResponseXml,
168+
[$expectedTrackingDataE]
169+
]
170+
];
171+
}
172+
173+
/**
174+
* Get mocked Http Client Factory
175+
*
176+
* @return MockObject
177+
*/
178+
private function getHttpClientFactory(): MockObject
179+
{
180+
$this->httpResponseMock = $this->getMockBuilder(\Zend_Http_Response::class)
181+
->disableOriginalConstructor()
182+
->getMock();
183+
$this->httpClientMock = $this->getMockBuilder(ZendClient::class)
184+
->disableOriginalConstructor()
185+
->setMethods(['request'])
186+
->getMock();
187+
$this->httpClientMock->method('request')
188+
->willReturn($this->httpResponseMock);
189+
/** @var ZendClientFactory|MockObject $httpClientFactoryMock */
190+
$httpClientFactoryMock = $this->getMockBuilder(ZendClientFactory::class)
191+
->disableOriginalConstructor()
192+
->getMock();
193+
$httpClientFactoryMock->method('create')
194+
->willReturn($this->httpClientMock);
195+
196+
return $httpClientFactoryMock;
197+
}
198+
199+
/**
200+
* Assert request
201+
*
202+
* @param string $expectedRequestXml
203+
* @param string $requestXml
204+
*/
205+
private function assertRequest(string $expectedRequestXml, string $requestXml): void
206+
{
207+
$expectedRequestElement = new Element($expectedRequestXml);
208+
$requestElement = new Element($requestXml);
209+
$requestMessageTime = $requestElement->Request->ServiceHeader->MessageTime->__toString();
210+
$this->assertEquals(
211+
1,
212+
preg_match("/\d{4}\-\d{2}\-\d{2}T\d{2}\:\d{2}\:\d{2}\+\d{2}\:\d{2}/", $requestMessageTime)
213+
);
214+
$expectedRequestElement->Request->ServiceHeader->MessageTime = $requestMessageTime;
215+
$messageReference = $requestElement->Request->ServiceHeader->MessageReference->__toString();
216+
$this->assertStringStartsWith('MAGE_TRCK_', $messageReference);
217+
$this->assertGreaterThanOrEqual(28, strlen($messageReference));
218+
$this->assertLessThanOrEqual(32, strlen($messageReference));
219+
$requestElement->Request->ServiceHeader->MessageReference = 'MAGE_TRCK_28TO32_Char_CHECKED';
220+
$this->assertXmlStringEqualsXmlString($expectedRequestElement->asXML(), $requestElement->asXML());
221+
}
222+
223+
/**
224+
* Assert tracking
225+
*
226+
* @param array|null $expectedTrackingData
227+
* @param Status[]|null $trackingResults
228+
* @return void
229+
*/
230+
private function assertTrackingResult($expectedTrackingData, $trackingResults): void
231+
{
232+
if (null === $expectedTrackingData) {
233+
$this->assertNull($trackingResults);
234+
} else {
235+
$ctr = 0;
236+
foreach ($trackingResults as $trackingResult) {
237+
$this->assertEquals($expectedTrackingData[$ctr++], $trackingResult->getData());
238+
}
239+
}
240+
}
241+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
<req:TrackingResponse xmlns:req="http://www.dhl.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dhl.com TrackingResponse.xsd">
9+
<Response>
10+
<ServiceHeader>
11+
<MessageTime>2018-02-27T12:59:34+01:00</MessageTime>
12+
<MessageReference>1234567890123456789012345678</MessageReference>
13+
<SiteID>CustomerSiteID</SiteID>
14+
</ServiceHeader>
15+
</Response>
16+
<AWBInfo>
17+
<AWBNumber>4781585060</AWBNumber>
18+
<Status>
19+
<ActionStatus>No Shipments Found</ActionStatus>
20+
<Condition>
21+
<ConditionCode>209</ConditionCode>
22+
<ConditionData>No Shipments Found for AWBNumber 6017300993</ConditionData>
23+
</Condition>
24+
</Status>
25+
</AWBInfo>
26+
<LanguageCode>String</LanguageCode>
27+
</req:TrackingResponse>
28+
<!-- ServiceInvocationId:20180227125934_5793_74fbd9e1-a8b0-4f6a-a326-26aae979e5f0 -->
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
<req:ShipmentTrackingErrorResponse xmlns:req="http://www.dhl.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dhl.com track-err-res.xsd">
9+
<Response>
10+
<ServiceHeader>
11+
<MessageTime>2018-02-27T12:55:05+01:00</MessageTime>
12+
</ServiceHeader>
13+
<Status>
14+
<ActionStatus>Failure</ActionStatus>
15+
<Condition>
16+
<ConditionCode>111</ConditionCode>
17+
<ConditionData> Error Parsing incoming request XML
18+
Error: The content of element type
19+
&quot;ShipperReference&quot; must match
20+
&quot;(ReferenceID,ReferenceType?)&quot;. at line
21+
16, column 22</ConditionData>
22+
</Condition>
23+
</Status>
24+
</Response>
25+
</req:ShipmentTrackingErrorResponse>
26+
<!-- ServiceInvocationId:20180227125505_5793_2008671c-9292-4790-87b6-b02ccdf913db -->
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
<req:KnownTrackingRequest xmlns:req="http://www.dhl.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dhl.com TrackingRequestKnown-1.0.xsd" schemaVersion="1.0">
9+
<Request>
10+
<ServiceHeader>
11+
<MessageTime>2002-06-25T11:28:56-08:00</MessageTime>
12+
<MessageReference>MAGE_TRCK_28TO32_Char_CHECKED</MessageReference>
13+
<SiteID>CustomerSiteID</SiteID>
14+
<Password>CustomerPassword</Password>
15+
</ServiceHeader>
16+
</Request>
17+
<LanguageCode>en</LanguageCode>
18+
<AWBNumber>4781584780</AWBNumber>
19+
<AWBNumber>4781585060</AWBNumber>
20+
<AWBNumber>5702254250</AWBNumber>
21+
<LevelOfDetails>ALL_CHECK_POINTS</LevelOfDetails>
22+
</req:KnownTrackingRequest>
23+
24+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
<req:KnownTrackingRequest xmlns:req="http://www.dhl.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dhl.com TrackingRequestKnown-1.0.xsd" schemaVersion="1.0">
9+
<Request>
10+
<ServiceHeader>
11+
<MessageTime>2002-06-25T11:28:56-08:00</MessageTime>
12+
<MessageReference>MAGE_TRCK_28TO32_Char_CHECKED</MessageReference>
13+
<SiteID>CustomerSiteID</SiteID>
14+
<Password>CustomerPassword</Password>
15+
</ServiceHeader>
16+
</Request>
17+
<LanguageCode>en</LanguageCode>
18+
<AWBNumber>4781585060</AWBNumber>
19+
<LevelOfDetails>ALL_CHECK_POINTS</LevelOfDetails>
20+
</req:KnownTrackingRequest>

0 commit comments

Comments
 (0)