Skip to content

Commit 7a231da

Browse files
authored
ENGCOM-5081: Fixed internal server error for query urlResolver #445
2 parents e981e66 + 9a0a1b2 commit 7a231da

File tree

6 files changed

+133
-0
lines changed

6 files changed

+133
-0
lines changed

app/code/Magento/UrlRewriteGraphQl/Model/Resolver/EntityUrl.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\UrlRewriteGraphQl\Model\Resolver;
99

1010
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
11+
use Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException;
1112
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1213
use Magento\Framework\GraphQl\Config\Element\Field;
1314
use Magento\Framework\GraphQl\Query\ResolverInterface;
@@ -73,6 +74,11 @@ public function resolve(
7374
$url = $customUrl ?: $url;
7475
$urlRewrite = $this->findCanonicalUrl($url);
7576
if ($urlRewrite) {
77+
if (!$urlRewrite->getEntityId()) {
78+
throw new GraphQlNoSuchEntityException(
79+
__('No such entity found with matching URL key: %url', ['url' => $url])
80+
);
81+
}
7682
$result = [
7783
'id' => $urlRewrite->getEntityId(),
7884
'canonical_url' => $urlRewrite->getTargetPath(),
@@ -100,6 +106,9 @@ private function findCanonicalUrl(string $requestPath) : ?\Magento\UrlRewrite\Se
100106
if (!$urlRewrite) {
101107
$urlRewrite = $this->findUrlFromTargetPath($requestPath);
102108
}
109+
if ($urlRewrite && !$urlRewrite->getEntityId() && !$urlRewrite->getIsAutogenerated()) {
110+
$urlRewrite = $this->findUrlFromTargetPath($urlRewrite->getTargetPath());
111+
}
103112

104113
return $urlRewrite;
105114
}

dev/tests/api-functional/testsuite/Magento/GraphQl/UrlRewrite/UrlResolverTest.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Magento\Cms\Helper\Page as PageHelper;
1616
use Magento\Store\Model\ScopeInterface;
1717
use Magento\Framework\App\Config\ScopeConfigInterface;
18+
use Magento\UrlRewrite\Model\UrlRewrite;
1819

1920
/**
2021
* Test the GraphQL endpoint's URLResolver query to verify canonical URL's are correctly returned.
@@ -355,4 +356,68 @@ public function testResolveSlash()
355356
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
356357
$this->assertEquals('CMS_PAGE', $response['urlResolver']['type']);
357358
}
359+
360+
/**
361+
* Test for custom type which point to the valid product/category/cms page.
362+
*
363+
* @magentoApiDataFixture Magento/CatalogUrlRewrite/_files/product_with_category.php
364+
*/
365+
public function testGetNonExistentUrlRewrite()
366+
{
367+
$urlPath = 'non-exist-product.html';
368+
/** @var UrlRewrite $urlRewrite */
369+
$urlRewrite = $this->objectManager->create(UrlRewrite::class);
370+
$urlRewrite->load($urlPath, 'request_path');
371+
372+
/** @var UrlFinderInterface $urlFinder */
373+
$urlFinder = $this->objectManager->get(UrlFinderInterface::class);
374+
$actualUrls = $urlFinder->findOneByData(
375+
[
376+
'request_path' => $urlPath,
377+
'store_id' => 1
378+
]
379+
);
380+
$targetPath = $actualUrls->getTargetPath();
381+
382+
$query = <<<QUERY
383+
{
384+
urlResolver(url:"{$urlPath}")
385+
{
386+
id
387+
relative_url
388+
type
389+
}
390+
}
391+
QUERY;
392+
$response = $this->graphQlQuery($query);
393+
$this->assertArrayHasKey('urlResolver', $response);
394+
$this->assertEquals('PRODUCT', $response['urlResolver']['type']);
395+
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
396+
}
397+
398+
/**
399+
* Test for custom type which point to the invalid product/category/cms page.
400+
*
401+
* @magentoApiDataFixture Magento/UrlRewrite/_files/url_rewrite_not_existing_entity.php
402+
*/
403+
public function testNonExistentEntityUrlRewrite()
404+
{
405+
$urlPath = 'non-exist-entity.html';
406+
407+
$query = <<<QUERY
408+
{
409+
urlResolver(url:"{$urlPath}")
410+
{
411+
id
412+
relative_url
413+
type
414+
}
415+
}
416+
QUERY;
417+
418+
$this->expectExceptionMessage(
419+
"No such entity found with matching URL key: " . $urlPath
420+
);
421+
$this->graphQlQuery($query);
422+
}
358423
}

dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/product_with_category.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Magento\Framework\Indexer\IndexerRegistry;
1515
use Magento\Store\Model\StoreManagerInterface;
1616
use Magento\TestFramework\Helper\Bootstrap;
17+
use Magento\UrlRewrite\Model\UrlRewrite;
1718

1819
/**
1920
* @var \Magento\Store\Model\Store $store
@@ -80,3 +81,15 @@
8081
/** @var CategoryLinkManagementInterface $linkManagement */
8182
$linkManagement = $objectManager->get(CategoryLinkManagementInterface::class);
8283
$linkManagement->assignProductToCategories($product->getSku(), [Category::TREE_ROOT_ID, $category->getEntityId()]);
84+
85+
/** @var UrlRewrite $urlRewrite */
86+
$urlRewrite = $objectManager->create(UrlRewrite::class);
87+
$urlRewrite->setEntityType('custom')
88+
->setRequestPath('non-exist-product.html')
89+
->setTargetPath('catalog/product/view/id/' . $product->getId())
90+
->setRedirectType(0)
91+
->setStoreId(1)
92+
->setDescription(null)
93+
->setIsAutogenerated(0);
94+
95+
$urlRewrite->save();

dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/_files/product_with_category_rollback.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\Catalog\Api\ProductRepositoryInterface;
1010
use Magento\Framework\Api\SearchCriteriaBuilder;
1111
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\UrlRewrite\Model\UrlRewrite;
1213

1314
$objectManager = Bootstrap::getObjectManager();
1415
/** @var \Magento\Framework\Registry $registry */
@@ -41,6 +42,11 @@
4142
$categoryRepository->delete($category);
4243
}
4344

