Skip to content

Commit 1fdce60

Browse files
committed
AC-13258::Migrate DHL integration from outdated DHL Express XML to new MyDHL API RESTful APIs-Unit test automations
AC-13258::Migrate DHL integration from outdated DHL Express XML to new MyDHL API RESTful APIs-Unit test automations AC-13258::Migrate DHL integration from outdated DHL Express XML to new MyDHL API RESTful APIs-mandatory city name for API request added for guest user AC-13258::Migrate DHL integration from outdated DHL Express XML to new MyDHL API RESTful APIs-Integration test added for Quote Data REST API
1 parent a569641 commit 1fdce60

File tree

6 files changed

+1283
-13
lines changed

6 files changed

+1283
-13
lines changed

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,17 @@ public function setRequest(DataObject $request)
508508

509509
$requestObject = $this->_addParams($requestObject);
510510

511+
/** setting destination city name in case of guest customer specific to DHL REST API */
512+
$region = $this->_regionFactory->create()->loadByCode(
513+
$request->getDestRegionCode(),
514+
$request->getDestCountryId()
515+
);
516+
if ($region->getId()) {
517+
$destCityName = $region->getName(); // Returning region name as fallback
518+
} else {
519+
$destCityName = ''; //returning blank in case of XML API
520+
}
521+
511522
if ($request->getDestPostcode()) {
512523
$requestObject->setDestPostal($request->getDestPostcode());
513524
}
@@ -526,7 +537,7 @@ public function setRequest(DataObject $request)
526537
->setCustomsValue($request->getPackageCustomsValue())
527538
->setDestStreet($this->string->substr($destStreet, 0, 35))
528539
->setDestStreetLine2($request->getDestStreetLine2())
529-
->setDestCity($request->getDestCity())
540+
->setDestCity($request->getDestCity() ? $request->getDestCity() : $destCityName)
530541
->setOrigCompanyName($request->getOrigCompanyName())
531542
->setOrigCity($request->getOrigCity())
532543
->setOrigPhoneNumber($request->getOrigPhoneNumber())
@@ -1407,16 +1418,13 @@ private function getProductCode()
14071418

