161 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\GraphQl\PageCache\Cms;
 | 
						|
 | 
						|
use Magento\Cms\Model\Block;
 | 
						|
use Magento\Cms\Model\BlockRepository;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\TestFramework\TestCase\GraphQlAbstract;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test the caching works properly for CMS Blocks
 | 
						|
 */
 | 
						|
class BlockCacheTest extends GraphQlAbstract
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->markTestSkipped(
 | 
						|
            'This test will stay skipped until DEVOPS-4924 is resolved'
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test that X-Magento-Tags are correct
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Cms/_files/block.php
 | 
						|
     */
 | 
						|
    public function testCacheTagsHaveExpectedValue()
 | 
						|
    {
 | 
						|
        $blockIdentifier = 'fixture_block';
 | 
						|
        $blockRepository = Bootstrap::getObjectManager()->get(BlockRepository::class);
 | 
						|
        $block = $blockRepository->getById($blockIdentifier);
 | 
						|
        $blockId = $block->getId();
 | 
						|
        $query = $this->getBlockQuery([$blockIdentifier]);
 | 
						|
 | 
						|
        //cache-debug should be a MISS on first request
 | 
						|
        $response = $this->graphQlQueryWithResponseHeaders($query);
 | 
						|
 | 
						|
        $this->assertArrayHasKey('X-Magento-Tags', $response['headers']);
 | 
						|
        $actualTags = explode(',', $response['headers']['X-Magento-Tags']);
 | 
						|
        $expectedTags = ["cms_b", "cms_b_{$blockId}", "cms_b_{$blockIdentifier}", "FPC"];
 | 
						|
        $this->assertEquals($expectedTags, $actualTags);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test the second request for the same block will return a cached result
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Cms/_files/block.php
 | 
						|
     */
 | 
						|
    public function testCacheIsUsedOnSecondRequest()
 | 
						|
    {
 | 
						|
        $blockIdentifier = 'fixture_block';
 | 
						|
        $query = $this->getBlockQuery([$blockIdentifier]);
 | 
						|
 | 
						|
        //cache-debug should be a MISS on first request
 | 
						|
        $responseMiss = $this->graphQlQueryWithResponseHeaders($query);
 | 
						|
        $this->assertArrayHasKey('X-Magento-Cache-Debug', $responseMiss['headers']);
 | 
						|
        $this->assertEquals('MISS', $responseMiss['headers']['X-Magento-Cache-Debug']);
 | 
						|
 | 
						|
        //cache-debug should be a HIT on second request
 | 
						|
        $responseHit = $this->graphQlQueryWithResponseHeaders($query);
 | 
						|
        $this->assertArrayHasKey('X-Magento-Cache-Debug', $responseHit['headers']);
 | 
						|
        $this->assertEquals('HIT', $responseHit['headers']['X-Magento-Cache-Debug']);
 | 
						|
        //cached data should be correct
 | 
						|
        $this->assertNotEmpty($responseHit['body']);
 | 
						|
        $this->assertArrayNotHasKey('errors', $responseHit['body']);
 | 
						|
        $blocks = $responseHit['body']['cmsBlocks']['items'];
 | 
						|
        $this->assertEquals($blockIdentifier, $blocks[0]['identifier']);
 | 
						|
        $this->assertEquals('CMS Block Title', $blocks[0]['title']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test that cache is invalidated when block is updated
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Cms/_files/blocks.php
 | 
						|
     * @magentoApiDataFixture Magento/Cms/_files/block.php
 | 
						|
     */
 | 
						|
    public function testCacheIsInvalidatedOnBlockUpdate()
 | 
						|
    {
 | 
						|
        $fixtureBlockIdentifier = 'fixture_block';
 | 
						|
        $enabledBlockIdentifier = 'enabled_block';
 | 
						|
        $fixtureBlockQuery = $this->getBlockQuery([$fixtureBlockIdentifier]);
 | 
						|
        $enabledBlockQuery = $this->getBlockQuery([$enabledBlockIdentifier]);
 | 
						|
 | 
						|
        //cache-debug should be a MISS on first request
 | 
						|
        $fixtureBlockMiss = $this->graphQlQueryWithResponseHeaders($fixtureBlockQuery);
 | 
						|
        $this->assertEquals('MISS', $fixtureBlockMiss['headers']['X-Magento-Cache-Debug']);
 | 
						|
        $enabledBlockMiss = $this->graphQlQueryWithResponseHeaders($enabledBlockQuery);
 | 
						|
        $this->assertEquals('MISS', $enabledBlockMiss['headers']['X-Magento-Cache-Debug']);
 | 
						|
 | 
						|
        //cache-debug should be a HIT on second request
 | 
						|
        $fixtureBlockHit = $this->graphQlQueryWithResponseHeaders($fixtureBlockQuery);
 | 
						|
        $this->assertEquals('HIT', $fixtureBlockHit['headers']['X-Magento-Cache-Debug']);
 | 
						|
        $enabledBlockHit = $this->graphQlQueryWithResponseHeaders($enabledBlockQuery);
 | 
						|
        $this->assertEquals('HIT', $enabledBlockHit['headers']['X-Magento-Cache-Debug']);
 | 
						|
 | 
						|
        $newBlockContent = 'New block content!!!';
 | 
						|
        $this->updateBlockContent($fixtureBlockIdentifier, $newBlockContent);
 | 
						|
 | 
						|
        //cache-debug should be a MISS after update the block
 | 
						|
        $fixtureBlockMiss = $this->graphQlQueryWithResponseHeaders($fixtureBlockQuery);
 | 
						|
        $this->assertEquals('MISS', $fixtureBlockMiss['headers']['X-Magento-Cache-Debug']);
 | 
						|
        $enabledBlockHit = $this->graphQlQueryWithResponseHeaders($enabledBlockQuery);
 | 
						|
        $this->assertEquals('HIT', $enabledBlockHit['headers']['X-Magento-Cache-Debug']);
 | 
						|
        //updated block data should be correct
 | 
						|
        $this->assertNotEmpty($fixtureBlockMiss['body']);
 | 
						|
        $blocks = $fixtureBlockMiss['body']['cmsBlocks']['items'];
 | 
						|
        $this->assertArrayNotHasKey('errors', $fixtureBlockMiss['body']);
 | 
						|
        $this->assertEquals($fixtureBlockIdentifier, $blocks[0]['identifier']);
 | 
						|
        $this->assertEquals('CMS Block Title', $blocks[0]['title']);
 | 
						|
        $this->assertEquals($newBlockContent, $blocks[0]['content']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Update the content of a CMS block
 | 
						|
     *
 | 
						|
     * @param $identifier
 | 
						|
     * @param $newContent
 | 
						|
     * @return Block
 | 
						|
     */
 | 
						|
    private function updateBlockContent($identifier, $newContent): Block
 | 
						|
    {
 | 
						|
        $blockRepository = Bootstrap::getObjectManager()->get(BlockRepository::class);
 | 
						|
        $block = $blockRepository->getById($identifier);
 | 
						|
        $block->setContent($newContent);
 | 
						|
        $blockRepository->save($block);
 | 
						|
 | 
						|
        return $block;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get cmsBlocks query
 | 
						|
     *
 | 
						|
     * @param array $identifiers
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    private function getBlockQuery(array $identifiers): string
 | 
						|
    {
 | 
						|
        $identifiersString = implode(',', $identifiers);
 | 
						|
        $query = <<<QUERY
 | 
						|
    { 
 | 
						|
        cmsBlocks(identifiers: ["$identifiersString"]) {
 | 
						|
            items {
 | 
						|
                title
 | 
						|
                identifier
 | 
						|
                content
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
QUERY;
 | 
						|
        return $query;
 | 
						|
    }
 | 
						|
}
 |