Skip to content

Commit 0eaac68

Browse files
author
Oleksii Korshenko
authored
MAGETWO-85713: #12206: Tracking link returns 404 page in admin panel #12732
2 parents 79c34d2 + 3c64ed6 commit 0eaac68

File tree

3 files changed

+85
-18
lines changed

3 files changed

+85
-18
lines changed

app/code/Magento/Shipping/Helper/Data.php

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
*/
1212
namespace Magento\Shipping\Helper;
1313

14+
use Magento\Framework\App\ObjectManager;
15+
use Magento\Framework\UrlInterface;
16+
use Magento\Store\Model\StoreManagerInterface;
17+
1418
class Data extends \Magento\Framework\App\Helper\AbstractHelper
1519
{
1620
/**
@@ -21,19 +25,28 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper
2125
protected $_allowedHashKeys = ['ship_id', 'order_id', 'track_id'];
2226

2327
/**
24-
* @var \Magento\Store\Model\StoreManagerInterface
28+
* @var StoreManagerInterface
2529
*/
2630
protected $_storeManager;
2731

32+
/**
33+
* @var UrlInterface|null
34+
*/
35+
private $url;
36+
2837
/**
2938
* @param \Magento\Framework\App\Helper\Context $context
30-
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
39+
* @param StoreManagerInterface $storeManager
40+
* @param UrlInterface|null $url
3141
*/
3242
public function __construct(
3343
\Magento\Framework\App\Helper\Context $context,
34-
\Magento\Store\Model\StoreManagerInterface $storeManager
44+
StoreManagerInterface $storeManager,
45+
UrlInterface $url = null
3546
) {
3647
$this->_storeManager = $storeManager;
48+
$this->url = $url ?: ObjectManager::getInstance()->get(UrlInterface::class);
49+
3750
parent::__construct($context);
3851
}
3952

@@ -64,12 +77,13 @@ protected function _getTrackingUrl($key, $model, $method = 'getId')
6477
{
6578
$urlPart = "{$key}:{$model->{$method}()}:{$model->getProtectCode()}";
6679
$params = [
80+
'_scope' => $model->getStoreId(),
81+
'_nosid' => true,
6782
'_direct' => 'shipping/tracking/popup',
6883
'_query' => ['hash' => $this->urlEncoder->encode($urlPart)]
6984
];
7085

71-
$storeModel = $this->_storeManager->getStore($model->getStoreId());
72-
return $storeModel->getUrl('', $params);
86+
return $this->url->getUrl('', $params);
7387
}
7488

7589
/**

app/code/Magento/Shipping/etc/adminhtml/di.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,11 @@
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
99
<preference for="Magento\Shipping\Model\Shipping" type="Magento\Shipping\Model\Shipping\Labels" />
10+
11+
<type name="Magento\Shipping\Helper\Data">
12+
<arguments>
13+
<!-- Use frontend URL model-->
14+
<argument name="url" xsi:type="object">Magento\Framework\Url</argument>
15+
</arguments>
16+
</type>
1017
</config>

dev/tests/integration/testsuite/Magento/Shipping/Helper/DataTest.php

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55
*/
66
namespace Magento\Shipping\Helper;
77

8+
use Magento\Store\Model\StoreManagerInterface;
9+
810
class DataTest extends \PHPUnit\Framework\TestCase
911
{
1012
/**
1113
* @var \Magento\Shipping\Helper\Data
1214
*/
13-
protected $_helper = null;
15+
private $helper;
1416

1517
protected function setUp()
1618
{
17-
$this->_helper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
19+
$this->helper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
1820
\Magento\Shipping\Helper\Data::class
1921
);
2022
}
@@ -31,33 +33,77 @@ public function testGetTrackingPopupUrlBySalesModel($modelName, $getIdMethod, $e
3133
{
3234
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
3335
$constructArgs = [];
34-
if (\Magento\Sales\Model\Order\Shipment::class == $modelName) {
35-
$orderRepository = $this->_getMockOrderRepository($code);
36+
if (\Magento\Sales\Model\Order\Shipment::class === $modelName) {
37+
$orderRepository = $this->getMockOrderRepository($code);
38+
$constructArgs['orderRepository'] = $orderRepository;
39+
} elseif (\Magento\Sales\Model\Order\Shipment\Track::class === $modelName) {
40+
$shipmentRepository = $this->getMockShipmentRepository($code);
41+
$constructArgs['shipmentRepository'] = $shipmentRepository;
42+
}
43+
44+
$model = $objectManager->create($modelName, $constructArgs);
45+
$model->{$getIdMethod}($entityId);
46+
47+
if (\Magento\Sales\Model\Order::class === $modelName) {
48+
$model->setProtectCode($code);
49+
}
50+
if (\Magento\Sales\Model\Order\Shipment\Track::class === $modelName) {
51+
$model->setParentId(1);
52+
}
53+
54+
$actual = $this->helper->getTrackingPopupUrlBySalesModel($model);
55+
$this->assertEquals($expected, $actual);
56+
}
57+
58+
/**
59+
* From the admin panel with custom URL we should have generated frontend URL
60+
*
61+
* @param string $modelName
62+
* @param string $getIdMethod
63+
* @param int $entityId
64+
* @param string $code
65+
* @param string $expected
66+
* @magentoAppArea adminhtml
67+
* @magentoConfigFixture admin_store web/unsecure/base_link_url http://admin.localhost/
68+
* @dataProvider getTrackingPopupUrlBySalesModelDataProvider
69+
*/
70+
public function testGetTrackingPopupUrlBySalesModelFromAdmin($modelName, $getIdMethod, $entityId, $code, $expected)
71+
{
72+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
73+
74+
/** @var StoreManagerInterface $storeManager */
75+
$storeManager = $objectManager->create(StoreManagerInterface::class);
76+
$storeManager->reinitStores();
77+
78+
$constructArgs = [];
79+
if (\Magento\Sales\Model\Order\Shipment::class === $modelName) {
80+
$orderRepository = $this->getMockOrderRepository($code);
3681
$constructArgs['orderRepository'] = $orderRepository;
37-
} elseif (\Magento\Sales\Model\Order\Shipment\Track::class == $modelName) {
38-
$shipmentRepository = $this->_getMockShipmentRepository($code);
82+
} elseif (\Magento\Sales\Model\Order\Shipment\Track::class === $modelName) {
83+
$shipmentRepository = $this->getMockShipmentRepository($code);
3984
$constructArgs['shipmentRepository'] = $shipmentRepository;
4085
}
4186

4287
$model = $objectManager->create($modelName, $constructArgs);
4388
$model->{$getIdMethod}($entityId);
4489

45-
if (\Magento\Sales\Model\Order::class == $modelName) {
90+
if (\Magento\Sales\Model\Order::class === $modelName) {
4691
$model->setProtectCode($code);
4792
}
48-
if (\Magento\Sales\Model\Order\Shipment\Track::class == $modelName) {
93+
if (\Magento\Sales\Model\Order\Shipment\Track::class === $modelName) {
4994
$model->setParentId(1);
5095
}
5196

52-
$actual = $this->_helper->getTrackingPopupUrlBySalesModel($model);
97+
//Frontend URL should be used there
98+
$actual = $this->helper->getTrackingPopupUrlBySalesModel($model);
5399
$this->assertEquals($expected, $actual);
54100
}
55101

56102
/**
57103
* @param $code
58-
* @return \Magento\Sales\Api\OrderRepositoryInterface
104+
* @return \Magento\Sales\Api\OrderRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
59105
*/
60-
protected function _getMockOrderRepository($code)
106+
private function getMockOrderRepository($code)
61107
{
62108
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
63109
$order = $objectManager->create(\Magento\Sales\Model\Order::class);
@@ -71,10 +117,10 @@ protected function _getMockOrderRepository($code)
71117
* @param $code
72118
* @return \Magento\Sales\Model\Order\ShipmentRepository|\PHPUnit_Framework_MockObject_MockObject
73119
*/
74-
protected function _getMockShipmentRepository($code)
120+
private function getMockShipmentRepository($code)
75121
{
76122
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
77-
$orderRepository = $this->_getMockOrderRepository($code);
123+
$orderRepository = $this->getMockOrderRepository($code);
78124
$shipmentArgs = ['orderRepository' => $orderRepository];
79125

80126
$shipment = $objectManager->create(\Magento\Sales\Model\Order\Shipment::class, $shipmentArgs);

0 commit comments

Comments
 (0)