45+
/** @var UrlRewrite $urlRewrite */
46+
$urlRewrite = $objectManager->create(UrlRewrite::class);
47+
$urlRewrite->load('non-exist-product.html', 'request_path');
48+
$urlRewrite->delete();
49+
4450
$registry->unregister('isSecureArea');
4551
$registry->register('isSecureArea', false);
4652

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use Magento\TestFramework\Helper\Bootstrap;
8+
use Magento\UrlRewrite\Model\UrlRewrite;
9+
10+
$objectManager = Bootstrap::getObjectManager();
11+
12+
/** @var int Product Id */
13+
$productId = 708579;
14+
15+
/** @var UrlRewrite $urlRewrite */
16+
$urlRewrite = $objectManager->create(UrlRewrite::class);
17+
$urlRewrite->setEntityType('custom')
18+
->setRequestPath('non-exist-entity.html')
19+
->setTargetPath('catalog/product/view/id/' . $productId)
20+
->setRedirectType(0)
21+
->setStoreId(1)
22+
->setDescription(null)
23+
->setIsAutogenerated(0);
24+
25+
$urlRewrite->save();
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use Magento\TestFramework\Helper\Bootstrap;
8+
use Magento\UrlRewrite\Model\UrlRewrite;
9+
10+
$objectManager = Bootstrap::getObjectManager();
11+
12+
/** @var UrlRewrite $urlRewrite */
13+
$urlRewrite = $objectManager->create(UrlRewrite::class);
14+
$urlRewrite->load('non-exist-entity.html', 'request_path');
15+
$urlRewrite->delete();

0 commit comments

Comments
 (0)