3 namespace Drupal\Tests\views\Functional\Plugin;
5 use Drupal\Core\Cache\Cache;
6 use Drupal\Tests\views\Functional\ViewTestBase;
7 use Drupal\views\ViewExecutable;
8 use Drupal\views\Views;
11 * Tests tag cache plugin.
14 * @see \Drupal\views\Plugin\views\cache\Tag
16 class CacheTagTest extends ViewTestBase {
19 * Views used by this test.
23 public static $testViews = ['test_tag_cache'];
26 * Views used by this test.
30 public static $modules = ['node'];
35 * @var \Drupal\node\NodeStorage
37 protected $nodeStorage;
40 * The node view builder.
42 * @var \Drupal\node\NodeViewBuilder
44 protected $nodeViewBuilder;
47 * The user view builder.
49 * @var \Drupal\Core\Entity\EntityViewBuilder
51 protected $userViewBuilder;
54 * An array of page nodes.
56 * @var \Drupal\node\NodeInterface[]
63 * @var \Drupal\node\NodeInterface
70 * @var \Drupal\user\UserInterface
74 protected function setUp($import_test_views = TRUE) {
75 parent::setUp($import_test_views);
77 $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
78 $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
80 $this->nodeStorage = $this->container->get('entity.manager')->getStorage('node');
81 $this->nodeViewBuilder = $this->container->get('entity.manager')->getViewBuilder('node');
82 $this->userViewBuilder = $this->container->get('entity.manager')->getViewBuilder('user');
84 for ($i = 1; $i <= 5; $i++) {
85 $this->pages[] = $this->drupalCreateNode(['title' => "Test $i", 'type' => 'page']);
87 $this->article = $this->drupalCreateNode(['title' => "Test article", 'type' => 'article']);
88 $this->user = $this->drupalCreateUser();
90 // Mark the current request safe, in order to make render cache working, see
91 // \Drupal\Core\Render\RenderCache::get.
92 \Drupal::request()->setMethod('GET');
96 * Gets the render cache for a given view.
98 * @param \Drupal\views\ViewExecutable $view
101 * @return array|false
102 * The render cache result or FALSE if not existent.
104 protected function getRenderCache(ViewExecutable $view) {
105 /** @var \Drupal\Core\Render\RenderCacheInterface $render_cache */
106 $render_cache = \Drupal::service('render_cache');
107 $view->element = ['#cache' => []];
108 $build = $view->buildRenderable();
109 $build['#cache']['contexts'] = Cache::mergeContexts($build['#cache']['contexts'], $this->container->getParameter('renderer.config')['required_cache_contexts']);
111 return $render_cache->get($build);
115 * Tests the tag cache plugin.
117 public function testTagCaching() {
118 /** @var \Drupal\Core\Render\RendererInterface $renderer */
119 $renderer = \Drupal::service('renderer');
120 $view = Views::getView('test_tag_cache');
121 $build = $view->buildRenderable();
122 $renderer->renderPlain($build);
124 // Saving the view should invalidate the tags.
125 $cache_plugin = $view->display_handler->getPlugin('cache');
126 $this->assertTrue($cache_plugin->cacheGet('results'), 'Results cache found.');
127 $this->assertTrue($this->getRenderCache($view), 'Output cache found.');
129 $view->storage->save();
131 $this->assertFalse($cache_plugin->cacheGet('results'), 'Results cache empty after the view is saved.');
132 $this->assertFalse($this->getRenderCache($view), 'Output cache empty after the view is saved.');
135 $build = $view->buildRenderable();
136 $renderer->renderPlain($build);
138 // Test invalidating the nodes in this view invalidates the cache.
139 $cache_plugin = $view->display_handler->getPlugin('cache');
140 $this->assertTrue($cache_plugin->cacheGet('results'), 'Results cache found.');
141 $this->assertTrue($this->getRenderCache($view), 'Output cache found.');
143 $this->nodeViewBuilder->resetCache($this->pages);
145 $this->assertFalse($cache_plugin->cacheGet('results'), 'Results cache empty after resetCache is called with pages.');
146 $this->assertFalse($this->getRenderCache($view), 'Output cache empty after resetCache is called with pages.');
149 $build = $view->buildRenderable();
150 $renderer->renderPlain($build);
152 // Test saving a node in this view invalidates the cache.
153 $cache_plugin = $view->display_handler->getPlugin('cache');
154 $this->assertTrue($cache_plugin->cacheGet('results'), 'Results cache found.');
155 $this->assertTrue($this->getRenderCache($view), 'Output cache found.');
157 $node = reset($this->pages);
160 $this->assertFalse($cache_plugin->cacheGet('results'), 'Results cache empty after a page node is saved.');
161 $this->assertFalse($this->getRenderCache($view), 'Output cache empty after a page node is saved.');
164 $build = $view->buildRenderable();
165 $renderer->renderPlain($build);
167 // Test saving a node not in this view invalidates the cache too.
168 $cache_plugin = $view->display_handler->getPlugin('cache');
169 $this->assertTrue($cache_plugin->cacheGet('results'), 'Results cache found.');
170 $this->assertTrue($this->getRenderCache($view), 'Output cache found.');
172 $this->article->save();
174 $this->assertFalse($cache_plugin->cacheGet('results'), 'Results cache empty after an article node is saved.');
175 $this->assertFalse($this->getRenderCache($view), 'Output cache empty after an article node is saved.');
178 $build = $view->buildRenderable();
179 $renderer->renderPlain($build);
181 // Test that invalidating a tag for a user, does not invalidate the cache,
182 // as the user entity type will not be contained in the views cache tags.
183 $cache_plugin = $view->display_handler->getPlugin('cache');
184 $this->assertTrue($cache_plugin->cacheGet('results'), 'Results cache found.');
185 $this->assertTrue($this->getRenderCache($view), 'Output cache found.');
187 $this->userViewBuilder->resetCache([$this->user]);
189 $cache_plugin = $view->display_handler->getPlugin('cache');
190 $this->assertTrue($cache_plugin->cacheGet('results'), 'Results cache found after a user is invalidated.');
191 $this->assertTrue($this->getRenderCache($view), 'Output cache found after a user is invalidated.');
194 // Invalidate the views cache tags in order to invalidate the render
196 \Drupal::service('cache_tags.invalidator')->invalidateTags($view->storage->getCacheTagsToInvalidate());
197 $build = $view->buildRenderable();
198 $renderer->renderPlain($build);
200 // Test the cacheFlush method invalidates the cache.
201 $cache_plugin = $view->display_handler->getPlugin('cache');
202 $this->assertTrue($cache_plugin->cacheGet('results'), 'Results cache found.');
203 $this->assertTrue($this->getRenderCache($view), 'Output cache found.');
205 $cache_plugin->cacheFlush();
207 $cache_plugin = $view->display_handler->getPlugin('cache');
208 $this->assertFalse($cache_plugin->cacheGet('results'), 'Results cache empty after the cacheFlush() method is called.');
209 $this->assertFalse($this->getRenderCache($view), 'Output cache empty after the cacheFlush() method is called.');