Skip to content

Commit 2f0a792

Browse files
committed
MC-20158: Redirects are not supported in urlResolver
- add tests - fix test
1 parent 2665d81 commit 2f0a792

File tree

2 files changed

+185
-22
lines changed

2 files changed

+185
-22
lines changed

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

Lines changed: 166 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Magento\TestFramework\TestCase\GraphQlAbstract;
1313
use Magento\UrlRewrite\Model\UrlFinderInterface;
1414
use Magento\UrlRewrite\Model\UrlRewrite;
15+
use Magento\UrlRewrite\Model\UrlPersistInterface;
1516

1617
/**
1718
* Test the GraphQL endpoint's URLResolver query to verify canonical URL's are correctly returned.
@@ -65,7 +66,7 @@ public function testProductUrlResolver()
6566
'store_id' => $storeId
6667
]
6768
);
68-
$targetPath = $actualUrls->getTargetPath();
69+
$relativePath = $actualUrls->getRequestPath();
6970
$expectedType = $actualUrls->getEntityType();
7071

7172
$query
@@ -82,16 +83,16 @@ public function testProductUrlResolver()
8283
$response = $this->graphQlQuery($query);
8384
$this->assertArrayHasKey('urlResolver', $response);
8485
$this->assertEquals($product->getEntityId(), $response['urlResolver']['id']);
85-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
86+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
8687
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
8788
}
8889

8990
/**
90-
* Tests the use case where relative_url is provided as resolver input in the Query
91+
* Tests the use case where non seo friendly is provided as resolver input in the Query
9192
*
9293
* @magentoApiDataFixture Magento/CatalogUrlRewrite/_files/product_with_category.php
9394
*/
94-
public function testProductUrlWithCanonicalUrlInput()
95+
public function testProductUrlWithNonSeoFriendlyUrlInput()
9596
{
9697
$productSku = 'p002';
9798
/** @var ProductRepositoryInterface $productRepository */
@@ -122,13 +123,14 @@ public function testProductUrlWithCanonicalUrlInput()
122123
'store_id' => $storeId
123124
]
124125
);
125-
$targetPath = $actualUrls->getTargetPath();
126+
// even of non seo friendly path requested, the seo friendly path should be prefered
127+
$relativePath = $actualUrls->getRequestPath();
126128
$expectedType = $actualUrls->getEntityType();
127-
$canonicalPath = $actualUrls->getTargetPath();
129+
$nonSeoFriendlyPath = $actualUrls->getTargetPath();
128130
$query
129131
= <<<QUERY
130132
{
131-
urlResolver(url:"{$canonicalPath}")
133+
urlResolver(url:"{$nonSeoFriendlyPath}")
132134
{
133135
id
134136
relative_url
@@ -139,10 +141,158 @@ public function testProductUrlWithCanonicalUrlInput()
139141
$response = $this->graphQlQuery($query);
140142
$this->assertArrayHasKey('urlResolver', $response);
141143
$this->assertEquals($product->getEntityId(), $response['urlResolver']['id']);
142-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
144+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
143145
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
144146
}
145147

148+
149+
/**
150+
* Tests the use case where non seo friendly is provided as resolver input in the Query
151+
*
152+
* @magentoApiDataFixture Magento/CatalogUrlRewrite/_files/product_with_category.php
153+
*/
154+
public function testRedirectsAndCustomInput()
155+
{
156+
$productSku = 'p002';
157+
/** @var ProductRepositoryInterface $productRepository */
158+
$productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
159+
$product = $productRepository->get($productSku, false, null, true);
160+
161+
// generate permanent redirects
162+
$renamedKey = 'p002-ren';
163+
$product->setUrlKey($renamedKey);
164+
$product->setData('save_rewrites_history', true);
165+
$product->save();
166+
167+
$storeId = $product->getStoreId();
168+
169+
$query
170+
= <<<QUERY
171+
{
172+
products(filter: {sku: {eq: "{$productSku}"}})
173+
{
174+
items {
175+
url_key
176+
url_suffix
177+
}
178+
}
179+
}
180+
QUERY;
181+
$response = $this->graphQlQuery($query);
182+
$urlPath = $response['products']['items'][0]['url_key'] . $response['products']['items'][0]['url_suffix'];
183+
184+
/** @var UrlFinderInterface $urlFinder */
185+
$urlFinder = $this->objectManager->get(UrlFinderInterface::class);
186+
$actualUrls = $urlFinder->findOneByData(
187+
[
188+
'request_path' => $urlPath,
189+
'store_id' => $storeId
190+
]
191+
);
192+
// querying the end redirect gives the same record
193+
$relativePath = $actualUrls->getRequestPath();
194+
$expectedType = $actualUrls->getEntityType();
195+
$query
196+
= <<<QUERY
197+
{
198+
urlResolver(url:"{$renamedKey}.html")
199+
{
200+
id
201+
relative_url
202+
type
203+
}
204+
}
205+
QUERY;
206+
$response = $this->graphQlQuery($query);
207+
$this->assertArrayHasKey('urlResolver', $response);
208+
$this->assertEquals($product->getEntityId(), $response['urlResolver']['id']);
209+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
210+
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
211+
212+
213+
// querying a url that's a redirect the active redirected final url
214+
$query
215+
= <<<QUERY
216+
{
217+
urlResolver(url:"{$productSku}.html")
218+
{
219+
id
220+
relative_url
221+
type
222+
}
223+
}
224+
QUERY;
225+
$response = $this->graphQlQuery($query);
226+
$this->assertArrayHasKey('urlResolver', $response);
227+
$this->assertEquals($product->getEntityId(), $response['urlResolver']['id']);
228+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
229+
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
230+
231+
232+
// create custom url that doesn't redirect
233+
/** @var UrlRewrite $urlRewriteModel */
234+
$urlRewriteModel = $this->objectManager->create(UrlRewrite::class);
235+
236+
$customUrl = 'custom-path';
237+
$urlRewriteArray = [
238+
'entity_type' => 'custom',
239+
'entity_id' => '0',
240+
'request_path' => $customUrl,
241+
'target_path' => 'p002.html',
242+
'redirect_type' => '0',
243+
'store_id' => '1',
244+
'description' => '',
245+
'is_autogenerated' => '0',
246+
'metadata' => null,
247+
];
248+
foreach ($urlRewriteArray as $key => $value) {
249+
$urlRewriteModel->setData($key, $value);
250+
}
251+
$urlRewriteModel->save();
252+
253+
// querying a custom url that should return the target entity but relative should be the custom url
254+
$query
255+
= <<<QUERY
256+
{
257+
urlResolver(url:"{$customUrl}")
258+
{
259+
id
260+
relative_url
261+
type
262+
}
263+
}
264+
QUERY;
265+
$response = $this->graphQlQuery($query);
266+
$this->assertArrayHasKey('urlResolver', $response);
267+
$this->assertEquals($product->getEntityId(), $response['urlResolver']['id']);
268+
$this->assertEquals($customUrl, $response['urlResolver']['relative_url']);
269+
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
270+
271+
272+
// change custom url that does redirect
273+
$urlRewriteModel->setRedirectType('301');
274+
$urlRewriteModel->setId($urlRewriteModel->getId());
275+
$urlRewriteModel->save();
276+
277+
//modifying query to avoid getting cached values.
278+
$query
279+
= <<<QUERY
280+
{
281+
urlResolver(url:"{$customUrl}")
282+
{
283+
id relative_url type
284+
}
285+
}
286+
QUERY;
287+
$response = $this->graphQlQuery($query);
288+
$this->assertArrayHasKey('urlResolver', $response);
289+
$this->assertEquals($product->getEntityId(), $response['urlResolver']['id']);
290+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
291+
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
292+
293+
$urlRewriteModel->delete();
294+
}
295+
146296
/**
147297
* Test for category entity
148298
*
@@ -166,7 +316,7 @@ public function testCategoryUrlResolver()
166316
]
167317
);
168318
$categoryId = $actualUrls->getEntityId();
169-
$targetPath = $actualUrls->getTargetPath();
319+
$relativePath = $actualUrls->getRequestPath();
170320
$expectedType = $actualUrls->getEntityType();
171321

172322
$query
@@ -195,7 +345,7 @@ public function testCategoryUrlResolver()
195345
$response = $this->graphQlQuery($query);
196346
$this->assertArrayHasKey('urlResolver', $response);
197347
$this->assertEquals($categoryId, $response['urlResolver']['id']);
198-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
348+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
199349
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
200350
}
201351

@@ -238,7 +388,7 @@ public function testProductUrlRewriteResolver()
238388
'store_id' => $storeId
239389
]
240390
);
241-
$targetPath = $actualUrls->getTargetPath();
391+
$relativePath = $actualUrls->getRequestPath();
242392
$expectedType = $actualUrls->getEntityType();
243393
$query
244394
= <<<QUERY
@@ -254,7 +404,7 @@ public function testProductUrlRewriteResolver()
254404
$response = $this->graphQlQuery($query);
255405
$this->assertArrayHasKey('urlResolver', $response);
256406
$this->assertEquals($product->getEntityId(), $response['urlResolver']['id']);
257-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
407+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
258408
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
259409
}
260410

@@ -319,7 +469,7 @@ public function testCategoryUrlWithLeadingSlash()
319469
]
320470
);
321471
$categoryId = $actualUrls->getEntityId();
322-
$targetPath = $actualUrls->getTargetPath();
472+
$relativePath = $actualUrls->getRequestPath();
323473
$expectedType = $actualUrls->getEntityType();
324474

325475
$query
@@ -347,7 +497,7 @@ public function testCategoryUrlWithLeadingSlash()
347497
$response = $this->graphQlQuery($query);
348498
$this->assertArrayHasKey('urlResolver', $response);
349499
$this->assertEquals($categoryId, $response['urlResolver']['id']);
350-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
500+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
351501
$this->assertEquals(strtoupper($expectedType), $response['urlResolver']['type']);
352502
}
353503

@@ -371,7 +521,7 @@ public function testGetNonExistentUrlRewrite()
371521
'store_id' => 1
372522
]
373523
);
374-
$targetPath = $actualUrls->getTargetPath();
524+
$relativePath = $actualUrls->getRequestPath();
375525

376526
$query = <<<QUERY
377527
{
@@ -386,6 +536,6 @@ public function testGetNonExistentUrlRewrite()
386536
$response = $this->graphQlQuery($query);
387537
$this->assertArrayHasKey('urlResolver', $response);
388538
$this->assertEquals('PRODUCT', $response['urlResolver']['type']);
389-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
539+
$this->assertEquals($relativePath, $response['urlResolver']['relative_url']);
390540
}
391541
}

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,24 @@ public function testCMSPageUrlResolver()
5858
QUERY;
5959
$response = $this->graphQlQuery($query);
6060
$this->assertEquals($cmsPageId, $response['urlResolver']['id']);
61-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
61+
$this->assertEquals($requestPath, $response['urlResolver']['relative_url']);
62+
$this->assertEquals(strtoupper(str_replace('-', '_', $expectedEntityType)), $response['urlResolver']['type']);
63+
64+
// querying by non seo friendly url path should return seo friendly relative url
65+
$query
66+
= <<<QUERY
67+
{
68+
urlResolver(url:"{$targetPath}")
69+
{
70+
id
71+
relative_url
72+
type
73+
}
74+
}
75+
QUERY;
76+
$response = $this->graphQlQuery($query);
77+
$this->assertEquals($cmsPageId, $response['urlResolver']['id']);
78+
$this->assertEquals($requestPath, $response['urlResolver']['relative_url']);
6279
$this->assertEquals(strtoupper(str_replace('-', '_', $expectedEntityType)), $response['urlResolver']['type']);
6380
}
6481

@@ -77,10 +94,6 @@ public function testResolveSlash()
7794
$page = $this->objectManager->get(\Magento\Cms\Model\Page::class);
7895
$page->load($homePageIdentifier);
7996
$homePageId = $page->getId();
80-
/** @var \Magento\CmsUrlRewrite\Model\CmsPageUrlPathGenerator $urlPathGenerator */
81-
$urlPathGenerator = $this->objectManager->get(\Magento\CmsUrlRewrite\Model\CmsPageUrlPathGenerator::class);
82-
/** @param \Magento\Cms\Api\Data\PageInterface $page */
83-
$targetPath = $urlPathGenerator->getCanonicalUrlPath($page);
8497
$query
8598
= <<<QUERY
8699
{
@@ -95,7 +108,7 @@ public function testResolveSlash()
95108
$response = $this->graphQlQuery($query);
96109
$this->assertArrayHasKey('urlResolver', $response);
97110
$this->assertEquals($homePageId, $response['urlResolver']['id']);
98-
$this->assertEquals($targetPath, $response['urlResolver']['relative_url']);
111+
$this->assertEquals($homePageIdentifier, $response['urlResolver']['relative_url']);
99112
$this->assertEquals('CMS_PAGE', $response['urlResolver']['type']);
100113
}
101114
}

0 commit comments

Comments
 (0)