Upgraded drupal core with security updates
[yaffs-website] / web / core / modules / views / src / Tests / AssertViewsCacheTagsTrait.php
1 <?php
2
3 namespace Drupal\views\Tests;
4
5 use Drupal\Core\Cache\Cache;
6 use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
7 use Drupal\views\Plugin\views\display\DisplayPluginBase;
8 use Drupal\views\ViewExecutable;
9 use Symfony\Component\HttpFoundation\Request;
10
11 trait AssertViewsCacheTagsTrait {
12
13   use AssertPageCacheContextsAndTagsTrait;
14
15   /**
16    * Asserts a view's result & render cache items' cache tags.
17    *
18    * This methods uses a full view object in order to render the view.
19    *
20    * @param \Drupal\views\ViewExecutable $view
21    *   The view to test, must have caching enabled.
22    * @param null|string[] $expected_results_cache
23    *   NULL when expecting no results cache item, a set of cache tags expected
24    *   to be set on the results cache item otherwise.
25    * @param bool $views_caching_is_enabled
26    *   Whether to expect an output cache item. If TRUE, the cache tags must
27    *   match those in $expected_render_array_cache_tags.
28    * @param string[] $expected_render_array_cache_tags
29    *   A set of cache tags expected to be set on the built view's render array.
30    *
31    * @return array
32    *   The render array.
33    */
34   protected function assertViewsCacheTags(ViewExecutable $view, $expected_results_cache, $views_caching_is_enabled, array $expected_render_array_cache_tags) {
35     /** @var \Drupal\Core\Render\RendererInterface $renderer */
36     $renderer = \Drupal::service('renderer');
37     /** @var \Drupal\Core\Render\RenderCacheInterface $render_cache */
38     $render_cache = \Drupal::service('render_cache');
39
40     $build = $view->buildRenderable();
41     $original = $build;
42
43     // Ensure the current request is a GET request so that render caching is
44     // active for direct rendering of views, just like for actual requests.
45     /** @var \Symfony\Component\HttpFoundation\RequestStack $request_stack */
46     $request_stack = \Drupal::service('request_stack');
47     $request = new Request();
48     $request->server->set('REQUEST_TIME', REQUEST_TIME);
49     $view->setRequest($request);
50     $request_stack->push($request);
51     $renderer->renderRoot($build);
52
53     // Render array cache tags.
54     $this->pass('Checking render array cache tags.');
55     sort($expected_render_array_cache_tags);
56     $this->assertEqual($build['#cache']['tags'], $expected_render_array_cache_tags);
57     $this->debugCacheTags($build['#cache']['tags'], $expected_render_array_cache_tags);
58
59     if ($views_caching_is_enabled) {
60       $this->pass('Checking Views results cache item cache tags.');
61       /** @var \Drupal\views\Plugin\views\cache\CachePluginBase $cache_plugin */
62       $cache_plugin = $view->display_handler->getPlugin('cache');
63
64       // Results cache.
65
66       // Ensure that the views query is built.
67       $view->build();
68       $results_cache_item = \Drupal::cache('data')->get($cache_plugin->generateResultsKey());
69       if (is_array($expected_results_cache)) {
70         $this->assertTrue($results_cache_item, 'Results cache item found.');
71         if ($results_cache_item) {
72           sort($expected_results_cache);
73           $this->assertEqual($results_cache_item->tags, $expected_results_cache);
74           $this->debugCacheTags($results_cache_item->tags, $expected_results_cache);
75         }
76       }
77       else {
78         $this->assertFalse($results_cache_item, 'Results cache item not found.');
79       }
80
81       $this->pass('Checking Views render cache item cache tags.');
82
83       $original['#cache'] += ['contexts' => []];
84       $original['#cache']['contexts'] = Cache::mergeContexts($original['#cache']['contexts'], $this->container->getParameter('renderer.config')['required_cache_contexts']);
85
86       $render_cache_item = $render_cache->get($original);
87       if ($views_caching_is_enabled === TRUE) {
88         $this->assertTrue(!empty($render_cache_item), 'Render cache item found.');
89         if ($render_cache_item) {
90           $this->assertEqual($render_cache_item['#cache']['tags'], $expected_render_array_cache_tags);
91           $this->debugCacheTags($render_cache_item['#cache']['tags'], $expected_render_array_cache_tags);
92         }
93       }
94       else {
95         $this->assertFalse($render_cache_item, 'Render cache item not found.');
96       }
97     }
98
99     $view->destroy();
100
101     $request_stack->pop();
102
103     return $build;
104   }
105
106   /**
107    * Asserts a view's result & render cache items' cache tags.
108    *
109    * This method starts with a pre bubbling basic render array.
110    *
111    * @param \Drupal\views\ViewExecutable $view
112    *   The view.
113    * @param string[] $expected_render_array_cache_tags
114    *   The expected render cache tags.
115    * @param bool $views_caching_is_enabled
116    *   Defines whether views output / render caching is enabled.
117    *
118    * @return array
119    *   The render array.
120    */
121   protected function assertViewsCacheTagsFromStaticRenderArray(ViewExecutable $view, array $expected_render_array_cache_tags, $views_caching_is_enabled) {
122     $original = $build = DisplayPluginBase::buildBasicRenderable($view->id(), $view->current_display ?: 'default', $view->args);
123
124     /** @var \Drupal\Core\Render\RendererInterface $renderer */
125     $renderer = \Drupal::service('renderer');
126     /** @var \Drupal\Core\Render\RenderCacheInterface $render_cache */
127     $render_cache = \Drupal::service('render_cache');
128
129     // Ensure the current request is a GET request so that render caching is
130     // active for direct rendering of views, just like for actual requests.
131     /** @var \Symfony\Component\HttpFoundation\RequestStack $request_stack */
132     $request_stack = \Drupal::service('request_stack');
133     $request = new Request();
134     $request->server->set('REQUEST_TIME', REQUEST_TIME);
135     $request_stack->push($request);
136     $renderer->renderRoot($build);
137
138     // Render array cache tags.
139     $this->pass('Checking render array cache tags.');
140     sort($expected_render_array_cache_tags);
141     $this->assertEqual($build['#cache']['tags'], $expected_render_array_cache_tags);
142     $this->debugCacheTags($build['#cache']['tags'], $expected_render_array_cache_tags);
143
144     $this->pass('Checking Views render cache item cache tags.');
145     $original['#cache'] += ['contexts' => []];
146     $original['#cache']['contexts'] = Cache::mergeContexts($original['#cache']['contexts'], $this->container->getParameter('renderer.config')['required_cache_contexts']);
147
148     $render_cache_item = $render_cache->get($original);
149     if ($views_caching_is_enabled) {
150       $this->assertTrue(!empty($render_cache_item), 'Render cache item found.');
151       if ($render_cache_item) {
152         $this->assertEqual($render_cache_item['#cache']['tags'], $expected_render_array_cache_tags);
153         $this->debugCacheTags($render_cache_item['#cache']['tags'], $expected_render_array_cache_tags);
154       }
155     }
156     else {
157       $this->assertFalse($render_cache_item, 'Render cache item not found.');
158     }
159
160     return $build;
161   }
162
163 }