112 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.0 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\Cms;
 | 
						|
 | 
						|
use Magento\Cms\Api\Data\BlockInterface;
 | 
						|
use Magento\Cms\Model\BlockRepository;
 | 
						|
use Magento\Framework\App\Response\HttpInterface as HttpResponse;
 | 
						|
use Magento\GraphQlCache\Controller\AbstractGraphqlCacheTest;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test caching works for CMS blocks
 | 
						|
 *
 | 
						|
 * @magentoAppArea graphql
 | 
						|
 * @magentoCache full_page enabled
 | 
						|
 * @magentoDbIsolation disabled
 | 
						|
 */
 | 
						|
class BlockCacheTest extends AbstractGraphqlCacheTest
 | 
						|
{
 | 
						|
    private function assertPageCacheMissWithTagsForCmsBlock(HttpResponse $response, BlockInterface $block): void
 | 
						|
    {
 | 
						|
        $this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
 | 
						|
        $this->assertCmsBlockCacheTags($response, $block);
 | 
						|
    }
 | 
						|
 | 
						|
    private function assertPageCacheHitWithTagsForCmsBlock(HttpResponse $response, BlockInterface $block): void
 | 
						|
    {
 | 
						|
        $this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
 | 
						|
        $this->assertCmsBlockCacheTags($response, $block);
 | 
						|
    }
 | 
						|
 | 
						|
    private function assertCmsBlockCacheTags(HttpResponse $response, BlockInterface $block): void
 | 
						|
    {
 | 
						|
        $expectedCacheTags  = ['cms_b', 'cms_b_' . $block->getId(), 'cms_b_' . $block->getIdentifier(), 'FPC'];
 | 
						|
        $rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
 | 
						|
        $actualCacheTags    = explode(',', $rawActualCacheTags);
 | 
						|
        $this->assertEquals($expectedCacheTags, $actualCacheTags);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Cms/_files/block.php
 | 
						|
     * @magentoDataFixture Magento/Cms/_files/blocks.php
 | 
						|
     */
 | 
						|
    public function testCmsBlocksRequestHasCorrectTags(): void
 | 
						|
    {
 | 
						|
        /** @var BlockRepository $blockRepository */
 | 
						|
        $blockRepository = $this->objectManager->get(BlockRepository::class);
 | 
						|
 | 
						|
        $block1Identifier = 'fixture_block';
 | 
						|
        $block1           = $blockRepository->getById($block1Identifier);
 | 
						|
        $block2Identifier = 'enabled_block';
 | 
						|
        $block2           = $blockRepository->getById($block2Identifier);
 | 
						|
 | 
						|
        $queryBlock1
 | 
						|
            = <<<QUERY
 | 
						|
 {
 | 
						|
    cmsBlocks(identifiers: ["$block1Identifier"]) {
 | 
						|
        items {
 | 
						|
            title
 | 
						|
    	    identifier
 | 
						|
            content
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
QUERY;
 | 
						|
 | 
						|
        $queryBlock2
 | 
						|
            = <<<QUERY
 | 
						|
 {
 | 
						|
    cmsBlocks(identifiers: ["$block2Identifier"]) {
 | 
						|
        items {
 | 
						|
            title
 | 
						|
    	    identifier
 | 
						|
            content
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
QUERY;
 | 
						|
 | 
						|
        // check to see that the first entity gets a MISS when called the first time
 | 
						|
        $response = $this->dispatchGraphQlGETRequest(['query' => $queryBlock1]);
 | 
						|
        $this->assertPageCacheMissWithTagsForCmsBlock($response, $block1);
 | 
						|
 | 
						|
        // check to see that the second entity gets a MISS when called the first time
 | 
						|
        $response = $this->dispatchGraphQlGETRequest(['query' => $queryBlock2]);
 | 
						|
        $this->assertPageCacheMissWithTagsForCmsBlock($response, $block2);
 | 
						|
 | 
						|
        // check to see that the first entity gets a HIT when called the second time
 | 
						|
        $response = $this->dispatchGraphQlGETRequest(['query' => $queryBlock1]);
 | 
						|
        $this->assertPageCacheHitWithTagsForCmsBlock($response, $block1);
 | 
						|
 | 
						|
        // check to see that the second entity gets a HIT when called the second time
 | 
						|
        $response = $this->dispatchGraphQlGETRequest(['query' => $queryBlock2]);
 | 
						|
        $this->assertPageCacheHitWithTagsForCmsBlock($response, $block2);
 | 
						|
 | 
						|
        $block1->setTitle('something else that causes invalidation');
 | 
						|
        $blockRepository->save($block1);
 | 
						|
 | 
						|
        // check to see that the first entity gets a MISS and it was invalidated
 | 
						|
        $response = $this->dispatchGraphQlGETRequest(['query' => $queryBlock1]);
 | 
						|
        $this->assertPageCacheMissWithTagsForCmsBlock($response, $block1);
 | 
						|
 | 
						|
        // check to see that the first entity gets a HIT when called the second time
 | 
						|
        $response = $this->dispatchGraphQlGETRequest(['query' => $queryBlock1]);
 | 
						|
        $this->assertPageCacheHitWithTagsForCmsBlock($response, $block1);
 | 
						|
    }
 | 
						|
}
 |