diff --git a/app/code/Magento/UrlRewrite/Controller/Router.php b/app/code/Magento/UrlRewrite/Controller/Router.php index 0525621b6a20e..040aa6fc85702 100644 --- a/app/code/Magento/UrlRewrite/Controller/Router.php +++ b/app/code/Magento/UrlRewrite/Controller/Router.php @@ -3,15 +3,22 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace Magento\UrlRewrite\Controller; +use Magento\Framework\App\Action\Forward; use Magento\Framework\App\Action\Redirect; +use Magento\Framework\App\ActionFactory; use Magento\Framework\App\ActionInterface; use Magento\Framework\App\Request\Http as HttpRequest; use Magento\Framework\App\RequestInterface; use Magento\Framework\App\Response\Http as HttpResponse; +use Magento\Framework\App\ResponseInterface; +use Magento\Framework\App\RouterInterface; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\UrlInterface; +use Magento\Store\Model\StoreManagerInterface; use Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite; use Magento\UrlRewrite\Model\UrlFinderInterface; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; @@ -21,10 +28,10 @@ * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class Router implements \Magento\Framework\App\RouterInterface +class Router implements RouterInterface { /** - * @var \Magento\Framework\App\ActionFactory + * @var ActionFactory */ protected $actionFactory; @@ -34,7 +41,7 @@ class Router implements \Magento\Framework\App\RouterInterface protected $url; /** - * @var \Magento\Store\Model\StoreManagerInterface + * @var StoreManagerInterface */ protected $storeManager; @@ -49,17 +56,17 @@ class Router implements \Magento\Framework\App\RouterInterface protected $urlFinder; /** - * @param \Magento\Framework\App\ActionFactory $actionFactory + * @param ActionFactory $actionFactory * @param UrlInterface $url - * @param \Magento\Store\Model\StoreManagerInterface $storeManager - * @param \Magento\Framework\App\ResponseInterface $response + * @param StoreManagerInterface $storeManager + * @param ResponseInterface $response * @param UrlFinderInterface $urlFinder */ public function __construct( - \Magento\Framework\App\ActionFactory $actionFactory, + ActionFactory $actionFactory, UrlInterface $url, - \Magento\Store\Model\StoreManagerInterface $storeManager, - \Magento\Framework\App\ResponseInterface $response, + StoreManagerInterface $storeManager, + ResponseInterface $response, UrlFinderInterface $urlFinder ) { $this->actionFactory = $actionFactory; @@ -84,23 +91,41 @@ public function match(RequestInterface $request) ); if ($rewrite === null) { - //No rewrite rule matching current URl found, continuing with - //processing of this URL. + // No rewrite rule matching current URl found, continuing with + // processing of this URL. return null; } + + $requestStringTrimmed = ltrim($request->getRequestString(), '/'); + $rewriteRequestPath = $rewrite->getRequestPath(); + $rewriteTargetPath = $rewrite->getTargetPath(); + $rewriteTargetPathTrimmed = ltrim($rewriteTargetPath, '/'); + + if (preg_replace('/\?.*/', '', $rewriteRequestPath) === preg_replace('/\?.*/', '', $rewriteTargetPath) && + ( + !$requestStringTrimmed || + !$rewriteTargetPathTrimmed || + strpos($requestStringTrimmed, $rewriteTargetPathTrimmed) === 0 + ) + ) { + // Request and target paths of rewrite found without query params are equal and current request string + // starts with request target path, continuing with processing of this URL. + return null; + } + if ($rewrite->getRedirectType()) { - //Rule requires the request to be redirected to another URL - //and cannot be processed further. + // Rule requires the request to be redirected to another URL + // and cannot be processed further. return $this->processRedirect($request, $rewrite); } - //Rule provides actual URL that can be processed by a controller. + // Rule provides actual URL that can be processed by a controller. $request->setAlias( UrlInterface::REWRITE_REQUEST_PATH_ALIAS, - $rewrite->getRequestPath() + $rewriteRequestPath ); - $request->setPathInfo('/' . $rewrite->getTargetPath()); + $request->setPathInfo('/' . $rewriteTargetPath); return $this->actionFactory->create( - \Magento\Framework\App\Action\Forward::class + Forward::class ); } diff --git a/app/code/Magento/UrlRewrite/Model/Storage/DbStorage.php b/app/code/Magento/UrlRewrite/Model/Storage/DbStorage.php index f0e94e8379ad2..f187408d45a9d 100644 --- a/app/code/Magento/UrlRewrite/Model/Storage/DbStorage.php +++ b/app/code/Magento/UrlRewrite/Model/Storage/DbStorage.php @@ -138,17 +138,22 @@ private function extractMostRelevantUrlRewrite(string $requestPath, array $urlRe { $prioritizedUrlRewrites = []; foreach ($urlRewrites as $urlRewrite) { + $urlRewriteRequestPath = $urlRewrite[UrlRewrite::REQUEST_PATH]; + $urlRewriteTargetPath = $urlRewrite[UrlRewrite::TARGET_PATH]; switch (true) { - case $urlRewrite[UrlRewrite::REQUEST_PATH] === $requestPath: + case rtrim($urlRewriteRequestPath, '/') === rtrim($urlRewriteTargetPath, '/'): + $priority = 99; + break; + case $urlRewriteRequestPath === $requestPath: $priority = 1; break; - case $urlRewrite[UrlRewrite::REQUEST_PATH] === urldecode($requestPath): + case $urlRewriteRequestPath === urldecode($requestPath): $priority = 2; break; - case rtrim($urlRewrite[UrlRewrite::REQUEST_PATH], '/') === rtrim($requestPath, '/'): + case rtrim($urlRewriteRequestPath, '/') === rtrim($requestPath, '/'): $priority = 3; break; - case rtrim($urlRewrite[UrlRewrite::REQUEST_PATH], '/') === rtrim(urldecode($requestPath), '/'): + case rtrim($urlRewriteRequestPath, '/') === rtrim(urldecode($requestPath), '/'): $priority = 4; break; default: diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Controller/RouterTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Controller/RouterTest.php index c67f3f400b007..7a3a6d346a792 100644 --- a/app/code/Magento/UrlRewrite/Test/Unit/Controller/RouterTest.php +++ b/app/code/Magento/UrlRewrite/Test/Unit/Controller/RouterTest.php @@ -6,11 +6,19 @@ namespace Magento\UrlRewrite\Test\Unit\Controller; use Magento\Framework\App\Action\Forward; +use Magento\Framework\App\Action\Redirect; +use Magento\Framework\App\ActionFactory; +use Magento\Framework\App\RequestInterface; +use Magento\Framework\App\ResponseInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Framework\UrlInterface; +use Magento\Store\Model\StoreManagerInterface; +use Magento\UrlRewrite\Controller\Router; +use Magento\UrlRewrite\Model\UrlFinderInterface; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; use Magento\Store\Model\Store; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\TestCase; use Zend\Stdlib\ParametersInterface; /** @@ -18,15 +26,15 @@ * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class RouterTest extends \PHPUnit\Framework\TestCase +class RouterTest extends TestCase { /** - * @var \Magento\UrlRewrite\Controller\Router + * @var Router */ private $router; /** - * @var \Magento\Framework\App\ActionFactory|MockObject + * @var ActionFactory|MockObject */ private $actionFactory; @@ -36,7 +44,7 @@ class RouterTest extends \PHPUnit\Framework\TestCase private $url; /** - * @var \Magento\Store\Model\StoreManagerInterface|MockObject + * @var StoreManagerInterface|MockObject */ private $storeManager; @@ -46,12 +54,12 @@ class RouterTest extends \PHPUnit\Framework\TestCase private $store; /** - * @var \Magento\Framework\App\ResponseInterface|MockObject + * @var ResponseInterface|MockObject */ private $response; /** - * @var \Magento\Framework\App\RequestInterface|MockObject + * @var RequestInterface|MockObject */ private $request; @@ -61,7 +69,7 @@ class RouterTest extends \PHPUnit\Framework\TestCase private $requestQuery; /** - * @var \Magento\UrlRewrite\Model\UrlFinderInterface|MockObject + * @var UrlFinderInterface|MockObject */ private $urlFinder; @@ -71,24 +79,24 @@ class RouterTest extends \PHPUnit\Framework\TestCase protected function setUp() { $objectManager = new ObjectManager($this); - $this->actionFactory = $this->createMock(\Magento\Framework\App\ActionFactory::class); + $this->actionFactory = $this->createMock(ActionFactory::class); $this->url = $this->createMock(UrlInterface::class); - $this->storeManager = $this->createMock(\Magento\Store\Model\StoreManagerInterface::class); + $this->storeManager = $this->createMock(StoreManagerInterface::class); $this->response = $this->createPartialMock( - \Magento\Framework\App\ResponseInterface::class, + ResponseInterface::class, ['setRedirect', 'sendResponse'] ); $this->requestQuery = $this->createMock(ParametersInterface::class); $this->request = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class) ->disableOriginalConstructor()->getMock(); $this->request->method('getQuery')->willReturn($this->requestQuery); - $this->urlFinder = $this->createMock(\Magento\UrlRewrite\Model\UrlFinderInterface::class); + $this->urlFinder = $this->createMock(UrlFinderInterface::class); $this->store = $this->getMockBuilder( Store::class )->disableOriginalConstructor()->getMock(); $this->router = $objectManager->getObject( - \Magento\UrlRewrite\Controller\Router::class, + Router::class, [ 'actionFactory' => $this->actionFactory, 'url' => $this->url, @@ -104,9 +112,16 @@ protected function setUp() */ public function testNoRewriteExist() { - $this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue(null)); - $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store)); - $this->store->expects($this->any())->method('getId')->will($this->returnValue('current-store-id')); + $this->request->method('getPathInfo') + ->willReturn(''); + $this->request->method('getRequestString') + ->willReturn(''); + $this->urlFinder->method('findOneByData') + ->willReturn(null); + $this->storeManager->method('getStore') + ->willReturn($this->store); + $this->store->method('getId') + ->willReturn(1); $this->assertNull($this->router->match($this->request)); } @@ -118,55 +133,45 @@ public function testRewriteAfterStoreSwitcher() { $initialRequestPath = 'request-path'; $newRequestPath = 'new-request-path'; + $newTargetPath = 'new-target-path'; $oldStoreAlias = 'old-store'; $oldStoreId = 'old-store-id'; $currentStoreId = 'current-store-id'; $rewriteEntityType = 'entity-type'; $rewriteEntityId = 42; - $this->request - ->expects($this->any()) - ->method('getParam') + $this->request->method('getParam') ->with('___from_store') ->willReturn($oldStoreAlias); - $this->request - ->expects($this->any()) - ->method('getPathInfo') + $this->request->method('getPathInfo') + ->willReturn($initialRequestPath); + $this->request->method('getRequestString') ->willReturn($initialRequestPath); $oldStore = $this->getMockBuilder(Store::class) ->disableOriginalConstructor() ->getMock(); - $oldStore->expects($this->any()) - ->method('getId') + $oldStore->method('getId') ->willReturn($oldStoreId); - $this->store - ->expects($this->any()) - ->method('getId') + $this->store->method('getId') ->willReturn($currentStoreId); - $this->storeManager - ->expects($this->any()) - ->method('getStore') + $this->storeManager->method('getStore') ->willReturnMap([[$oldStoreAlias, $oldStore], [null, $this->store]]); $oldUrlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor() ->getMock(); - $oldUrlRewrite->expects($this->any()) - ->method('getEntityType') + $oldUrlRewrite->method('getEntityType') ->willReturn($rewriteEntityType); - $oldUrlRewrite->expects($this->any()) - ->method('getEntityId') + $oldUrlRewrite->method('getEntityId') ->willReturn($rewriteEntityId); - $oldUrlRewrite->expects($this->any()) - ->method('getRedirectType') + $oldUrlRewrite->method('getRedirectType') ->willReturn(0); $urlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor() ->getMock(); - $urlRewrite->expects($this->any()) - ->method('getRequestPath') + $urlRewrite->method('getRequestPath') ->willReturn($newRequestPath); - $this->urlFinder - ->expects($this->any()) - ->method('findOneByData') + $urlRewrite->method('getTargetPath') + ->willReturn($newTargetPath); + $this->urlFinder->method('findOneByData') ->willReturnMap( [ [ @@ -190,22 +195,23 @@ public function testRewriteAfterStoreSwitcher() */ public function testNoRewriteAfterStoreSwitcherWhenNoOldRewrite() { - $this->request->expects($this->any())->method('getPathInfo')->will($this->returnValue('request-path')); - $this->request->expects($this->any())->method('getParam')->with('___from_store') - ->will($this->returnValue('old-store')); + $this->request->method('getPathInfo')->willReturn('request-path'); + $this->request->method('getRequestString')->willReturn('request-path'); + $this->request->method('getParam')->with('___from_store') + ->willReturn('old-store'); $oldStore = $this->getMockBuilder(Store::class)->disableOriginalConstructor()->getMock(); - $this->storeManager->expects($this->any())->method('getStore') - ->will($this->returnValueMap([['old-store', $oldStore], [null, $this->store]])); - $oldStore->expects($this->any())->method('getId')->will($this->returnValue('old-store-id')); - $this->store->expects($this->any())->method('getId')->will($this->returnValue('current-store-id')); + $this->storeManager->method('getStore') + ->willReturnMap([['old-store', $oldStore], [null, $this->store]]); + $oldStore->method('getId')->willReturn('old-store-id'); + $this->store->method('getId')->willReturn('current-store-id'); $oldUrlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor()->getMock(); - $oldUrlRewrite->expects($this->any())->method('getEntityType')->will($this->returnValue('entity-type')); - $oldUrlRewrite->expects($this->any())->method('getEntityId')->will($this->returnValue('entity-id')); - $oldUrlRewrite->expects($this->any())->method('getRequestPath')->will($this->returnValue('request-path')); + $oldUrlRewrite->method('getEntityType')->willReturn('entity-type'); + $oldUrlRewrite->method('getEntityId')->willReturn('entity-id'); + $oldUrlRewrite->method('getRequestPath')->willReturn('request-path'); $urlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor()->getMock(); - $urlRewrite->expects($this->any())->method('getRequestPath')->will($this->returnValue('request-path')); + $urlRewrite->method('getRequestPath')->willReturn('request-path'); $this->assertNull($this->router->match($this->request)); } @@ -215,41 +221,40 @@ public function testNoRewriteAfterStoreSwitcherWhenNoOldRewrite() */ public function testNoRewriteAfterStoreSwitcherWhenOldRewriteEqualsToNewOne() { - $this->request->expects($this->any())->method('getPathInfo')->will($this->returnValue('request-path')); - $this->request->expects($this->any())->method('getParam')->with('___from_store') - ->will($this->returnValue('old-store')); + $this->request->method('getPathInfo')->willReturn('request-path'); + $this->request->method('getRequestString')->willReturn('request-path'); + $this->request->method('getParam')->with('___from_store') + ->willReturn('old-store'); $oldStore = $this->getMockBuilder(Store::class)->disableOriginalConstructor()->getMock(); - $this->storeManager->expects($this->any())->method('getStore') - ->will($this->returnValueMap([['old-store', $oldStore], [null, $this->store]])); - $oldStore->expects($this->any())->method('getId')->will($this->returnValue('old-store-id')); - $this->store->expects($this->any())->method('getId')->will($this->returnValue('current-store-id')); + $this->storeManager->method('getStore') + ->willReturnMap([['old-store', $oldStore], [null, $this->store]]); + $oldStore->method('getId')->willReturn('old-store-id'); + $this->store->method('getId')->willReturn('current-store-id'); $oldUrlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor()->getMock(); - $oldUrlRewrite->expects($this->any())->method('getEntityType')->will($this->returnValue('entity-type')); - $oldUrlRewrite->expects($this->any())->method('getEntityId')->will($this->returnValue('entity-id')); - $oldUrlRewrite->expects($this->any())->method('getRequestPath')->will($this->returnValue('old-request-path')); + $oldUrlRewrite->method('getEntityType')->willReturn('entity-type'); + $oldUrlRewrite->method('getEntityId')->willReturn('entity-id'); + $oldUrlRewrite->method('getRequestPath')->willReturn('old-request-path'); $urlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor()->getMock(); - $urlRewrite->expects($this->any())->method('getRequestPath')->will($this->returnValue('old-request-path')); + $urlRewrite->method('getRequestPath')->willReturn('old-request-path'); - $this->urlFinder->expects($this->any())->method('findOneByData')->will( - $this->returnValueMap( + $this->urlFinder->method('findOneByData')->willReturnMap( + [ + [ + [UrlRewrite::REQUEST_PATH => 'request-path', UrlRewrite::STORE_ID => 'old-store-id'], + $oldUrlRewrite, + ], [ [ - [UrlRewrite::REQUEST_PATH => 'request-path', UrlRewrite::STORE_ID => 'old-store-id'], - $oldUrlRewrite, + UrlRewrite::ENTITY_TYPE => 'entity-type', + UrlRewrite::ENTITY_ID => 'entity-id', + UrlRewrite::STORE_ID => 'current-store-id', + UrlRewrite::IS_AUTOGENERATED => 1, ], - [ - [ - UrlRewrite::ENTITY_TYPE => 'entity-type', - UrlRewrite::ENTITY_ID => 'entity-id', - UrlRewrite::STORE_ID => 'current-store-id', - UrlRewrite::IS_AUTOGENERATED => 1, - ], - $urlRewrite - ], - ] - ) + $urlRewrite + ], + ] ); $this->assertNull($this->router->match($this->request)); @@ -261,51 +266,107 @@ public function testNoRewriteAfterStoreSwitcherWhenOldRewriteEqualsToNewOne() public function testMatchWithRedirect() { $queryParams = []; - $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store)); + $redirectType = 'redirect-code'; + $requestPath = 'request-path'; + $targetPath = 'target-path'; + $newTargetPath = 'new-target-path'; + $this->storeManager->method('getStore') + ->willReturn($this->store); + $this->request->method('getPathInfo') + ->willReturn($requestPath); + $this->request->method('getRequestString') + ->willReturn($requestPath); $urlRewrite = $this->getMockBuilder(UrlRewrite::class) - ->disableOriginalConstructor()->getMock(); - $urlRewrite->expects($this->any())->method('getRedirectType')->will($this->returnValue('redirect-code')); - $urlRewrite->expects($this->any())->method('getTargetPath')->will($this->returnValue('target-path')); - $this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue($urlRewrite)); - $this->response->expects($this->once())->method('setRedirect') - ->with('new-target-path', 'redirect-code'); - $this->request->expects($this->once())->method('getParams')->willReturn($queryParams); - $this->url->expects($this->once())->method('getUrl')->with( - '', - ['_direct' => 'target-path', '_query' => $queryParams] - ) - ->will($this->returnValue('new-target-path')); - $this->request->expects($this->once())->method('setDispatched')->with(true); - $this->actionFactory->expects($this->once())->method('create') - ->with(\Magento\Framework\App\Action\Redirect::class); + ->disableOriginalConstructor() + ->getMock(); + $urlRewrite->method('getRedirectType')->willReturn($redirectType); + $urlRewrite->method('getRequestPath')->willReturn($requestPath); + $urlRewrite->method('getTargetPath')->willReturn($targetPath); + $this->urlFinder->method('findOneByData')->willReturn($urlRewrite); + $this->response->expects($this->once()) + ->method('setRedirect') + ->with($newTargetPath, $redirectType); + $this->request->expects($this->once()) + ->method('getParams') + ->willReturn($queryParams); + $this->url->expects($this->once()) + ->method('getUrl') + ->with( + '', + ['_direct' => $targetPath, '_query' => $queryParams] + ) + ->willReturn($newTargetPath); + $this->request->expects($this->once()) + ->method('setDispatched') + ->with(true); + $this->actionFactory->expects($this->once()) + ->method('create') + ->with(Redirect::class); $this->router->match($this->request); } /** - * @return void + * @param string $requestPath + * @param string $targetPath + * @param bool $shouldRedirect + * @dataProvider customInternalRedirectDataProvider */ - public function testMatchWithCustomInternalRedirect() + public function testMatchWithCustomInternalRedirect($requestPath, $targetPath, $shouldRedirect) { $queryParams = []; - $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store)); + $redirectType = 'redirect-code'; + $this->storeManager->method('getStore') + ->willReturn($this->store); + $this->request->method('getPathInfo') + ->willReturn($requestPath); + $this->request->method('getRequestString') + ->willReturn($requestPath); $urlRewrite = $this->getMockBuilder(UrlRewrite::class) - ->disableOriginalConstructor()->getMock(); - $urlRewrite->expects($this->any())->method('getEntityType')->will($this->returnValue('custom')); - $urlRewrite->expects($this->any())->method('getRedirectType')->will($this->returnValue('redirect-code')); - $urlRewrite->expects($this->any())->method('getTargetPath')->will($this->returnValue('target-path')); - $this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue($urlRewrite)); - $this->request->expects($this->any())->method('getParams')->willReturn($queryParams); - $this->response->expects($this->once())->method('setRedirect')->with('a', 'redirect-code'); - $this->url->expects($this->once())->method('getUrl')->with( - '', - ['_direct' => 'target-path', '_query' => $queryParams] - )->willReturn('a'); - $this->request->expects($this->once())->method('setDispatched')->with(true); - $this->actionFactory->expects($this->once())->method('create') - ->with(\Magento\Framework\App\Action\Redirect::class); + ->disableOriginalConstructor() + ->getMock(); + $urlRewrite->method('getEntityType')->willReturn('custom'); + $urlRewrite->method('getRedirectType')->willReturn($redirectType); + $urlRewrite->method('getRequestPath')->willReturn($requestPath); + $urlRewrite->method('getTargetPath')->willReturn($targetPath); + $this->urlFinder->method('findOneByData')->willReturn($urlRewrite); - $this->router->match($this->request); + if ($shouldRedirect) { + $this->request->method('getParams')->willReturn($queryParams); + $this->response->expects($this->once()) + ->method('setRedirect') + ->with('a', $redirectType); + $this->url->expects($this->once()) + ->method('getUrl') + ->with( + '', + ['_direct' => $targetPath, '_query' => $queryParams] + ) + ->willReturn('a'); + $this->request->expects($this->once()) + ->method('setDispatched') + ->with(true); + $this->actionFactory->expects($this->once()) + ->method('create') + ->with(Redirect::class); + } + + $routerResult = $this->router->match($this->request); + + if (!$shouldRedirect) { + $this->assertNull($routerResult); + } + } + + /** + * @return array + */ + public function customInternalRedirectDataProvider() + { + return [ + ['request-path', 'target-path', true], + ['/', '/', false], + ]; } /** @@ -314,19 +375,27 @@ public function testMatchWithCustomInternalRedirect() */ public function testMatchWithCustomExternalRedirect($targetPath) { - $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store)); + $requestPath = 'request-path'; + $this->storeManager->method('getStore')->willReturn($this->store); + $this->request->method('getPathInfo') + ->willReturn($requestPath); + $this->request->method('getRequestString') + ->willReturn($requestPath); $urlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor()->getMock(); - $urlRewrite->expects($this->any())->method('getEntityType')->will($this->returnValue('custom')); - $urlRewrite->expects($this->any())->method('getRedirectType')->will($this->returnValue('redirect-code')); - $urlRewrite->expects($this->any())->method('getTargetPath')->will($this->returnValue($targetPath)); - $this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue($urlRewrite)); - $this->response->expects($this->once())->method('setRedirect')->with($targetPath, 'redirect-code'); + $urlRewrite->method('getEntityType')->willReturn('custom'); + $urlRewrite->method('getRedirectType')->willReturn('redirect-code'); + $urlRewrite->method('getRequestPath')->willReturn($requestPath); + $urlRewrite->method('getTargetPath')->willReturn($targetPath); + $this->urlFinder->method('findOneByData')->willReturn($urlRewrite); + $this->response->expects($this->once()) + ->method('setRedirect') + ->with($targetPath, 'redirect-code'); $this->request->expects($this->never())->method('getParams'); $this->url->expects($this->never())->method('getUrl'); $this->request->expects($this->once())->method('setDispatched')->with(true); $this->actionFactory->expects($this->once())->method('create') - ->with(\Magento\Framework\App\Action\Redirect::class); + ->with(Redirect::class); $this->router->match($this->request); } @@ -347,18 +416,23 @@ public function externalRedirectTargetPathDataProvider() */ public function testMatch() { - $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store)); + $requestPath = 'request-path'; + $this->storeManager->method('getStore')->willReturn($this->store); + $this->request->method('getPathInfo') + ->willReturn($requestPath); + $this->request->method('getRequestString') + ->willReturn($requestPath); $urlRewrite = $this->getMockBuilder(UrlRewrite::class) ->disableOriginalConstructor()->getMock(); - $urlRewrite->expects($this->any())->method('getRedirectType')->will($this->returnValue(0)); - $urlRewrite->expects($this->any())->method('getTargetPath')->will($this->returnValue('target-path')); - $urlRewrite->expects($this->any())->method('getRequestPath')->will($this->returnValue('request-path')); - $this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue($urlRewrite)); + $urlRewrite->method('getRedirectType')->willReturn(0); + $urlRewrite->method('getRequestPath')->willReturn($requestPath); + $urlRewrite->method('getTargetPath')->willReturn('target-path'); + $this->urlFinder->method('findOneByData')->willReturn($urlRewrite); $this->request->expects($this->once())->method('setPathInfo')->with('/target-path'); $this->request->expects($this->once())->method('setAlias') ->with(UrlInterface::REWRITE_REQUEST_PATH_ALIAS, 'request-path'); $this->actionFactory->expects($this->once())->method('create') - ->with(\Magento\Framework\App\Action\Forward::class); + ->with(Forward::class); $this->router->match($this->request); } diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Model/Storage/DbStorageTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Model/Storage/DbStorageTest.php index 697ce33be0fa7..946f30f609290 100644 --- a/app/code/Magento/UrlRewrite/Test/Unit/Model/Storage/DbStorageTest.php +++ b/app/code/Magento/UrlRewrite/Test/Unit/Model/Storage/DbStorageTest.php @@ -6,64 +6,68 @@ namespace Magento\UrlRewrite\Test\Unit\Model\Storage; +use Magento\Framework\Api\DataObjectHelper; +use Magento\Framework\App\ResourceConnection; +use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\DB\Select; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\UrlRewrite\Model\Storage\DbStorage; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; +use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory; +use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\TestCase; -class DbStorageTest extends \PHPUnit\Framework\TestCase +class DbStorageTest extends TestCase { /** - * @var \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory|\PHPUnit_Framework_MockObject_MockObject + * @var UrlRewriteFactory|MockObject */ - protected $urlRewriteFactory; + private $urlRewriteFactory; /** - * @var \Magento\Framework\Api\DataObjectHelper|\PHPUnit_Framework_MockObject_MockObject + * @var DataObjectHelper|MockObject */ - protected $dataObjectHelper; + private $dataObjectHelper; /** - * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + * @var AdapterInterface|MockObject */ - protected $connectionMock; + private $connectionMock; /** - * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\DB\Select|MockObject */ - protected $select; + private $select; /** - * @var \Magento\Framework\App\ResourceConnection|\PHPUnit_Framework_MockObject_MockObject + * @var ResourceConnection|MockObject */ - protected $resource; + private $resource; /** - * @var \Magento\UrlRewrite\Model\Storage\DbStorage + * @var DbStorage */ - protected $storage; + private $storage; protected function setUp() { - $this->urlRewriteFactory = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory::class) + $this->urlRewriteFactory = $this->getMockBuilder(UrlRewriteFactory::class) ->setMethods(['create']) ->disableOriginalConstructor()->getMock(); - $this->dataObjectHelper = $this->createMock(\Magento\Framework\Api\DataObjectHelper::class); - $this->connectionMock = $this->createMock(\Magento\Framework\DB\Adapter\AdapterInterface::class); + $this->dataObjectHelper = $this->createMock(DataObjectHelper::class); + $this->connectionMock = $this->createMock(AdapterInterface::class); $this->select = $this->getMockBuilder(Select::class) ->disableOriginalConstructor() ->getMock(); - $this->resource = $this->createMock(\Magento\Framework\App\ResourceConnection::class); + $this->resource = $this->createMock(ResourceConnection::class); - $this->resource->expects($this->any()) - ->method('getConnection') - ->will($this->returnValue($this->connectionMock)); - $this->connectionMock->expects($this->any()) - ->method('select') - ->will($this->returnValue($this->select)); + $this->resource->method('getConnection') + ->willReturn($this->connectionMock); + $this->connectionMock->method('select') + ->willReturn($this->select); $this->storage = (new ObjectManager($this))->getObject( - \Magento\UrlRewrite\Model\Storage\DbStorage::class, + DbStorage::class, [ 'urlRewriteFactory' => $this->urlRewriteFactory, 'dataObjectHelper' => $this->dataObjectHelper, @@ -84,32 +88,32 @@ public function testFindAllByData() ->method('where') ->with('col2 IN (?)', 'val2'); - $this->connectionMock->expects($this->any()) + $this->connectionMock ->method('quoteIdentifier') ->will($this->returnArgument(0)); $this->connectionMock->expects($this->once()) ->method('fetchAll') ->with($this->select) - ->will($this->returnValue([['row1'], ['row2']])); + ->willReturn([['row1'], ['row2']]); $this->dataObjectHelper->expects($this->at(0)) ->method('populateWithArray') - ->with(['urlRewrite1'], ['row1'], \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->with(['urlRewrite1'], ['row1'], UrlRewrite::class) ->will($this->returnSelf()); $this->urlRewriteFactory->expects($this->at(0)) ->method('create') - ->will($this->returnValue(['urlRewrite1'])); + ->willReturn(['urlRewrite1']); $this->dataObjectHelper->expects($this->at(1)) ->method('populateWithArray') - ->with(['urlRewrite2'], ['row2'], \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->with(['urlRewrite2'], ['row2'], UrlRewrite::class) ->will($this->returnSelf()); $this->urlRewriteFactory->expects($this->at(1)) ->method('create') - ->will($this->returnValue(['urlRewrite2'])); + ->willReturn(['urlRewrite2']); $this->assertEquals([['urlRewrite1'], ['urlRewrite2']], $this->storage->findAllByData($data)); } @@ -126,25 +130,24 @@ public function testFindOneByData() ->method('where') ->with('col2 IN (?)', 'val2'); - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') + $this->connectionMock->method('quoteIdentifier') ->will($this->returnArgument(0)); $this->connectionMock->expects($this->once()) ->method('fetchRow') ->with($this->select) - ->will($this->returnValue(['row1'])); + ->willReturn(['row1']); $this->connectionMock->expects($this->never())->method('fetchAll'); $this->dataObjectHelper->expects($this->at(0)) ->method('populateWithArray') - ->with(['urlRewrite1'], ['row1'], \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->with(['urlRewrite1'], ['row1'], UrlRewrite::class) ->will($this->returnSelf()); $this->urlRewriteFactory->expects($this->at(0)) ->method('create') - ->will($this->returnValue(['urlRewrite1'])); + ->willReturn(['urlRewrite1']); $this->assertEquals(['urlRewrite1'], $this->storage->findOneByData($data)); } @@ -153,8 +156,8 @@ public function testFindOneByDataWithRequestPath() { $origRequestPath = 'page-one'; $data = [ - 'col1' => 'val1', - 'col2' => 'val2', + 'col1' => 'val1', + 'col2' => 'val2', UrlRewrite::REQUEST_PATH => $origRequestPath, ]; @@ -170,31 +173,31 @@ public function testFindOneByDataWithRequestPath() ->method('where') ->with('request_path IN (?)', [$origRequestPath, $origRequestPath . '/']); - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') + $this->connectionMock->method('quoteIdentifier') ->will($this->returnArgument(0)); $this->connectionMock->expects($this->never()) ->method('fetchRow'); $urlRewriteRowInDb = [ - UrlRewrite::REQUEST_PATH => $origRequestPath, + UrlRewrite::REQUEST_PATH => $origRequestPath, + UrlRewrite::TARGET_PATH => $origRequestPath, UrlRewrite::REDIRECT_TYPE => 0, ]; $this->connectionMock->expects($this->once()) ->method('fetchAll') ->with($this->select) - ->will($this->returnValue([$urlRewriteRowInDb])); + ->willReturn([$urlRewriteRowInDb]); $this->dataObjectHelper->expects($this->at(0)) ->method('populateWithArray') - ->with(['urlRewrite1'], $urlRewriteRowInDb, \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) - ->will($this->returnSelf()); + ->with(['urlRewrite1'], $urlRewriteRowInDb, UrlRewrite::class) + ->willReturnSelf(); $this->urlRewriteFactory->expects($this->at(0)) ->method('create') - ->will($this->returnValue(['urlRewrite1'])); + ->willReturn(['urlRewrite1']); $this->assertEquals(['urlRewrite1'], $this->storage->findOneByData($data)); } @@ -203,8 +206,8 @@ public function testFindOneByDataWithRequestPathIsDifferent() { $origRequestPath = 'page-one'; $data = [ - 'col1' => 'val1', - 'col2' => 'val2', + 'col1' => 'val1', + 'col2' => 'val2', UrlRewrite::REQUEST_PATH => $origRequestPath, ]; @@ -220,44 +223,44 @@ public function testFindOneByDataWithRequestPathIsDifferent() ->method('where') ->with('request_path IN (?)', [$origRequestPath, $origRequestPath . '/']); - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') + $this->connectionMock->method('quoteIdentifier') ->will($this->returnArgument(0)); $this->connectionMock->expects($this->never()) ->method('fetchRow'); $urlRewriteRowInDb = [ - UrlRewrite::REQUEST_PATH => $origRequestPath . '/', + UrlRewrite::REQUEST_PATH => $origRequestPath . '/', + UrlRewrite::TARGET_PATH => $origRequestPath . '/', UrlRewrite::REDIRECT_TYPE => 0, - UrlRewrite::STORE_ID => 1, + UrlRewrite::STORE_ID => 1, ]; $this->connectionMock->expects($this->once()) ->method('fetchAll') ->with($this->select) - ->will($this->returnValue([$urlRewriteRowInDb])); + ->willReturn([$urlRewriteRowInDb]); $urlRewriteRedirect = [ - 'request_path' => $origRequestPath, - 'redirect_type' => 301, - 'store_id' => 1, - 'entity_type' => 'custom', - 'entity_id' => '0', - 'target_path' => $origRequestPath . '/', - 'description' => null, + 'request_path' => $origRequestPath, + 'redirect_type' => 301, + 'store_id' => 1, + 'entity_type' => 'custom', + 'entity_id' => '0', + 'target_path' => $origRequestPath . '/', + 'description' => null, 'is_autogenerated' => '0', - 'metadata' => null, + 'metadata' => null, ]; $this->dataObjectHelper->expects($this->at(0)) ->method('populateWithArray') - ->with(['urlRewrite1'], $urlRewriteRedirect, \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->with(['urlRewrite1'], $urlRewriteRedirect, UrlRewrite::class) ->will($this->returnSelf()); $this->urlRewriteFactory->expects($this->at(0)) ->method('create') - ->will($this->returnValue(['urlRewrite1'])); + ->willReturn(['urlRewrite1']); $this->assertEquals(['urlRewrite1'], $this->storage->findOneByData($data)); } @@ -266,8 +269,8 @@ public function testFindOneByDataWithRequestPathIsDifferent2() { $origRequestPath = 'page-one/'; $data = [ - 'col1' => 'val1', - 'col2' => 'val2', + 'col1' => 'val1', + 'col2' => 'val2', UrlRewrite::REQUEST_PATH => $origRequestPath, ]; @@ -283,7 +286,7 @@ public function testFindOneByDataWithRequestPathIsDifferent2() ->method('where') ->with('request_path IN (?)', [rtrim($origRequestPath, '/'), rtrim($origRequestPath, '/') . '/']); - $this->connectionMock->expects($this->any()) + $this->connectionMock ->method('quoteIdentifier') ->will($this->returnArgument(0)); @@ -291,36 +294,37 @@ public function testFindOneByDataWithRequestPathIsDifferent2() ->method('fetchRow'); $urlRewriteRowInDb = [ - UrlRewrite::REQUEST_PATH => rtrim($origRequestPath, '/'), + UrlRewrite::REQUEST_PATH => rtrim($origRequestPath, '/'), + UrlRewrite::TARGET_PATH => rtrim($origRequestPath, '/'), UrlRewrite::REDIRECT_TYPE => 0, - UrlRewrite::STORE_ID => 1, + UrlRewrite::STORE_ID => 1, ]; $this->connectionMock->expects($this->once()) ->method('fetchAll') ->with($this->select) - ->will($this->returnValue([$urlRewriteRowInDb])); + ->willReturn([$urlRewriteRowInDb]); $urlRewriteRedirect = [ - 'request_path' => $origRequestPath, - 'redirect_type' => 301, - 'store_id' => 1, - 'entity_type' => 'custom', - 'entity_id' => '0', - 'target_path' => rtrim($origRequestPath, '/'), - 'description' => null, + 'request_path' => $origRequestPath, + 'redirect_type' => 301, + 'store_id' => 1, + 'entity_type' => 'custom', + 'entity_id' => '0', + 'target_path' => rtrim($origRequestPath, '/'), + 'description' => null, 'is_autogenerated' => '0', - 'metadata' => null, + 'metadata' => null, ]; $this->dataObjectHelper->expects($this->at(0)) ->method('populateWithArray') - ->with(['urlRewrite1'], $urlRewriteRedirect, \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) + ->with(['urlRewrite1'], $urlRewriteRedirect, UrlRewrite::class) ->will($this->returnSelf()); $this->urlRewriteFactory->expects($this->at(0)) ->method('create') - ->will($this->returnValue(['urlRewrite1'])); + ->willReturn(['urlRewrite1']); $this->assertEquals(['urlRewrite1'], $this->storage->findOneByData($data)); } @@ -329,8 +333,8 @@ public function testFindOneByDataWithRequestPathIsRedirect() { $origRequestPath = 'page-one'; $data = [ - 'col1' => 'val1', - 'col2' => 'val2', + 'col1' => 'val1', + 'col2' => 'val2', UrlRewrite::REQUEST_PATH => $origRequestPath, ]; @@ -346,33 +350,32 @@ public function testFindOneByDataWithRequestPathIsRedirect() ->method('where') ->with('request_path IN (?)', [$origRequestPath, $origRequestPath . '/']); - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') + $this->connectionMock->method('quoteIdentifier') ->will($this->returnArgument(0)); $this->connectionMock->expects($this->never()) ->method('fetchRow'); $urlRewriteRowInDb = [ - UrlRewrite::REQUEST_PATH => $origRequestPath . '/', - UrlRewrite::TARGET_PATH => 'page-A/', + UrlRewrite::REQUEST_PATH => $origRequestPath . '/', + UrlRewrite::TARGET_PATH => 'page-A/', UrlRewrite::REDIRECT_TYPE => 301, - UrlRewrite::STORE_ID => 1, + UrlRewrite::STORE_ID => 1, ]; $this->connectionMock->expects($this->once()) ->method('fetchAll') ->with($this->select) - ->will($this->returnValue([$urlRewriteRowInDb])); + ->willReturn([$urlRewriteRowInDb]); $this->dataObjectHelper->expects($this->at(0)) ->method('populateWithArray') - ->with(['urlRewrite1'], $urlRewriteRowInDb, \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) - ->will($this->returnSelf()); + ->with(['urlRewrite1'], $urlRewriteRowInDb, UrlRewrite::class) + ->willReturnSelf(); $this->urlRewriteFactory->expects($this->at(0)) ->method('create') - ->will($this->returnValue(['urlRewrite1'])); + ->willReturn(['urlRewrite1']); $this->assertEquals(['urlRewrite1'], $this->storage->findOneByData($data)); } @@ -398,40 +401,39 @@ public function testFindOneByDataWithRequestPathTwoResults() ->method('where') ->with('request_path IN (?)', [$origRequestPath, $origRequestPath . '/']); - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') + $this->connectionMock->method('quoteIdentifier') ->will($this->returnArgument(0)); $this->connectionMock->expects($this->never()) ->method('fetchRow'); $urlRewriteRowInDb = [ - UrlRewrite::REQUEST_PATH => $origRequestPath . '/', - UrlRewrite::TARGET_PATH => 'page-A/', + UrlRewrite::REQUEST_PATH => $origRequestPath . '/', + UrlRewrite::TARGET_PATH => 'page-A/', UrlRewrite::REDIRECT_TYPE => 301, - UrlRewrite::STORE_ID => 1, + UrlRewrite::STORE_ID => 1, ]; $urlRewriteRowInDb2 = [ - UrlRewrite::REQUEST_PATH => $origRequestPath, - UrlRewrite::TARGET_PATH => 'page-B/', + UrlRewrite::REQUEST_PATH => $origRequestPath, + UrlRewrite::TARGET_PATH => 'page-B/', UrlRewrite::REDIRECT_TYPE => 301, - UrlRewrite::STORE_ID => 1, + UrlRewrite::STORE_ID => 1, ]; $this->connectionMock->expects($this->once()) ->method('fetchAll') ->with($this->select) - ->will($this->returnValue([$urlRewriteRowInDb, $urlRewriteRowInDb2])); + ->willReturn([$urlRewriteRowInDb, $urlRewriteRowInDb2]); $this->dataObjectHelper->expects($this->at(0)) ->method('populateWithArray') - ->with(['urlRewrite1'], $urlRewriteRowInDb2, \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class) - ->will($this->returnSelf()); + ->with(['urlRewrite1'], $urlRewriteRowInDb2, UrlRewrite::class) + ->willReturnSelf(); $this->urlRewriteFactory->expects($this->at(0)) ->method('create') - ->will($this->returnValue(['urlRewrite1'])); + ->willReturn(['urlRewrite1']); $this->assertEquals(['urlRewrite1'], $this->storage->findOneByData($data)); } @@ -441,58 +443,48 @@ public function testFindOneByDataWithRequestPathTwoResults() */ public function testReplace() { - $urlFirst = $this->createMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class); - $urlSecond = $this->createMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class); + $urlFirst = $this->createMock(UrlRewrite::class); + $urlSecond = $this->createMock(UrlRewrite::class); // delete - $urlFirst->expects($this->any()) - ->method('getEntityType') + $urlFirst->method('getEntityType') ->willReturn('product'); - $urlFirst->expects($this->any()) - ->method('getEntityId') + $urlFirst->method('getEntityId') ->willReturn('entity_1'); - $urlFirst->expects($this->any()) - ->method('getStoreId') + $urlFirst->method('getStoreId') ->willReturn('store_id_1'); - $urlSecond->expects($this->any()) - ->method('getEntityType') + $urlSecond->method('getEntityType') ->willReturn('category'); - $urlSecond->expects($this->any()) - ->method('getEntityId') + $urlSecond->method('getEntityId') ->willReturn('entity_2'); - $urlSecond->expects($this->any()) - ->method('getStoreId') + $urlSecond->method('getStoreId') ->willReturn('store_id_2'); - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') - ->will($this->returnArgument(0)); + $this->connectionMock->method('quoteIdentifier') + ->willReturnArgument(0); - $this->select->expects($this->any()) - ->method($this->anything()) + $this->select->method($this->anything()) ->willReturnSelf(); - $this->resource->expects($this->any()) - ->method('getTableName') + $this->resource->method('getTableName') ->with(DbStorage::TABLE_NAME) - ->will($this->returnValue('table_name')); + ->willReturn('table_name'); // insert - $urlFirst->expects($this->any()) - ->method('toArray') - ->will($this->returnValue(['row1'])); - $urlSecond->expects($this->any()) - ->method('toArray') - ->will($this->returnValue(['row2'])); + $urlFirst->method('toArray') + ->willReturn(['row1']); + $urlSecond->method('toArray') + ->willReturn(['row2']); - $this->resource->expects($this->any()) - ->method('getTableName') + $this->resource->method('getTableName') ->with(DbStorage::TABLE_NAME) - ->will($this->returnValue('table_name')); + ->willReturn('table_name'); + + $urls = [$urlFirst, $urlSecond]; - $this->storage->replace([$urlFirst, $urlSecond]); + $this->assertEquals($urls, $this->storage->replace($urls)); } /** @@ -500,23 +492,20 @@ public function testReplace() */ public function testReplaceIfThrewExceptionOnDuplicateUrl() { - $url = $this->createMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class); + $url = $this->createMock(UrlRewrite::class); - $url->expects($this->any()) - ->method('toArray') - ->will($this->returnValue(['row1'])); + $url->method('toArray') + ->willReturn(['row1']); $this->connectionMock->expects($this->once()) ->method('insertMultiple') - ->will( - $this->throwException( - new \Exception('SQLSTATE[23000]: test: 1062 test', DbStorage::ERROR_CODE_DUPLICATE_ENTRY) - ) + ->willThrowException( + new \Exception('SQLSTATE[23000]: test: 1062 test', DbStorage::ERROR_CODE_DUPLICATE_ENTRY) ); $conflictingUrl = [ UrlRewrite::URL_REWRITE_ID => 'conflicting-url' ]; - $this->connectionMock->expects($this->any()) + $this->connectionMock ->method('fetchRow') ->willReturn($conflictingUrl); @@ -533,18 +522,15 @@ public function testReplaceIfThrewExceptionOnDuplicateUrl() */ public function testReplaceIfThrewExceptionOnDuplicateEntry() { - $url = $this->createMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class); + $url = $this->createMock(UrlRewrite::class); - $url->expects($this->any()) - ->method('toArray') - ->will($this->returnValue(['row1'])); + $url->method('toArray') + ->willReturn(['row1']); $this->connectionMock->expects($this->once()) ->method('insertMultiple') - ->will( - $this->throwException( - new \Exception('SQLSTATE[23000]: test: 1062 test', DbStorage::ERROR_CODE_DUPLICATE_ENTRY) - ) + ->willThrowException( + new \Exception('SQLSTATE[23000]: test: 1062 test', DbStorage::ERROR_CODE_DUPLICATE_ENTRY) ); $this->storage->replace([$url]); @@ -555,15 +541,14 @@ public function testReplaceIfThrewExceptionOnDuplicateEntry() */ public function testReplaceIfThrewCustomException() { - $url = $this->createMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class); + $url = $this->createMock(UrlRewrite::class); - $url->expects($this->any()) - ->method('toArray') - ->will($this->returnValue(['row1'])); + $url->method('toArray') + ->willReturn(['row1']); $this->connectionMock->expects($this->once()) ->method('insertMultiple') - ->will($this->throwException(new \RuntimeException())); + ->willThrowException(new \RuntimeException()); $this->storage->replace([$url]); } @@ -572,8 +557,7 @@ public function testDeleteByData() { $data = ['col1' => 'val1', 'col2' => 'val2']; - $this->connectionMock->expects($this->any()) - ->method('quoteIdentifier') + $this->connectionMock->method('quoteIdentifier') ->will($this->returnArgument(0)); $this->select->expects($this->at(1)) @@ -587,12 +571,11 @@ public function testDeleteByData() $this->select->expects($this->at(3)) ->method('deleteFromSelect') ->with('table_name') - ->will($this->returnValue('sql delete query')); + ->willReturn('sql delete query'); - $this->resource->expects($this->any()) - ->method('getTableName') + $this->resource->method('getTableName') ->with(DbStorage::TABLE_NAME) - ->will($this->returnValue('table_name')); + ->willReturn('table_name'); $this->connectionMock->expects($this->once()) ->method('query') diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/Controller/UrlRewriteTest.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/Controller/UrlRewriteTest.php index cea44226f6192..867fcd4c2f338 100644 --- a/dev/tests/integration/testsuite/Magento/UrlRewrite/Controller/UrlRewriteTest.php +++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/Controller/UrlRewriteTest.php @@ -133,6 +133,21 @@ public function requestDataProvider(): array 'request' => '/page-external4?param1=custom1¶m2=custom2', 'redirect' => 'https://example.com/external2/?param2=value2', ], + 'Use Case #17: Rewrite: / --(301)--> /; No redirect' => [ + 'request' => '/', + 'redirect' => '/', + 'expectedCode' => HttpResponse::STATUS_CODE_200, + ], + 'Use Case #18: Rewrite: contact/ --(301)--> contact?param1=1; ' + . 'Request: contact/ --(301)--> contact?param1=1' => [ + 'request' => 'contact/', + 'redirect' => 'contact?param1=1', + ], + 'Use Case #19: Rewrite: contact/?param2=2 --(301)--> contact?param1=1¶m2=2; ' + . 'Request: contact/?¶m2=2 --(301)--> contact?param1=1¶m2=2' => [ + 'request' => 'contact/?¶m2=2', + 'redirect' => 'contact?param1=1¶m2=2', + ], ]; } } diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite.php index 68d1212539c6d..62aa27562537a 100644 --- a/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite.php +++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite.php @@ -156,6 +156,24 @@ ->setDescription('From page-similar-query-param with trailing slash to page-e with query param'); $rewriteResource->save($rewrite); +$rewrite = $objectManager->create(UrlRewrite::class); +$rewrite->setEntityType('custom') + ->setRequestPath('/') + ->setTargetPath('/') + ->setRedirectType(OptionProvider::PERMANENT) + ->setStoreId($storeID) + ->setDescription('From / to /'); +$rewriteResource->save($rewrite); + +$rewrite = $objectManager->create(UrlRewrite::class); +$rewrite->setEntityType('custom') + ->setRequestPath('contact/') + ->setTargetPath('contact?param1=1') + ->setRedirectType(OptionProvider::PERMANENT) + ->setStoreId($storeID) + ->setDescription('From contact with trailing slash to contact with query param'); +$rewriteResource->save($rewrite); + $rewrite = $objectManager->create(UrlRewrite::class); $rewrite->setEntityType('custom') ->setRequestPath('page-external1') diff --git a/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite_rollback.php b/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite_rollback.php index a5c21f7a00e48..4d2c148141943 100644 --- a/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite_rollback.php +++ b/dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite_rollback.php @@ -43,7 +43,9 @@ 'http://example.com/external', 'https://example.com/external2/', 'http://example.com/external?param1=value1', - 'https://example.com/external2/?param2=value2' + 'https://example.com/external2/?param2=value2', + '/', + 'contact?param1=1' ] ) ->load()