3 namespace Drupal\views\Tests;
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;
11 trait AssertViewsCacheTagsTrait {
13 use AssertPageCacheContextsAndTagsTrait;
16 * Asserts a view's result & render cache items' cache tags.
18 * This methods uses a full view object in order to render the view.
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.
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');
40 $build = $view->buildRenderable();
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);
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);
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');
66 // Ensure that the views query is built.
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);
78 $this->assertFalse($results_cache_item, 'Results cache item not found.');
81 $this->pass('Checking Views render cache item cache tags.');
83 $original['#cache'] += ['contexts' => []];
84 $original['#cache']['contexts'] = Cache::mergeContexts($original['#cache']['contexts'], $this->container->getParameter('renderer.config')['required_cache_contexts']);
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);
95 $this->assertFalse($render_cache_item, 'Render cache item not found.');
101 $request_stack->pop();
107 * Asserts a view's result & render cache items' cache tags.
109 * This method starts with a pre bubbling basic render array.
111 * @param \Drupal\views\ViewExecutable $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.
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);
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');
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);
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);
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']);
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);
157 $this->assertFalse($render_cache_item, 'Render cache item not found.');