magento2-docker/dev/tests/integration/testsuite/Magento/GraphQlCache/Controller/UrlRewrite/AllEntitiesUrlResolverCache...

177 lines
6.6 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\GraphQlCache\Controller\UrlRewrite;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Product;
use Magento\Framework\App\Response\HttpInterface as HttpResponse;
use Magento\GraphQlCache\Controller\AbstractGraphqlCacheTest;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\Cms\Api\Data\PageInterface;
use Magento\Cms\Api\GetPageByIdentifierInterface;
/**
* Test caching works for categoryUrlResolver
*
* @magentoAppArea graphql
* @magentoCache full_page enabled
* @magentoDbIsolation disabled
*/
class AllEntitiesUrlResolverCacheTest extends AbstractGraphqlCacheTest
{
private function assertCacheMISSWithTagsForCategory(string $categoryId, HttpResponse $response): void
{
$this->assertCacheMISS($response);
$this->assertCacheTags($categoryId, 'cat_c', $response);
}
private function assertCacheMISSWithTagsForProduct(string $productId, HttpResponse $response): void
{
$this->assertCacheMISS($response);
$this->assertCacheTags($productId, 'cat_p', $response);
}
private function assertCacheMISSWithTagsForCmsPage(string $pageId, HttpResponse $response): void
{
$this->assertCacheMISS($response);
$this->assertCacheTags($pageId, 'cms_p', $response);
}
private function assertCacheHITWithTagsForCategory(string $categoryId, HttpResponse $response): void
{
$this->assertCacheHIT($response);
$this->assertCacheTags($categoryId, 'cat_c', $response);
}
private function assertCacheHITWithTagsForProduct(string $productId, HttpResponse $response): void
{
$this->assertCacheHIT($response);
$this->assertCacheTags($productId, 'cat_p', $response);
}
private function assertCacheHITWithTagsForCmsPage(string $pageId, HttpResponse $response): void
{
$this->assertCacheHIT($response);
$this->assertCacheTags($pageId, 'cms_p', $response);
}
private function assertCacheMISS(HttpResponse $response): void
{
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
}
private function assertCacheHIT(HttpResponse $response): void
{
$this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
}
private function assertCacheTags(string $entityId, string $entityCacheTag, HttpResponse $response)
{
$expectedCacheTags = [$entityCacheTag, $entityCacheTag . '_' . $entityId, 'FPC'];
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
$actualCacheTags = explode(',', $rawActualCacheTags);
$this->assertEquals($expectedCacheTags, $actualCacheTags);
}
private function buildQuery(string $requestPath): string
{
$resolverQuery = <<<QUERY
{
urlResolver(url:"{$requestPath}")
{
id
relative_url
canonical_url
type
}
}
QUERY;
return $resolverQuery;
}
/**
* Tests that X-Magento-Tags and cache debug headers are correct for category urlResolver
*
* @magentoDataFixture Magento/CatalogUrlRewrite/_files/product_with_category.php
* @magentoDataFixture Magento/Cms/_files/pages.php
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function testAllEntitiesUrlResolverRequestHasCorrectTags(): void
{
$categoryUrlKey = 'cat-1.html';
$productUrlKey = 'p002.html';
$productSku = 'p002';
/** @var ProductRepositoryInterface $productRepository */
$productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
/** @var Product $product */
$product = $productRepository->get($productSku, false, null, true);
$storeId = (string) $product->getStoreId();
/** @var UrlFinderInterface $urlFinder */
$urlFinder = $this->objectManager->get(UrlFinderInterface::class);
$actualUrls = $urlFinder->findOneByData(
[
'request_path' => $categoryUrlKey,
'store_id' => $storeId
]
);
$categoryId = (string) $actualUrls->getEntityId();
$categoryQuery = $this->buildQuery($categoryUrlKey);
$productQuery = $this->buildQuery($productUrlKey);
/** @var GetPageByIdentifierInterface $page */
$page = $this->objectManager->get(GetPageByIdentifierInterface::class);
/** @var PageInterface $cmsPage */
$cmsPage = $page->execute('page100', 0);
$cmsPageId = (string) $cmsPage->getId();
$requestPath = $cmsPage->getIdentifier();
$pageQuery = $this->buildQuery($requestPath);
// query category for MISS
$response = $this->dispatchGraphQlGETRequest(['query' => $categoryQuery]);
$this->assertCacheMISSWithTagsForCategory($categoryId, $response);
// query product for MISS
$response = $this->dispatchGraphQlGETRequest(['query' => $productQuery]);
$this->assertCacheMISSWithTagsForProduct((string) $product->getId(), $response);
// query page for MISS
$response = $this->dispatchGraphQlGETRequest(['query' => $pageQuery]);
$this->assertCacheMISSWithTagsForCmsPage($cmsPageId, $response);
// query category for HIT
$response = $this->dispatchGraphQlGETRequest(['query' => $categoryQuery]);
$this->assertCacheHITWithTagsForCategory($categoryId, $response);
// query product for HIT
$response = $this->dispatchGraphQlGETRequest(['query' => $productQuery]);
$this->assertCacheHITWithTagsForProduct((string) $product->getId(), $response);
// query page for HIT
$response = $this->dispatchGraphQlGETRequest(['query' => $pageQuery]);
$this->assertCacheHITWithTagsForCmsPage($cmsPageId, $response);
$product->setUrlKey('something-else-that-invalidates-the-cache');
$productRepository->save($product);
$productQuery = $this->buildQuery('something-else-that-invalidates-the-cache.html');
// query category for MISS
$response = $this->dispatchGraphQlGETRequest(['query' => $categoryQuery]);
$this->assertCacheMISSWithTagsForCategory($categoryId, $response);
// query product for MISS
$response = $this->dispatchGraphQlGETRequest(['query' => $productQuery]);
$this->assertCacheMISSWithTagsForProduct((string) $product->getId(), $response);
// query page for HIT
$response = $this->dispatchGraphQlGETRequest(['query' => $pageQuery]);
$this->assertCacheHITWithTagsForCmsPage($cmsPageId, $response);
}
}