Skip to content

Commit b557642

Browse files
committed
MC-15959: Implement caching for url resolver
- refactor tests to support HIT & invalidation
1 parent 3f7c330 commit b557642

File tree

5 files changed

+228
-154
lines changed

5 files changed

+228
-154
lines changed

dev/tests/integration/testsuite/Magento/GraphQlCache/Controller/Cms/BlockCacheTest.php

Lines changed: 74 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,22 @@ protected function setUp(): void
3838
* Test that the correct cache tags get added to request for cmsBlocks
3939
*
4040
* @magentoDataFixture Magento/Cms/_files/block.php
41+
* @magentoDataFixture Magento/Cms/_files/blocks.php
4142
*/
4243
public function testCmsBlocksRequestHasCorrectTags(): void
4344
{
44-
$blockIdentifier = 'fixture_block';
45+
/** @var BlockRepository $blockRepository */
4546
$blockRepository = $this->objectManager->get(BlockRepository::class);
46-
$block = $blockRepository->getById($blockIdentifier);
4747

48-
$query
48+
$block1Identifier = 'fixture_block';
49+
$block1 = $blockRepository->getById($block1Identifier);
50+
$block2Identifier = 'enabled_block';
51+
$block2 = $blockRepository->getById($block2Identifier);
52+
53+
$queryBlock1
4954
= <<<QUERY
5055
{
51-
cmsBlocks(identifiers: ["$blockIdentifier"]) {
56+
cmsBlocks(identifiers: ["$block1Identifier"]) {
5257
items {
5358
title
5459
identifier
@@ -57,10 +62,73 @@ public function testCmsBlocksRequestHasCorrectTags(): void
5762
}
5863
}
5964
QUERY;
60-
$request = $this->prepareRequest($query);
65+
66+
$queryBlock2
67+
= <<<QUERY
68+
{
69+
cmsBlocks(identifiers: ["$block2Identifier"]) {
70+
items {
71+
title
72+
identifier
73+
content
74+
}
75+
}
76+
}
77+
QUERY;
78+
79+
// check to see that the first entity gets a MISS when called the first time
80+
$request = $this->prepareRequest($queryBlock1);
81+
$response = $this->graphqlController->dispatch($request);
82+
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
83+
$expectedCacheTags = ['cms_b', 'cms_b_' . $block1->getId(), 'cms_b_' . $block1->getIdentifier(), 'FPC'];
84+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
85+
$actualCacheTags = explode(',', $rawActualCacheTags);
86+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
87+
88+
// check to see that the second entity gets a miss when called the first time
89+
$request = $this->prepareRequest($queryBlock2);
6190
$response = $this->graphqlController->dispatch($request);
6291
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
63-
$expectedCacheTags = ['cms_b', 'cms_b_' . $block->getId(), 'cms_b_' . $block->getIdentifier(), 'FPC'];
92+
$expectedCacheTags = ['cms_b', 'cms_b_' . $block2->getId(), 'cms_b_' . $block2->getIdentifier(), 'FPC'];
93+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
94+
$actualCacheTags = explode(',', $rawActualCacheTags);
95+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
96+
97+
// check to see that the first entity gets a HIT when called the second time
98+
$request = $this->prepareRequest($queryBlock1);
99+
$response = $this->graphqlController->dispatch($request);
100+
$this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
101+
$expectedCacheTags = ['cms_b', 'cms_b_' . $block1->getId(), 'cms_b_' . $block1->getIdentifier(), 'FPC'];
102+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
103+
$actualCacheTags = explode(',', $rawActualCacheTags);
104+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
105+
106+
// check to see that the second entity gets a HIT when called the second time
107+
$request = $this->prepareRequest($queryBlock2);
108+
$response = $this->graphqlController->dispatch($request);
109+
$this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
110+
$expectedCacheTags = ['cms_b', 'cms_b_' . $block2->getId(), 'cms_b_' . $block2->getIdentifier(), 'FPC'];
111+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
112+
$actualCacheTags = explode(',', $rawActualCacheTags);
113+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
114+
115+
$block1->setTitle('something else that causes invalidation');
116+
$blockRepository->save($block1);
117+
118+
// check to see that the first entity gets a MISS and it was invalidated
119+
$request = $this->prepareRequest($queryBlock1);
120+
$response = $this->graphqlController->dispatch($request);
121+
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
122+
$expectedCacheTags = ['cms_b', 'cms_b_' . $block1->getId(), 'cms_b_' . $block1->getIdentifier(), 'FPC'];
123+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
124+
$actualCacheTags = explode(',', $rawActualCacheTags);
125+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
126+
127+
// check to see that the first entity gets a HIT when called the second time
128+
$request = $this->prepareRequest($queryBlock1);
129+
$response = $this->graphqlController->dispatch($request);
130+
$this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
131+
$expectedCacheTags = ['cms_b', 'cms_b_' . $block1->getId(), 'cms_b_' . $block1->getIdentifier(), 'FPC'];
64132
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
65133
$actualCacheTags = explode(',', $rawActualCacheTags);
66134
$this->assertEquals($expectedCacheTags, $actualCacheTags);

dev/tests/integration/testsuite/Magento/GraphQlCache/Controller/Cms/CmsPageCacheTest.php

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\GraphQlCache\Controller\Cms;
99

1010
use Magento\Cms\Model\GetPageByIdentifier;
11+
use Magento\Cms\Model\PageRepository;
1112
use Magento\GraphQl\Controller\GraphQl;
1213
use Magento\GraphQlCache\Controller\AbstractGraphqlCacheTest;
1314

@@ -80,6 +81,7 @@ public function testToCheckCmsPageRequestCacheTags(): void
8081
}
8182
QUERY;
8283

84+
// check to see that the first entity gets a MISS when called the first time
8385
$request = $this->prepareRequest($queryCmsPage100);
8486
$response = $this->graphqlController->dispatch($request);
8587
$this->assertEquals(
@@ -90,7 +92,8 @@ public function testToCheckCmsPageRequestCacheTags(): void
9092
$requestedCacheTags = explode(',', $response->getHeader('X-Magento-Tags')->getFieldValue());
9193
$expectedCacheTags = ['cms_p', 'cms_p_' .$pageId100 , 'FPC'];
9294
$this->assertEquals($expectedCacheTags, $requestedCacheTags);
93-
95+
96+
// check to see that the second entity gets a miss when called the first time
9497
$request = $this->prepareRequest($queryCmsPageBlank);
9598
$response = $this->graphqlController->dispatch($request);
9699
$this->assertEquals(
@@ -102,6 +105,7 @@ public function testToCheckCmsPageRequestCacheTags(): void
102105
$expectedCacheTags = ['cms_p', 'cms_p_' .$pageIdBlank , 'FPC'];
103106
$this->assertEquals($expectedCacheTags, $requestedCacheTags);
104107

108+
// check to see that the first entity gets a HIT when called the second time
105109
$request = $this->prepareRequest($queryCmsPage100);
106110
$response = $this->graphqlController->dispatch($request);
107111
$this->assertEquals(
@@ -113,6 +117,7 @@ public function testToCheckCmsPageRequestCacheTags(): void
113117
$expectedCacheTags = ['cms_p', 'cms_p_' .$pageId100 , 'FPC'];
114118
$this->assertEquals($expectedCacheTags, $requestedCacheTags);
115119

120+
// check to see that the second entity gets a HIT when called the second time
116121
$request = $this->prepareRequest($queryCmsPageBlank);
117122
$response = $this->graphqlController->dispatch($request);
118123
$this->assertEquals(
@@ -123,5 +128,37 @@ public function testToCheckCmsPageRequestCacheTags(): void
123128
$requestedCacheTags = explode(',', $response->getHeader('X-Magento-Tags')->getFieldValue());
124129
$expectedCacheTags = ['cms_p', 'cms_p_' .$pageIdBlank , 'FPC'];
125130
$this->assertEquals($expectedCacheTags, $requestedCacheTags);
131+
132+
133+
/** @var PageRepository $pageRepository */
134+
$pageRepository = $this->objectManager->get(PageRepository::class);
135+
136+
$page = $pageRepository->getById($pageId100);
137+
$page->setTitle('something else that causes invalidation');
138+
$pageRepository->save($page);
139+
140+
// check to see that the first entity gets a MISS and it was invalidated
141+
$request = $this->prepareRequest($queryCmsPage100);
142+
$response = $this->graphqlController->dispatch($request);
143+
$this->assertEquals(
144+
'MISS',
145+
$response->getHeader('X-Magento-Cache-Debug')->getFieldValue(),
146+
"expected MISS on page page100 id {$queryCmsPage100}"
147+
);
148+
$requestedCacheTags = explode(',', $response->getHeader('X-Magento-Tags')->getFieldValue());
149+
$expectedCacheTags = ['cms_p', 'cms_p_' .$pageId100 , 'FPC'];
150+
$this->assertEquals($expectedCacheTags, $requestedCacheTags);
151+
152+
// check to see that the first entity gets a HIT when called the second time
153+
$request = $this->prepareRequest($queryCmsPage100);
154+
$response = $this->graphqlController->dispatch($request);
155+
$this->assertEquals(
156+
'HIT',
157+
$response->getHeader('X-Magento-Cache-Debug')->getFieldValue(),
158+
"expected MISS on page page100 id {$queryCmsPage100}"
159+
);
160+
$requestedCacheTags = explode(',', $response->getHeader('X-Magento-Tags')->getFieldValue());
161+
$expectedCacheTags = ['cms_p', 'cms_p_' .$pageId100 , 'FPC'];
162+
$this->assertEquals($expectedCacheTags, $requestedCacheTags);
126163
}
127164
}

dev/tests/integration/testsuite/Magento/GraphQlCache/Controller/UrlRewrite/CategoryUrlResolverCacheTest.php

Lines changed: 116 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
use Magento\GraphQl\Controller\GraphQl;
1313
use Magento\GraphQlCache\Controller\AbstractGraphqlCacheTest;
1414
use Magento\UrlRewrite\Model\UrlFinderInterface;
15+
use Magento\Cms\Api\Data\PageInterface;
16+
use Magento\Cms\Api\GetPageByIdentifierInterface;
1517

1618
/**
1719
* Test caching works for categoryUrlResolver
@@ -26,6 +28,7 @@ class CategoryUrlResolverCacheTest extends AbstractGraphqlCacheTest
2628
* @var GraphQl
2729
*/
2830
private $graphqlController;
31+
2932
/**
3033
* @inheritdoc
3134
*/
@@ -39,10 +42,12 @@ protected function setUp(): void
3942
* Tests that X-Magento-tags and cache debug headers are correct for category urlResolver
4043
*
4144
* @magentoDataFixture Magento/CatalogUrlRewrite/_files/product_with_category.php
45+
* @magentoDataFixture Magento/Cms/_files/pages.php
4246
*/
4347
public function testCategoryUrlResolverRequestHasCorrectTags()
4448
{
4549
$categoryUrlKey = 'cat-1.html';
50+
$productUrlKey = 'p002.html';
4651
$productSku = 'p002';
4752
/** @var ProductRepositoryInterface $productRepository */
4853
$productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
@@ -59,7 +64,7 @@ public function testCategoryUrlResolverRequestHasCorrectTags()
5964
]
6065
);
6166
$categoryId = $actualUrls->getEntityId();
62-
$query
67+
$categoryQuery
6368
= <<<QUERY
6469
{
6570
urlResolver(url:"{$categoryUrlKey}")
@@ -71,13 +76,121 @@ public function testCategoryUrlResolverRequestHasCorrectTags()
7176
}
7277
}
7378
QUERY;
74-
$request = $this->prepareRequest($query);
75-
/** @var \Magento\Framework\App\Response\Http $response */
79+
80+
$productQuery = <<<QUERY
81+
{
82+
urlResolver(url:"{$productUrlKey}")
83+
{
84+
id
85+
relative_url
86+
canonical_url
87+
type
88+
}
89+
}
90+
QUERY;
91+
92+
/** @var GetPageByIdentifierInterface $page */
93+
$page = $this->objectManager->get(GetPageByIdentifierInterface::class);
94+
/** @var PageInterface $cmsPage */
95+
$cmsPage = $page->execute('page100', 0);
96+
$cmsPageId = $cmsPage->getId();
97+
$requestPath = $cmsPage->getIdentifier();
98+
$pageQuery
99+
= <<<QUERY
100+
{
101+
urlResolver(url:"{$requestPath}")
102+
{
103+
id
104+
relative_url
105+
canonical_url
106+
type
107+
}
108+
}
109+
QUERY;
110+
// query category for MISS
111+
$request = $this->prepareRequest($categoryQuery);
112+
$response = $this->graphqlController->dispatch($request);
113+
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
114+
$expectedCacheTags = ['cat_c','cat_c_' . $categoryId, 'FPC'];
115+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
116+
$actualCacheTags = explode(',', $rawActualCacheTags);
117+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
118+
119+
// query product for MISS
120+
$request = $this->prepareRequest($productQuery);
121+
$response = $this->graphqlController->dispatch($request);
122+
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
123+
$expectedCacheTags = ['cat_p', 'cat_p_' . $product->getId(), 'FPC'];
124+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
125+
$actualCacheTags = explode(',', $rawActualCacheTags);
126+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
127+
128+
// query page for MISS
129+
$request = $this->prepareRequest($pageQuery);
130+
$response = $this->graphqlController->dispatch($request);
131+
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
132+
$expectedCacheTags = ['cms_p','cms_p_' . $cmsPageId,'FPC'];
133+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
134+
$actualCacheTags = explode(',', $rawActualCacheTags);
135+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
136+
137+
// query category for HIT
138+
$request = $this->prepareRequest($categoryQuery);
139+
$response = $this->graphqlController->dispatch($request);
140+
$this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
141+
$expectedCacheTags = ['cat_c','cat_c_' . $categoryId, 'FPC'];
142+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
143+
$actualCacheTags = explode(',', $rawActualCacheTags);
144+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
145+
146+
// query product for HIT
147+
$request = $this->prepareRequest($productQuery);
148+
$response = $this->graphqlController->dispatch($request);
149+
$this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
150+
$expectedCacheTags = ['cat_p', 'cat_p_' . $product->getId(), 'FPC'];
151+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
152+
$actualCacheTags = explode(',', $rawActualCacheTags);
153+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
154+
155+
// query product for HIT
156+
$request = $this->prepareRequest($pageQuery);
157+
$response = $this->graphqlController->dispatch($request);
158+
$this->assertEquals('HIT', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
159+
$expectedCacheTags = ['cms_p','cms_p_' . $cmsPageId,'FPC'];
160+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
161+
$actualCacheTags = explode(',', $rawActualCacheTags);
162+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
163+
164+
$product->setUrlKey('something-else-that-invalidates-the-cache');
165+
$productRepository->save($product);
166+
$productQuery = <<<QUERY
167+
{
168+
urlResolver(url:"something-else-that-invalidates-the-cache.html")
169+
{
170+
id
171+
relative_url
172+
canonical_url
173+
type
174+
}
175+
}
176+
QUERY;
177+
178+
// query category for MISS
179+
$request = $this->prepareRequest($categoryQuery);
76180
$response = $this->graphqlController->dispatch($request);
77181
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
78182
$expectedCacheTags = ['cat_c','cat_c_' . $categoryId, 'FPC'];
79183
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
80184
$actualCacheTags = explode(',', $rawActualCacheTags);
81185
$this->assertEquals($expectedCacheTags, $actualCacheTags);
186+
187+
// query product for HIT
188+
$request = $this->prepareRequest($productQuery);
189+
$response = $this->graphqlController->dispatch($request);
190+
$this->assertEquals('MISS', $response->getHeader('X-Magento-Cache-Debug')->getFieldValue());
191+
$expectedCacheTags = ['cat_p', 'cat_p_' . $product->getId(), 'FPC'];
192+
$rawActualCacheTags = $response->getHeader('X-Magento-Tags')->getFieldValue();
193+
$actualCacheTags = explode(',', $rawActualCacheTags);
194+
$this->assertEquals($expectedCacheTags, $actualCacheTags);
82195
}
83196
}

0 commit comments

Comments
 (0)