14081419
try {
14091420
$responseResult = $httpResponse->get();
1421+
$jsonResponse = $responseResult->getStatusCode() >= 400 ? '' : $responseResult->getBody();
1422+
$debugData['result'] = $jsonResponse;
14101423
} catch (HttpException $e) {
14111424
$debugData['result'] = ['error' => $e->getMessage(), 'code' => $e->getCode()];
14121425
$this->_logger->critical($e);
14131426
}
1414-
if ($responseResult) {
1415-
$jsonResponse = $responseResult->getStatusCode() >= 400 ? '' : $responseResult->getBody();
1416-
}
1417-
$debugData['result'] = $jsonResponse;
14181427
$this->_debug($debugData);
1419-
14201428
// Decode JSON to array
14211429
$data = json_decode($jsonResponse, true);
14221430
$productCodes = array_map(fn($product) => $product['productCode'], $data['products']);
@@ -1623,7 +1631,7 @@ protected function _addRestRate($product, $exchangeRates)
16231631
&& isset($exchangeRates[0]['currency'])
16241632
&& array_key_exists((string)$product['productCode'], $this->getAllowedMethods())
16251633
) {
1626-
// DHL product code, e.g. '3', 'A', 'Q', etc.
1634+
// DHL product code, e.g. '3', 'A', 'N', etc.
16271635
$dhlProduct = (string)$product['productCode'];
16281636
$totalPrice = $product['totalPrice'];
16291637
$billic_price = array_column(

app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ class CarrierTest extends TestCase
9898
*/
9999
private $productMetadataMock;
100100

101+
/**
102+
* @var mixed
103+
*/
104+
private mixed $responseData;
105+
101106
/**
102107
* @inheritdoc
103108
*/
@@ -173,9 +178,12 @@ public function scopeConfigGetValue($path)
173178
'carriers/dhl/intl_shipment_days' => 'Mon,Tue,Wed,Thu,Fri,Sat',
174179
'carriers/dhl/allowed_methods' => 'IE',
175180
'carriers/dhl/international_service' => 'IE',
176-
'carriers/dhl/gateway_url' => 'https://xmlpi-ea.dhl.com/XMLShippingServlet',
181+
'carriers/dhl/gateway_xml_url' => 'https://xmlpi-ea.dhl.com/XMLShippingServlet',
182+
'carriers/dhl/gateway_rest_url' => 'https://express.api.dhl.com/mydhlapi',
177183
'carriers/dhl/id' => 'some ID',
178184
'carriers/dhl/password' => 'some password',
185+
'carriers/dhl/api_key' => 'some key',
186+
'carriers/dhl/api_secret' => 'some secret key',
179187
'carriers/dhl/content_type' => 'N',
180188
'carriers/dhl/nondoc_methods' => '1,3,4,8,P,Q,E,F,H,J,M,V,Y',
181189
'carriers/dhl/showmethod' => 1,
@@ -676,4 +684,37 @@ private function getHttpClientFactory(): MockObject
676684

677685
return $httpClientFactory;
678686
}
687+
688+
public function testSuccessfulLabelGeneration()
689+
{
690+
$this->responseData = json_decode(file_get_contents(__DIR__ . '/_files/response_shipping_label.json'), true);
691+
$result = new DataObject();
692+
693+
// Extract label content from response and decode it
694+
$labelContent = base64_decode($this->responseData['documents'][0]['content']);
695+
696+
$result->setData('shipping_label_content', $labelContent);
697+
698+
// Assert that the label was correctly set
699+
$this->assertEquals($labelContent, $result->getData('shipping_label_content'));
700+
}
701+
702+
public function testLabelGenerationException()
703+
{
704+
$this->responseData = json_decode(file_get_contents(__DIR__ . '/_files/response_shipping_label.json'), true);
705+
$this->expectException(\Exception::class);
706+
707+
$result = new DataObject();
708+
709+
// Simulate a failure (e.g., missing document content)
710+
$invalidResponse = $this->responseData;
711+
unset($invalidResponse['documents'][0]['content']);
712+
713+
if (!isset($invalidResponse['documents'][0]['content'])) {
714+
throw new \Exception("Shipping label content is missing");
715+
}
716+
717+
$labelContent = base64_decode($invalidResponse['documents'][0]['content']);
718+
$result->setData('shipping_label_content', $labelContent);
719+
}
679720
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"shipmentTrackingNumber": "1111111111",
3+
"trackingUrl": "https://express.api.dhl.com/mydhlapi/test/shipments/1111111111/tracking",
4+
"packages": [
5+
{
6+
"referenceNumber": 1,
7+
"trackingNumber": "AB111111111111111111",
8+
"trackingUrl": "https://express.api.dhl.com/mydhlapi/test/shipments/1111111111/tracking?pieceTrackingNumber=AB111111111111111111"
9+
}
10+
],
11+
"documents": [
12+
{
13+
"imageFormat": "PDF",
14+
"content": "OutputImageContent",
15+
"typeCode": "label"
16+
}
17+
]
18+
}

app/code/Magento/Dhl/etc/di.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@
1010
<arguments>
1111
<argument name="sensitive" xsi:type="array">
1212
<item name="carriers/dhl/account" xsi:type="string">1</item>
13-
<item name="carriers/dhl/gateway_url" xsi:type="string">1</item>
13+
<item name="carriers/dhl/gateway_xml_url" xsi:type="string">1</item>
14+
<item name="carriers/dhl/gateway_rest_url" xsi:type="string">1</item>
1415
<item name="carriers/dhl/id" xsi:type="string">1</item>
1516
<item name="carriers/dhl/password" xsi:type="string">1</item>
17+
<item name="carriers/dhl/api_key" xsi:type="string">1</item>
18+
<item name="carriers/dhl/api_secret" xsi:type="string">1</item>
1619
</argument>
1720
<argument name="environment" xsi:type="array">
1821
<item name="carriers/dhl/debug" xsi:type="string">1</item>
19-
<item name="carriers/dhl/gateway_url" xsi:type="string">1</item>
22+
<item name="carriers/dhl/gateway_xml_url" xsi:type="string">1</item>
23+
<item name="carriers/dhl/gateway_rest_url" xsi:type="string">1</item>
2024
</argument>
2125
</arguments>
2226
</type>

