125 lines
4.8 KiB
PHP
Executable File
125 lines
4.8 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\PageInterface;
|
|
use Magento\Cms\Model\GetPageByIdentifier;
|
|
use Magento\Cms\Model\PageRepository;
|
|
use Magento\Framework\App\Response\HttpInterface as HttpResponse;
|
|
use Magento\GraphQlCache\Controller\AbstractGraphqlCacheTest;
|
|
|
|
/**
|
|
* Test caching works for CMS pages
|
|
*
|
|
* @magentoAppArea graphql
|
|
* @magentoCache full_page enabled
|
|
* @magentoDbIsolation disabled
|
|
*
|
|
*/
|
|
class CmsPageCacheTest extends AbstractGraphqlCacheTest
|
|
{
|
|
private function assertPageCacheMissWithTagsForCmsPage(string $pageId, string $name, HttpResponse $response): void
|
|
{
|
|
$this->assertEquals(
|
|
'MISS',
|
|
$response->getHeader('X-Magento-Cache-Debug')->getFieldValue(),
|
|
"expected MISS on page {$name} id {$pageId}"
|
|
);
|
|
$this->assertCmsPageCacheTags($pageId, $response);
|
|
}
|
|
|
|
private function assertPageCacheHitWithTagsForCmsPage(string $pageId, string $name, HttpResponse $response): void
|
|
{
|
|
$this->assertEquals(
|
|
'HIT',
|
|
$response->getHeader('X-Magento-Cache-Debug')->getFieldValue(),
|
|
"expected HIT on page {$name} id {$pageId}"
|
|
);
|
|
$this->assertCmsPageCacheTags($pageId, $response);
|
|
}
|
|
|
|
private function assertCmsPageCacheTags(string $pageId, HttpResponse $response): void
|
|
{
|
|
$requestedCacheTags = explode(',', $response->getHeader('X-Magento-Tags')->getFieldValue());
|
|
$expectedCacheTags = ['cms_p', 'cms_p_' . $pageId, 'FPC'];
|
|
$this->assertEquals($expectedCacheTags, $requestedCacheTags);
|
|
}
|
|
|
|
private function buildQuery(string $id): string
|
|
{
|
|
$queryCmsPage = <<<QUERY
|
|
{
|
|
cmsPage(id: $id) {
|
|
url_key
|
|
title
|
|
content
|
|
content_heading
|
|
page_layout
|
|
meta_title
|
|
meta_description
|
|
meta_keywords
|
|
}
|
|
}
|
|
QUERY;
|
|
return $queryCmsPage;
|
|
}
|
|
|
|
private function updateCmsPageTitle(string $pageId100, string $newTitle): void
|
|
{
|
|
/** @var PageRepository $pageRepository */
|
|
$pageRepository = $this->objectManager->get(PageRepository::class);
|
|
$page = $pageRepository->getById($pageId100);
|
|
$page->setTitle($newTitle);
|
|
$pageRepository->save($page);
|
|
}
|
|
|
|
/**
|
|
* @magentoDataFixture Magento/Cms/_files/pages.php
|
|
*/
|
|
public function testCmsPageRequestCacheTags(): void
|
|
{
|
|
/** @var PageInterface $cmsPage100 */
|
|
$cmsPage100 = $this->objectManager->get(GetPageByIdentifier::class)->execute('page100', 0);
|
|
$pageId100 = (string) $cmsPage100->getId();
|
|
|
|
/** @var PageInterface $cmsPageBlank */
|
|
$cmsPageBlank = $this->objectManager->get(GetPageByIdentifier::class)->execute('page_design_blank', 0);
|
|
$pageIdBlank = (string) $cmsPageBlank->getId();
|
|
|
|
$queryCmsPage100 = $this->buildQuery($pageId100);
|
|
$queryCmsPageBlank = $this->buildQuery($pageIdBlank);
|
|
|
|
// check to see that the first entity gets a MISS when called the first time
|
|
$response = $this->dispatchGraphQlGETRequest(['query' => $queryCmsPage100]);
|
|
$this->assertPageCacheMissWithTagsForCmsPage($pageId100, 'page100', $response);
|
|
|
|
// check to see that the second entity gets a MISS when called the first time
|
|
$response = $this->dispatchGraphQlGETRequest(['query' => $queryCmsPageBlank]);
|
|
$this->assertPageCacheMissWithTagsForCmsPage($pageIdBlank, 'pageBlank', $response);
|
|
|
|
// check to see that the first entity gets a HIT when called the second time
|
|
$response = $this->dispatchGraphQlGETRequest(['query' => $queryCmsPage100]);
|
|
$this->assertPageCacheHitWithTagsForCmsPage($pageId100, 'page100', $response);
|
|
|
|
// check to see that the second entity gets a HIT when called the second time
|
|
$response = $this->dispatchGraphQlGETRequest(['query' => $queryCmsPageBlank]);
|
|
$this->assertPageCacheHitWithTagsForCmsPage($pageIdBlank, 'pageBlank', $response);
|
|
|
|
// invalidate first entity
|
|
$this->updateCmsPageTitle($pageId100, 'something else that causes invalidation');
|
|
|
|
// check to see that the second entity gets a HIT to confirm only the first was invalidated
|
|
$response = $this->dispatchGraphQlGETRequest(['query' => $queryCmsPageBlank]);
|
|
$this->assertPageCacheHitWithTagsForCmsPage($pageIdBlank, 'pageBlank', $response);
|
|
|
|
// check to see that the first entity gets a MISS because it was invalidated
|
|
$response = $this->dispatchGraphQlGETRequest(['query' => $queryCmsPage100]);
|
|
$this->assertPageCacheMissWithTagsForCmsPage($pageId100, 'page100', $response);
|
|
}
|
|
}
|