177 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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);
 | 
						|
    }
 | 
						|
}
 |