dev/tests/integration/testsuite/Magento/Dhl/Model/CarrierTest.php

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ private function assertTrackingResult($expectedTrackingData, $trackingResults):
257257
* @magentoConfigFixture default_store carriers/dhl/id some ID
258258
* @magentoConfigFixture default_store carriers/dhl/password some password
259259
* @magentoConfigFixture default_store carriers/dhl/account 1234567890
260-
* @magentoConfigFixture default_store carriers/dhl/gateway_url https://xmlpi-ea.dhl.com/XMLShippingServlet
260+
* @magentoConfigFixture default_store carriers/dhl/gateway_xml_url https://xmlpi-ea.dhl.com/XMLShippingServlet
261261
* @magentoConfigFixture default_store carriers/dhl/content_type N
262262
* @magentoConfigFixture default_store carriers/dhl/nondoc_methods 1,3,4,8,P,Q,E,F,H,J,M,V,Y
263263
* @magentoConfigFixture default_store carriers/dhl/unit_of_measure C
@@ -451,12 +451,13 @@ private function buildSoftwareVersion(): string
451451
* Tests that valid rates are returned when sending a quotes request.
452452
*
453453
* @magentoConfigFixture default_store carriers/dhl/active 1
454+
* @magentoConfigFixture default_store carriers/dhl/type DHL_XML
454455
* @magentoConfigFixture default_store carriers/dhl/id some ID
455456
* @magentoConfigFixture default_store carriers/dhl/shipment_days Mon,Tue,Wed,Thu,Fri,Sat
456457
* @magentoConfigFixture default_store carriers/dhl/intl_shipment_days Mon,Tue,Wed,Thu,Fri,Sat
457458
* @magentoConfigFixture default_store carriers/dhl/allowed_methods IE
458459
* @magentoConfigFixture default_store carriers/dhl/international_service IE
459-
* @magentoConfigFixture default_store carriers/dhl/gateway_url https://xmlpi-ea.dhl.com/XMLShippingServlet
460+
* @magentoConfigFixture default_store carriers/dhl/gateway_xml_url https://xmlpi-ea.dhl.com/XMLShippingServlet
460461
* @magentoConfigFixture default_store carriers/dhl/id some ID
461462
* @magentoConfigFixture default_store carriers/dhl/password some password
462463
* @magentoConfigFixture default_store carriers/dhl/content_type N
@@ -506,6 +507,7 @@ public function testCollectRates()
506507
* @param string|null $width
507508
* @param string|null $depth
508509
* @magentoConfigFixture default_store carriers/dhl/active 1
510+
* @magentoConfigFixture default_store carriers/dhl/type DHL_XML
509511
* @dataProvider collectRatesWithoutDimensionsDataProvider
510512
*/
511513
public function testCollectRatesWithoutDimensions(?string $size, ?string $height, ?string $width, ?string $depth)
@@ -528,6 +530,8 @@ public function testCollectRatesWithoutDimensions(?string $size, ?string $height
528530
* Test get carriers rates if has HttpException.
529531
*
530532
* @magentoConfigFixture default_store carriers/dhl/active 1
533+
* @magentoConfigFixture default_store carriers/dhl/type DHL_XML
534+
*
531535
*/
532536
public function testGetRatesWithHttpException(): void
533537
{
@@ -588,12 +592,13 @@ private function setDhlConfig(array $params)
588592
* @param array $addRequestData
589593
* @param bool $freeShippingExpects
590594
* @magentoConfigFixture default_store carriers/dhl/active 1
595+
* @magentoConfigFixture default_store carriers/dhl/type DHL_XML
591596
* @magentoConfigFixture default_store carriers/dhl/id some ID
592597
* @magentoConfigFixture default_store carriers/dhl/shipment_days Mon,Tue,Wed,Thu,Fri,Sat
593598
* @magentoConfigFixture default_store carriers/dhl/intl_shipment_days Mon,Tue,Wed,Thu,Fri,Sat
594599
* @magentoConfigFixture default_store carriers/dhl/allowed_methods IE
595600
* @magentoConfigFixture default_store carriers/dhl/international_service IE
596-
* @magentoConfigFixture default_store carriers/dhl/gateway_url https://xmlpi-ea.dhl.com/XMLShippingServlet
601+
* @magentoConfigFixture default_store carriers/dhl/gateway_xml_url https://xmlpi-ea.dhl.com/XMLShippingServlet
597602
* @magentoConfigFixture default_store carriers/dhl/id some ID
598603
* @magentoConfigFixture default_store carriers/dhl/password some password
599604
* @magentoConfigFixture default_store carriers/dhl/content_type N
@@ -686,6 +691,8 @@ private function getRequestData(): array
686691
'dhl_id' => 'MAGEN_8501',
687692
'dhl_password' => 'QR2GO1U74X',
688693
'dhl_account' => '799909537',
694+
'dhl_api_key' => 'ab01cD2eF3gH4j',
695+
'dhl_api_secret' => 'A!1bC@3dE#4fG$5h',
689696
'dhl_shipping_intl_key' => '54233F2B2C4E5C4B4C5E5A59565530554B405641475D5659',
690697
'girth' => null,
691698
'height' => null,
@@ -737,4 +744,53 @@ private function createRequest(array $addRequestData = []): RateRequest
737744

738745
return Bootstrap::getObjectManager()->create(RateRequest::class, ['data' => $requestData]);
739746
}
747+
748+
/**
749+
* Tests that valid rates are returned when sending a quotes request.
750+
*
751+
* @magentoConfigFixture default_store carriers/dhl/active 1
752+
* @magentoConfigFixture default_store carriers/dhl/type DHL_REST
753+
* @magentoConfigFixture default_store carriers/dhl/api_key some KEY
754+
* @magentoConfigFixture default_store carriers/dhl/shipment_days Mon,Tue,Wed,Thu,Fri,Sat
755+
* @magentoConfigFixture default_store carriers/dhl/intl_shipment_days Mon,Tue,Wed,Thu,Fri,Sat
756+
* @magentoConfigFixture default_store carriers/dhl/allowed_methods IE
757+
* @magentoConfigFixture default_store carriers/dhl/international_service IE
758+
* @magentoConfigFixture default_store carriers/dhl/gateway_rest_url https://express.api.dhl.com/mydhlapi
759+
* @magentoConfigFixture default_store carriers/dhl/api_key some KEY
760+
* @magentoConfigFixture default_store carriers/dhl/api_secret some secret
761+
* @magentoConfigFixture default_store carriers/dhl/content_type N
762+
* @magentoConfigFixture default_store carriers/dhl/nondoc_methods 1,3,4,8,P,Q,E,F,H,J,M,V,Y,N
763+
* @magentoConfigFixture default_store carriers/dhl/showmethod' => 1,
764+
* @magentoConfigFixture default_store carriers/dhl/title DHL Title
765+
* @magentoConfigFixture default_store carriers/dhl/specificerrmsg dhl error message
766+
* @magentoConfigFixture default_store carriers/dhl/unit_of_measure K
767+
* @magentoConfigFixture default_store carriers/dhl/size 1
768+
* @magentoConfigFixture default_store carriers/dhl/height 1.6
769+
* @magentoConfigFixture default_store carriers/dhl/width 1.6
770+
* @magentoConfigFixture default_store carriers/dhl/length 1.6
771+
* @magentoConfigFixture default_store carriers/dhl/debug 1
772+
* @magentoConfigFixture default_store shipping/origin/country_id GB
773+
*/
774+
public function testCollectRestRates()
775+
{
776+
$this->setNextResponse(__DIR__ . '/../_files/dhl_quote_response.json');
777+
$request = $this->createRequest();
778+
$expectedRates = [
779+
['carrier' => 'dhl', 'carrier_title' => 'DHL Title', 'price' => 47.63, 'method' => 'N', 'cost' => 47.63]
780+
];
781+
782+
$actualRates = $this->dhlCarrier->collectRates($request)->getAllRates();
783+
784+
self::assertEquals(count($expectedRates), count($actualRates));
785+
foreach ($actualRates as $i => $actualRate) {
786+
$actualRate = $actualRate->getData();
787+
unset($actualRate['method_title']);
788+
self::assertEquals($expectedRates[$i], $actualRate);
789+
}
790+
$requestRest = $this->httpClient->getLastRequest()->getBody();
791+
self::assertStringContainsString('"weight": 18', $requestRest);
792+
self::assertStringContainsString('"height": 0.63', $requestRest);
793+
self::assertStringContainsString('"width": 0.63', $requestRest);
794+
self::assertStringContainsString('"length": 0', $requestRest);
795+
}
740796
}

0 commit comments

Comments
 (0)