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

231 lines
7.2 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\GraphQl\UrlRewrite;
use Magento\Framework\Exception\AlreadyExistsException;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\ObjectManager;
use Magento\TestFramework\TestCase\GraphQlAbstract;
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Model\UrlRewrite as UrlRewriteModel;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteService;
/**
* Test the GraphQL endpoint's URLResolver query to verify canonical URL's are correctly returned.
*/
class UrlResolverTest extends GraphQlAbstract
{
/** @var ObjectManager */
private $objectManager;
protected function setUp(): void
{
$this->objectManager = Bootstrap::getObjectManager();
}
/**
* Test for custom type which point to the invalid product/category/cms page.
*
* @magentoApiDataFixture Magento/UrlRewrite/_files/url_rewrite_not_existing_entity.php
*/
public function testNonExistentEntityUrlRewrite()
{
$urlPath = 'non-exist-entity.html';
$query = <<<QUERY
{
urlResolver(url:"{$urlPath}")
{
id
entity_uid
relative_url
type
redirectCode
}
}
QUERY;
$this->expectExceptionMessage(
"No such entity found with matching URL key: " . $urlPath
);
$this->graphQlQuery($query);
}
/**
* Test for url rewrite to clean cache on rewrites update
*
* @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php
* @magentoApiDataFixture Magento/Cms/_files/pages.php
*
* @dataProvider urlRewriteEntitiesDataProvider
* @param string $requestPath
* @throws AlreadyExistsException
*/
public function testUrlRewriteCleansCacheOnChange(string $requestPath)
{
/** @var UrlRewriteResourceModel $urlRewriteResourceModel */
$urlRewriteResourceModel = $this->objectManager->create(UrlRewriteResourceModel::class);
$storeId = 1;
$query = function ($requestUrl) {
return <<<QUERY
{
urlResolver(url:"{$requestUrl}")
{
id
entity_uid
relative_url
type
redirectCode
}
}
QUERY;
};
// warming up urlResolver API response cache for entity and validate proper response
$apiResponse = $this->graphQlQuery($query($requestPath));
$this->assertEquals($requestPath, $apiResponse['urlResolver']['relative_url']);
$urlRewrite = $this->getUrlRewriteModelByRequestPath($requestPath, $storeId);
// renaming entity request path and validating that API will not return cached response
$urlRewrite->setRequestPath('test' . $requestPath);
$urlRewriteResourceModel->save($urlRewrite);
$apiResponse = $this->graphQlQuery($query($requestPath));
$this->assertNull($apiResponse['urlResolver']);
// rolling back changes
$urlRewrite->setRequestPath($requestPath);
$urlRewriteResourceModel->save($urlRewrite);
}
public function urlRewriteEntitiesDataProvider(): array
{
return [
[
'simple-product-in-stock.html'
],
[
'category-1.html'
],
[
'page100'
]
];
}
/**
* Test for custom url rewrite to clean cache on update combinations
*
* @magentoApiDataFixture Magento/Catalog/_files/product_with_category.php
* @magentoApiDataFixture Magento/Cms/_files/pages.php
*
* @throws AlreadyExistsException
*/
public function testUrlRewriteCleansCacheForCustomRewrites()
{
/** @var UrlRewriteResourceModel $urlRewriteResourceModel */
$urlRewriteResourceModel = $this->objectManager->create(UrlRewriteResourceModel::class);
$storeId = 1;
$query = function ($requestUrl) {
return <<<QUERY
{
urlResolver(url:"{$requestUrl}")
{
id
entity_uid
relative_url
type
redirectCode
}
}
QUERY;
};
$customRequestPath = 'test.html';
$customSecondRequestPath = 'test2.html';
$entitiesRequestPaths = [
'simple-product-in-stock.html',
'category-1.html',
'page100'
];
// create custom url rewrite
$urlRewrite = $this->objectManager->create(UrlRewriteModel::class);
$urlRewrite->setEntityType('custom')
->setRedirectType(302)
->setStoreId($storeId)
->setDescription(null)
->setIsAutogenerated(0);
// create second custom url rewrite and target it to previous one to check
// if proper final target url will be resolved
$secondUrlRewrite = $this->objectManager->create(UrlRewriteModel::class);
$secondUrlRewrite->setEntityType('custom')
->setRedirectType(302)
->setStoreId($storeId)
->setRequestPath($customSecondRequestPath)
->setTargetPath($customRequestPath)
->setDescription(null)
->setIsAutogenerated(0);
$urlRewriteResourceModel->save($secondUrlRewrite);
foreach ($entitiesRequestPaths as $entityRequestPath) {
// updating custom rewrite for each entity
$urlRewrite->setRequestPath($customRequestPath)
->setTargetPath($entityRequestPath);
$urlRewriteResourceModel->save($urlRewrite);
// confirm that API returns non-cached response for the first custom rewrite
$apiResponse = $this->graphQlQuery($query($customRequestPath));
$this->assertEquals($entityRequestPath, $apiResponse['urlResolver']['relative_url']);
// confirm that API returns non-cached response for the second custom rewrite
$apiResponse = $this->graphQlQuery($query($customSecondRequestPath));
$this->assertEquals($entityRequestPath, $apiResponse['urlResolver']['relative_url']);
}
$urlRewriteResourceModel->delete($secondUrlRewrite);
// delete custom rewrite and validate that API will not return cached response
$urlRewriteResourceModel->delete($urlRewrite);
$apiResponse = $this->graphQlQuery($query($customRequestPath));
$this->assertNull($apiResponse['urlResolver']);
}
/**
* Return UrlRewrite model instance by request_path
*
* @param string $requestPath
* @param int $storeId
* @return UrlRewriteModel
*/
private function getUrlRewriteModelByRequestPath(string $requestPath, int $storeId): UrlRewriteModel
{
/** @var UrlFinderInterface $urlFinder */
$urlFinder = $this->objectManager->get(UrlFinderInterface::class);
/** @var UrlRewriteService $urlRewriteService */
$urlRewriteService = $urlFinder->findOneByData(
[
'request_path' => $requestPath,
'store_id' => $storeId
]
);
/** @var UrlRewriteModel $urlRewrite */
$urlRewrite = $this->objectManager->create(UrlRewriteModel::class);
$urlRewrite->load($urlRewriteService->getUrlRewriteId());
return $urlRewrite;
}
}