diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php
index 42716d73373a2..1ad8b79ad12f3 100644
--- a/app/code/Magento/Dhl/Model/Carrier.php
+++ b/app/code/Magento/Dhl/Model/Carrier.php
@@ -1964,9 +1964,7 @@ protected function isDutiable($origCountryId, $destCountryId) : bool
{
$this->_checkDomesticStatus($origCountryId, $destCountryId);
- return
- self::DHL_CONTENT_TYPE_NON_DOC == $this->getConfigData('content_type')
- || !$this->_isDomestic;
+ return !$this->_isDomestic;
}
/**
diff --git a/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php b/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php
index ac458024fb65c..c3d82ef34a448 100644
--- a/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php
+++ b/app/code/Magento/Dhl/Test/Unit/Model/CarrierTest.php
@@ -3,6 +3,7 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
+
namespace Magento\Dhl\Test\Unit\Model;
use Magento\Dhl\Model\Carrier;
@@ -34,7 +35,6 @@
use Magento\Store\Model\Website;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
use Psr\Log\LoggerInterface;
-use Magento\Store\Model\ScopeInterface;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -81,11 +81,6 @@ class CarrierTest extends \PHPUnit\Framework\TestCase
*/
private $xmlValidator;
- /**
- * @var Request|MockObject
- */
- private $request;
-
/**
* @var LoggerInterface|MockObject
*/
@@ -108,25 +103,6 @@ protected function setUp()
{
$this->objectManager = new ObjectManager($this);
- $this->request = $this->getMockBuilder(Request::class)
- ->disableOriginalConstructor()
- ->setMethods(
- [
- 'getPackages',
- 'getOrigCountryId',
- 'setPackages',
- 'setPackageWeight',
- 'setPackageValue',
- 'setValueWithDiscount',
- 'setPackageCustomsValue',
- 'setFreeMethodWeight',
- 'getPackageWeight',
- 'getFreeMethodWeight',
- 'getOrderShipment',
- ]
- )
- ->getMock();
-
$this->scope = $this->getMockForAbstractClass(ScopeConfigInterface::class);
$this->error = $this->getMockBuilder(Error::class)
@@ -194,7 +170,7 @@ public function scopeConfigGetValue($path)
'carriers/dhl/shipment_days' => 'Mon,Tue,Wed,Thu,Fri,Sat',
'carriers/dhl/intl_shipment_days' => 'Mon,Tue,Wed,Thu,Fri,Sat',
'carriers/dhl/allowed_methods' => 'IE',
- 'carriers/dhl/international_searvice' => 'IE',
+ 'carriers/dhl/international_service' => 'IE',
'carriers/dhl/gateway_url' => 'https://xmlpi-ea.dhl.com/XMLShippingServlet',
'carriers/dhl/id' => 'some ID',
'carriers/dhl/password' => 'some password',
@@ -214,6 +190,11 @@ public function scopeConfigGetValue($path)
return isset($pathMap[$path]) ? $pathMap[$path] : null;
}
+ /**
+ * Prepare shipping label content test
+ *
+ * @throws \ReflectionException
+ */
public function testPrepareShippingLabelContent()
{
$xml = simplexml_load_file(
@@ -225,6 +206,8 @@ public function testPrepareShippingLabelContent()
}
/**
+ * Prepare shipping label content exception test
+ *
* @dataProvider prepareShippingLabelContentExceptionDataProvider
* @expectedException \Magento\Framework\Exception\LocalizedException
* @expectedExceptionMessage Unable to retrieve shipping label
@@ -235,6 +218,8 @@ public function testPrepareShippingLabelContentException(\SimpleXMLElement $xml)
}
/**
+ * Prepare shipping label content exception data provider
+ *
* @return array
*/
public function prepareShippingLabelContentExceptionDataProvider()
@@ -254,8 +239,11 @@ public function prepareShippingLabelContentExceptionDataProvider()
}
/**
+ * Invoke prepare shipping label content
+ *
* @param \SimpleXMLElement $xml
* @return \Magento\Framework\DataObject
+ * @throws \ReflectionException
*/
protected function _invokePrepareShippingLabelContent(\SimpleXMLElement $xml)
{
@@ -283,9 +271,9 @@ public function testCollectRates()
->willReturn($responseXml);
$this->coreDateMock->method('date')
- ->willReturnCallback(function () {
- return date(\DATE_RFC3339);
- });
+ ->willReturnCallback(function () {
+ return date(\DATE_RFC3339);
+ });
$request = $this->objectManager->getObject(RateRequest::class, $requestData);
@@ -338,13 +326,15 @@ public function testCollectRatesErrorMessage()
/**
* Test request to shipment sends valid xml values.
*
+ * @dataProvider requestToShipmentDataProvider
* @param string $origCountryId
* @param string $expectedRegionCode
- * @dataProvider requestToShipmentDataProvider
+ * @param string $destCountryId
+ * @throws \Magento\Framework\Exception\LocalizedException
+ * @throws \ReflectionException
*/
- public function testRequestToShipment(string $origCountryId, string $expectedRegionCode)
+ public function testRequestToShipment(string $origCountryId, string $expectedRegionCode, string $destCountryId)
{
- $expectedRequestXml = file_get_contents(__DIR__ . '/_files/shipment_request.xml');
$scopeConfigValueMap = [
['carriers/dhl/account', 'store', null, '1234567890'],
['carriers/dhl/gateway_url', 'store', null, 'https://xmlpi-ea.dhl.com/XMLShippingServlet'],
@@ -361,6 +351,54 @@ public function testRequestToShipment(string $origCountryId, string $expectedReg
$this->httpResponse->method('getBody')
->willReturn(utf8_encode(file_get_contents(__DIR__ . '/_files/response_shipping_label.xml')));
+ $request = $this->getRequest($origCountryId, $destCountryId);
+
+ $this->logger->method('debug')
+ ->with($this->stringContains('********'));
+
+ $result = $this->model->requestToShipment($request);
+
+ $reflectionClass = new \ReflectionObject($this->httpClient);
+ $rawPostData = $reflectionClass->getProperty('raw_post_data');
+ $rawPostData->setAccessible(true);
+
+ $this->assertNotNull($result);
+ $requestXml = $rawPostData->getValue($this->httpClient);
+ $requestElement = new Element($requestXml);
+
+ $messageReference = $requestElement->Request->ServiceHeader->MessageReference->__toString();
+ $this->assertStringStartsWith('MAGE_SHIP_', $messageReference);
+ $this->assertGreaterThanOrEqual(28, strlen($messageReference));
+ $this->assertLessThanOrEqual(32, strlen($messageReference));
+ $requestElement->Request->ServiceHeader->MessageReference = 'MAGE_SHIP_28TO32_Char_CHECKED';
+
+ $this->assertXmlStringEqualsXmlString(
+ $this->getExpectedRequestXml($origCountryId, $destCountryId, $expectedRegionCode)->asXML(),
+ $requestElement->asXML()
+ );
+ }
+
+ /**
+ * Prepare and retrieve request object
+ *
+ * @param string $origCountryId
+ * @param string $destCountryId
+ * @return Request|MockObject
+ */
+ private function getRequest(string $origCountryId, string $destCountryId)
+ {
+ $order = $this->getMockBuilder(Order::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $order->method('getSubtotal')
+ ->willReturn('10.00');
+
+ $shipment = $this->getMockBuilder(Order\Shipment::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $shipment->method('getOrder')
+ ->willReturn($order);
+
$packages = [
'package' => [
'params' => [
@@ -381,62 +419,77 @@ public function testRequestToShipment(string $origCountryId, string $expectedReg
],
];
- $order = $this->getMockBuilder(Order::class)
- ->disableOriginalConstructor()
- ->getMock();
- $order->method('getSubtotal')
- ->willReturn('10.00');
+ $methods = [
+ 'getPackages' => $packages,
+ 'getOrigCountryId' => $origCountryId,
+ 'getDestCountryId' => $destCountryId,
+ 'getShipperAddressCountryCode' => $origCountryId,
+ 'getRecipientAddressCountryCode' => $destCountryId,
+ 'setPackages' => null,
+ 'setPackageWeight' => null,
+ 'setPackageValue' => null,
+ 'setValueWithDiscount' => null,
+ 'setPackageCustomsValue' => null,
+ 'setFreeMethodWeight' => null,
+ 'getPackageWeight' => '0.454000000001',
+ 'getFreeMethodWeight' => '0.454000000001',
+ 'getOrderShipment' => $shipment,
+ ];
- $shipment = $this->getMockBuilder(Order\Shipment::class)
+ /** @var Request|MockObject $request */
+ $request = $this->getMockBuilder(Request::class)
->disableOriginalConstructor()
+ ->setMethods(array_keys($methods))
->getMock();
- $shipment->method('getOrder')
- ->willReturn($order);
- $this->request->method('getPackages')
- ->willReturn($packages);
- $this->request->method('getOrigCountryId')
- ->willReturn($origCountryId);
- $this->request->method('setPackages')
- ->willReturnSelf();
- $this->request->method('setPackageWeight')
- ->willReturnSelf();
- $this->request->method('setPackageValue')
- ->willReturnSelf();
- $this->request->method('setValueWithDiscount')
- ->willReturnSelf();
- $this->request->method('setPackageCustomsValue')
- ->willReturnSelf();
- $this->request->method('setFreeMethodWeight')
- ->willReturnSelf();
- $this->request->method('getPackageWeight')
- ->willReturn('0.454000000001');
- $this->request->method('getFreeMethodWeight')
- ->willReturn('0.454000000001');
- $this->request->method('getOrderShipment')
- ->willReturn($shipment);
+ foreach ($methods as $method => $return) {
+ $return ? $request->method($method)->willReturn($return) : $request->method($method)->willReturnSelf();
+ }
- $this->logger->method('debug')
- ->with($this->stringContains('********'));
+ return $request;
+ }
- $result = $this->model->requestToShipment($this->request);
+ /**
+ * Prepare and retrieve expected request xml element
+ *
+ * @param string $origCountryId
+ * @param string $destCountryId
+ * @return Element
+ */
+ private function getExpectedRequestXml(string $origCountryId, string $destCountryId, string $regionCode)
+ {
+ $requestXmlPath = $origCountryId == $destCountryId
+ ? '/_files/domestic_shipment_request.xml'
+ : '/_files/shipment_request.xml';
- $reflectionClass = new \ReflectionObject($this->httpClient);
- $rawPostData = $reflectionClass->getProperty('raw_post_data');
- $rawPostData->setAccessible(true);
+ $expectedRequestElement = new Element(file_get_contents(__DIR__ . $requestXmlPath));
- $this->assertNotNull($result);
- $requestXml = $rawPostData->getValue($this->httpClient);
- $requestElement = new Element($requestXml);
- $this->assertEquals($expectedRegionCode, $requestElement->RegionCode->__toString());
- $requestElement->RegionCode = 'Checked';
- $messageReference = $requestElement->Request->ServiceHeader->MessageReference->__toString();
- $this->assertStringStartsWith('MAGE_SHIP_', $messageReference);
- $this->assertGreaterThanOrEqual(28, strlen($messageReference));
- $this->assertLessThanOrEqual(32, strlen($messageReference));
- $requestElement->Request->ServiceHeader->MessageReference = 'MAGE_SHIP_28TO32_Char_CHECKED';
- $expectedRequestElement = new Element($expectedRequestXml);
- $this->assertXmlStringEqualsXmlString($expectedRequestElement->asXML(), $requestElement->asXML());
+ $expectedRequestElement->Consignee->CountryCode = $destCountryId;
+ $expectedRequestElement->Consignee->CountryName = $this->getCountryName($destCountryId);
+
+ $expectedRequestElement->Shipper->CountryCode = $origCountryId;
+ $expectedRequestElement->Shipper->CountryName = $this->getCountryName($origCountryId);
+
+ $expectedRequestElement->RegionCode = $regionCode;
+
+ return $expectedRequestElement;
+ }
+
+ /**
+ * Get Country Name by Country Code
+ *
+ * @param string $countryCode
+ * @return string
+ */
+ private function getCountryName($countryCode)
+ {
+ $countryNames = [
+ 'US' => 'United States of America',
+ 'SG' => 'Singapore',
+ 'GB' => 'United Kingdom',
+ 'DE' => 'Germany',
+ ];
+ return $countryNames[$countryCode];
}
/**
@@ -448,17 +501,21 @@ public function requestToShipmentDataProvider()
{
return [
[
- 'GB', 'EU'
+ 'GB', 'EU', 'US'
],
[
- 'SG', 'AP'
+ 'SG', 'AP', 'US'
+ ],
+ [
+ 'DE', 'EU', 'DE'
]
];
}
/**
- * @dataProvider dhlProductsDataProvider
+ * Get DHL products test
*
+ * @dataProvider dhlProductsDataProvider
* @param string $docType
* @param array $products
*/
@@ -468,9 +525,11 @@ public function testGetDhlProducts(string $docType, array $products)
}
/**
+ * DHL products data provider
+ *
* @return array
*/
- public function dhlProductsDataProvider() : array
+ public function dhlProductsDataProvider(): array
{
return [
'doc' => [
@@ -537,6 +596,8 @@ public function testBuildMessageReference($servicePrefix)
}
/**
+ * Build message reference data provider
+ *
* @return array
*/
public function buildMessageReferenceDataProvider()
@@ -581,6 +642,8 @@ public function testBuildSoftwareName($productName)
}
/**
+ * Data provider for testBuildSoftwareName
+ *
* @return array
*/
public function buildSoftwareNameDataProvider()
@@ -610,6 +673,8 @@ public function testBuildSoftwareVersion($productVersion)
}
/**
+ * Data provider for testBuildSoftwareVersion
+ *
* @return array
*/
public function buildSoftwareVersionProvider()
@@ -695,6 +760,8 @@ private function getRateMethodFactory(): MockObject
}
/**
+ * Get config reader
+ *
* @return MockObject
*/
private function getConfigReader(): MockObject
@@ -709,6 +776,8 @@ private function getConfigReader(): MockObject
}
/**
+ * Get read factory
+ *
* @return MockObject
*/
private function getReadFactory(): MockObject
@@ -727,6 +796,8 @@ private function getReadFactory(): MockObject
}
/**
+ * Get store manager
+ *
* @return MockObject
*/
private function getStoreManager(): MockObject
@@ -748,6 +819,8 @@ private function getStoreManager(): MockObject
}
/**
+ * Get carrier helper
+ *
* @return CarrierHelper
*/
private function getCarrierHelper(): CarrierHelper
@@ -766,6 +839,8 @@ private function getCarrierHelper(): CarrierHelper
}
/**
+ * Get HTTP client factory
+ *
* @return MockObject
*/
private function getHttpClientFactory(): MockObject
diff --git a/app/code/Magento/Dhl/Test/Unit/Model/_files/domestic_shipment_request.xml b/app/code/Magento/Dhl/Test/Unit/Model/_files/domestic_shipment_request.xml
new file mode 100644
index 0000000000000..b71c2fa4a7dde
--- /dev/null
+++ b/app/code/Magento/Dhl/Test/Unit/Model/_files/domestic_shipment_request.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+ currentTime
+ MAGE_SHIP_28TO32_Char_CHECKED
+ some ID
+ some password
+
+
+ CHECKED
+ N
+ N
+ EN
+ Y
+
+ 1234567890
+ S
+ 1234567890
+ S
+ 1234567890
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ shipment reference
+ St
+
+
+ 1
+
+
+ 1
+ CP
+ 0.454
+ 3
+ 3
+ 3
+ item_name
+
+
+ 0.454
+ K
+
+
+ currentTime
+ DHL Parcel
+ DD
+ C
+ CP
+ USD
+
+
+ 1234567890
+
+ 1234567890
+
+
+
+
+
+
+
+
+
+
+ PDF
+
\ No newline at end of file
diff --git a/app/code/Magento/Dhl/etc/adminhtml/system.xml b/app/code/Magento/Dhl/etc/adminhtml/system.xml
index 91ed6c6568a70..37b653225c7b9 100644
--- a/app/code/Magento/Dhl/etc/adminhtml/system.xml
+++ b/app/code/Magento/Dhl/etc/adminhtml/system.xml
@@ -32,7 +32,8 @@
-
+
+ Whether to use Documents or NonDocuments service for non domestic shipments. (Shipments within the EU are classed as domestic)
Magento\Dhl\Model\Source\Contenttype
@@ -81,18 +82,12 @@
-
+
Magento\Dhl\Model\Source\Method\Doc
-
- D
-
-
+
Magento\Dhl\Model\Source\Method\Nondoc
-
- N
-