1d78204db9a93022e97ef1555806bc8c6dbaccc7
[yaffs-website] / web / core / modules / views / tests / src / Functional / Plugin / CacheTagTest.php
1 <?php
2
3 namespace Drupal\Tests\views\Functional\Plugin;
4
5 use Drupal\Core\Cache\Cache;
6 use Drupal\Tests\views\Functional\ViewTestBase;
7 use Drupal\views\ViewExecutable;
8 use Drupal\views\Views;
9
10 /**
11  * Tests tag cache plugin.
12  *
13  * @group views
14  * @see \Drupal\views\Plugin\views\cache\Tag
15  */
16 class CacheTagTest extends ViewTestBase {
17
18   /**
19    * Views used by this test.
20    *
21    * @var array
22    */
23   public static $testViews = ['test_tag_cache'];
24
25   /**
26    * Views used by this test.
27    *
28    * @var array
29    */
30   public static $modules = ['node'];
31
32   /**
33    * The node storage.
34    *
35    * @var \Drupal\node\NodeStorage
36    */
37   protected $nodeStorage;
38
39   /**
40    * The node view builder.
41    *
42    * @var \Drupal\node\NodeViewBuilder
43    */
44   protected $nodeViewBuilder;
45
46   /**
47    * The user view builder.
48    *
49    * @var \Drupal\Core\Entity\EntityViewBuilder
50    */
51   protected $userViewBuilder;
52
53   /**
54    * An array of page nodes.
55    *
56    * @var \Drupal\node\NodeInterface[]
57    */
58   protected $pages;
59
60   /**
61    * An article node.
62    *
63    * @var \Drupal\node\NodeInterface
64    */
65   protected $article;
66
67   /**
68    * A test user.
69    *
70    * @var \Drupal\user\UserInterface
71    */
72   protected $user;
73
74   protected function setUp($import_test_views = TRUE) {
75     parent::setUp($import_test_views);
76
77     $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
78     $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
79
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');
83
84     for ($i = 1; $i <= 5; $i++) {
85       $this->pages[] = $this->drupalCreateNode(['title' => "Test $i", 'type' => 'page']);
86     }
87     $this->article = $this->drupalCreateNode(['title' => "Test article", 'type' => 'article']);
88     $this->user = $this->drupalCreateUser();
89
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');
93   }
94
95   /**
96    * Gets the render cache for a given view.
97    *
98    * @param \Drupal\views\ViewExecutable $view
99    *   The view.
100    *
101    * @return array|false
102    *   The render cache result or FALSE if not existent.
103    */
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']);
110
111     return $render_cache->get($build);
112   }
113
114   /**
115    * Tests the tag cache plugin.
116    */
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);
123
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.');
128
129     $view->storage->save();
130
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.');
133
134     $view->destroy();
135     $build = $view->buildRenderable();
136     $renderer->renderPlain($build);
137
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.');
142
143     $this->nodeViewBuilder->resetCache($this->pages);
144
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.');
147
148     $view->destroy();
149     $build = $view->buildRenderable();
150     $renderer->renderPlain($build);
151
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.');
156
157     $node = reset($this->pages);
158     $node->save();
159
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.');
162
163     $view->destroy();
164     $build = $view->buildRenderable();
165     $renderer->renderPlain($build);
166
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.');
171
172     $this->article->save();
173
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.');
176
177     $view->destroy();
178     $build = $view->buildRenderable();
179     $renderer->renderPlain($build);
180
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.');
186
187     $this->userViewBuilder->resetCache([$this->user]);
188
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.');
192
193     $view->destroy();
194     // Invalidate the views cache tags in order to invalidate the render
195     // caching.
196     \Drupal::service('cache_tags.invalidator')->invalidateTags($view->storage->getCacheTagsToInvalidate());
197     $build = $view->buildRenderable();
198     $renderer->renderPlain($build);
199
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.');
204
205     $cache_plugin->cacheFlush();
206
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.');
210   }
211
212 }