Skip to content

Commit 650aaa6

Browse files
committed
MC-39463: GraphQL caches urlResolver response and can return the old value after the url rewrite update
1 parent b07440c commit 650aaa6

File tree

1 file changed

+178
-1
lines changed

1 file changed

+178
-1
lines changed

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

Lines changed: 178 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@
77

88
namespace Magento\GraphQl\UrlRewrite;
99

10+
use Magento\Framework\Exception\AlreadyExistsException;
11+
use Magento\TestFramework\Helper\Bootstrap;
1012
use Magento\TestFramework\ObjectManager;
1113
use Magento\TestFramework\TestCase\GraphQlAbstract;
14+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
15+
use Magento\UrlRewrite\Model\UrlFinderInterface;
16+
use Magento\UrlRewrite\Model\UrlRewrite as UrlRewriteModel;
17+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteService;
1218

1319
/**
1420
* Test the GraphQL endpoint's URLResolver query to verify canonical URL's are correctly returned.
@@ -20,7 +26,7 @@ class UrlResolverTest extends GraphQlAbstract
2026

2127
protected function setUp(): void
2228
{
23-
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
29+
$this->objectManager = Bootstrap::getObjectManager();
2430
}
2531

2632
/**
@@ -50,4 +56,175 @@ public function testNonExistentEntityUrlRewrite()
5056
);
5157
$this->graphQlQuery($query);
5258
}
59+
60+
/**
61+
* Test for url rewrite to clean cache on rewrites update
62+
*
63+
* @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php
64+
* @magentoApiDataFixture Magento/Cms/_files/pages.php
65+
*
66+
* @dataProvider urlRewriteEntitiesDataProvider
67+
* @param string $requestPath
68+
* @throws AlreadyExistsException
69+
*/
70+
public function testUrlRewriteCleansCacheOnChange(string $requestPath)
71+
{
72+
73+
/** @var UrlRewriteResourceModel $urlRewriteResourceModel */
74+
$urlRewriteResourceModel = $this->objectManager->create(UrlRewriteResourceModel::class);
75+
$storeId = 1;
76+
$query = function ($requestUrl) {
77+
return <<<QUERY
78+
{
79+
urlResolver(url:"{$requestUrl}")
80+
{
81+
id
82+
entity_uid
83+
relative_url
84+
type
85+
redirectCode
86+
}
87+
}
88+
QUERY;
89+
};
90+
91+
// warming up urlResolver API response cache for entity and validate proper response
92+
$apiResponse = $this->graphQlQuery($query($requestPath))['urlResolver'];
93+
$this->assertEquals($requestPath, $apiResponse['relative_url']);
94+
95+
$urlRewrite = $this->getUrlRewriteModelByRequestPath($requestPath, $storeId);
96+
97+
// renaming entity request path and validating that API will not return cached response
98+
$urlRewrite->setRequestPath('test' . $requestPath);
99+
$urlRewriteResourceModel->save($urlRewrite);
100+
$apiResponse = $this->graphQlQuery($query($requestPath))['urlResolver'];
101+
$this->assertNull($apiResponse['relative_url']);
102+
103+
// rolling back changes
104+
$urlRewrite->setRequestPath($requestPath);
105+
$urlRewriteResourceModel->save($urlRewrite);
106+
}
107+
108+
public function urlRewriteEntitiesDataProvider(): array
109+
{
110+
return [
111+
[
112+
'simple-product-in-stock.html'
113+
],
114+
[
115+
'category-1.html'
116+
],
117+
[
118+
'page100'
119+
]
120+
];
121+
}
122+
123+
/**
124+
* Test for custom url rewrite to clean cache on update combinations
125+
*
126+
* @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php
127+
* @magentoApiDataFixture Magento/Cms/_files/pages.php
128+
*
129+
* @throws AlreadyExistsException
130+
*/
131+
public function testUrlRewriteCleansCacheForCustomRewrites()
132+
{
133+
134+
/** @var UrlRewriteResourceModel $urlRewriteResourceModel */
135+
$urlRewriteResourceModel = $this->objectManager->create(UrlRewriteResourceModel::class);
136+
$storeId = 1;
137+
$query = function ($requestUrl) {
138+
return <<<QUERY
139+
{
140+
urlResolver(url:"{$requestUrl}")
141+
{
142+
id
143+
entity_uid
144+
relative_url
145+
type
146+
redirectCode
147+
}
148+
}
149+
QUERY;
150+
};
151+
152+
$customRequestPath = 'test.html';
153+
$customSecondRequestPath = 'test2.html';
154+
$entitiesRequestPaths = [
155+
'simple-product-in-stock.html',
156+
'category-1.html',
157+
'page100'
158+
];
159+
160+
// create custom url rewrite
161+
$urlRewrite = $this->objectManager->create(UrlRewriteModel::class);
162+
$urlRewrite->setEntityType('custom')
163+
->setRedirectType(302)
164+
->setStoreId($storeId)
165+
->setDescription(null)
166+
->setIsAutogenerated(0);
167+
168+
// create second custom url rewrite and target it to previous one to check
169+
// if proper final target url will be resolved
170+
$secondUrlRewrite = $this->objectManager->create(UrlRewriteModel::class);
171+
$secondUrlRewrite->setEntityType('custom')
172+
->setRedirectType(302)
173+
->setStoreId($storeId)
174+
->setRequestPath($customSecondRequestPath)
175+
->setTargetPath($customRequestPath)
176+
->setDescription(null)
177+
->setIsAutogenerated(0);
178+
$urlRewriteResourceModel->save($secondUrlRewrite);
179+
180+
foreach ($entitiesRequestPaths as $entityRequestPath) {
181+
// updating custom rewrite for each entity
182+
$urlRewrite->setRequestPath($customRequestPath)
183+
->setTargetPath($entityRequestPath);
184+
$urlRewriteResourceModel->save($urlRewrite);
185+
186+
// confirm that API returns non-cached response for the first custom rewrite
187+
$apiResponse = $this->graphQlQuery($query($customRequestPath))['urlResolver'];
188+
$this->assertEquals($entityRequestPath, $apiResponse['relative_url']);
189+
190+
// confirm that API returns non-cached response for the second custom rewrite
191+
$apiResponse = $this->graphQlQuery($query($customSecondRequestPath))['urlResolver'];
192+
$this->assertEquals($entityRequestPath, $apiResponse['relative_url']);
193+
}
194+
195+
$urlRewriteResourceModel->delete($secondUrlRewrite);
196+
197+
// delete custom rewrite and validate that API will not return cached response
198+
$urlRewriteResourceModel->delete($urlRewrite);
199+
$apiResponse = $this->graphQlQuery($query($customRequestPath))['urlResolver'];
200+
$this->assertNull($apiResponse['relative_url']);
201+
}
202+
203+
/**
204+
* Return UrlRewrite model instance by request_path
205+
*
206+
* @param string $requestPath
207+
* @param int $storeId
208+
* @return UrlRewriteModel
209+
*/
210+
private function getUrlRewriteModelByRequestPath(string $requestPath, int $storeId): UrlRewriteModel
211+
{
212+
/** @var UrlFinderInterface $urlFinder */
213+
$urlFinder = $this->objectManager->get(UrlFinderInterface::class);
214+
215+
/** @var UrlRewriteService $urlRewriteService */
216+
$urlRewriteService = $urlFinder->findOneByData(
217+
[
218+
'request_path' => $requestPath,
219+
'store_id' => $storeId
220+
]
221+
);
222+
223+
/** @var UrlRewriteModel $urlRewrite */
224+
$urlRewrite = $this->objectManager->create(UrlRewriteModel::class);
225+
$urlRewrite->load($urlRewriteService->getUrlRewriteId());
226+
227+
return $urlRewrite;
228+
}
229+
53230
}

0 commit comments

Comments
 (0)