3 namespace Drupal\Tests\search\Functional;
5 use Drupal\Core\Cache\Cache;
6 use Drupal\Tests\BrowserTestBase;
7 use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
10 * Tests the search_page entity cache tags on the search results pages.
14 class SearchPageCacheTagsTest extends BrowserTestBase {
16 use AssertPageCacheContextsAndTagsTrait;
21 protected static $modules = ['node', 'search'];
26 protected $dumpHeaders = TRUE;
29 * A user with permission to search content.
31 * @var \Drupal\user\UserInterface
33 protected $searchingUser;
36 * A node that is indexed by the search module.
38 * @var \Drupal\node\NodeInterface
45 protected function setUp() {
48 $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
51 $this->searchingUser = $this->drupalCreateUser(['search content', 'access user profiles']);
53 // Create a node and update the search index.
54 $this->node = $this->drupalCreateNode(['title' => 'bike shed shop']);
55 $this->node->setOwner($this->searchingUser);
57 $this->container->get('plugin.manager.search')->createInstance('node_search')->updateIndex();
58 search_update_totals();
62 * Tests the presence of the expected cache tag in various situations.
64 public function testSearchText() {
65 $this->drupalLogin($this->searchingUser);
67 // Initial page for searching nodes.
68 $this->drupalGet('search/node');
69 $this->assertCacheTag('config:search.page.node_search');
70 $this->assertCacheTag('search_index:node_search');
71 $this->assertCacheTag('node_list');
73 // Node search results.
75 $edit['keys'] = 'bike shed';
76 $this->drupalPostForm('search/node', $edit, t('Search'));
77 $this->assertText('bike shed shop');
78 $this->assertCacheTag('config:search.page.node_search');
79 $this->assertCacheTag('search_index');
80 $this->assertCacheTag('search_index:node_search');
81 $this->assertCacheTag('node:1');
82 $this->assertCacheTag('user:2');
83 $this->assertCacheTag('rendered');
84 $this->assertCacheTag('http_response');
85 $this->assertCacheTag('node_list');
87 // Updating a node should invalidate the search plugin's index cache tag.
88 $this->node->title = 'bike shop';
90 $this->drupalPostForm('search/node', $edit, t('Search'));
91 $this->assertText('bike shop');
92 $this->assertCacheTag('config:search.page.node_search');
93 $this->assertCacheTag('search_index');
94 $this->assertCacheTag('search_index:node_search');
95 $this->assertCacheTag('node:1');
96 $this->assertCacheTag('user:2');
97 $this->assertCacheTag('rendered');
98 $this->assertCacheTag('http_response');
99 $this->assertCacheTag('node_list');
101 // Deleting a node should invalidate the search plugin's index cache tag.
102 $this->node->delete();
103 $this->drupalPostForm('search/node', $edit, t('Search'));
104 $this->assertText('Your search yielded no results.');
105 $this->assertCacheTag('config:search.page.node_search');
106 $this->assertCacheTag('search_index');
107 $this->assertCacheTag('search_index:node_search');
108 $this->assertCacheTag('node_list');
110 // Initial page for searching users.
111 $this->drupalGet('search/user');
112 $this->assertCacheTag('config:search.page.user_search');
113 $this->assertCacheTag('user_list');
114 $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index');
115 $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index:user_search');
117 // User search results.
118 $edit['keys'] = $this->searchingUser->getUsername();
119 $this->drupalPostForm('search/user', $edit, t('Search'));
120 $this->assertCacheTag('config:search.page.user_search');
121 $this->assertCacheTag('user_list');
122 $this->assertCacheTag('user:2');
123 $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index');
124 $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index:user_search');
128 * Tests the presence of expected cache tags with referenced entities.
130 public function testSearchTagsBubbling() {
132 // Install field UI and entity reference modules.
133 $this->container->get('module_installer')->install(['field_ui', 'entity_reference']);
136 // Creates a new content type that will have an entity reference.
137 $type_name = 'entity_reference_test';
138 $type = $this->drupalCreateContentType(['name' => $type_name, 'type' => $type_name]);
140 $bundle_path = 'admin/structure/types/manage/' . $type->id();
143 $admin_user = $this->drupalCreateUser([
145 'create ' . $type_name . ' content',
146 'administer node fields',
147 'administer node display',
150 $this->drupalLogin($admin_user);
152 // First step: 'Add new field' on the 'Manage fields' page.
153 $this->drupalGet($bundle_path . '/fields/add-field');
154 $this->drupalPostForm(NULL, [
155 'label' => 'Test label',
156 'field_name' => 'test__ref',
157 'new_storage_type' => 'entity_reference',
158 ], t('Save and continue'));
160 // Second step: 'Field settings' form.
161 $this->drupalPostForm(NULL, [], t('Save field settings'));
163 // Create a new node of our newly created node type and fill in the entity
166 'title[0][value]' => 'Llama shop',
167 'field_test__ref[0][target_id]' => $this->node->getTitle(),
169 $this->drupalPostForm('node/add/' . $type->id(), $edit, t('Save'));
171 // Test that the value of the entity reference field is shown.
172 $this->drupalGet('node/2');
173 $this->assertText('bike shed shop');
175 // Refresh the search index.
176 $this->container->get('plugin.manager.search')->createInstance('node_search')->updateIndex();
177 search_update_totals();
179 // Log in with searching user again.
180 $this->drupalLogin($this->searchingUser);
182 // Default search cache tags.
183 $default_search_tags = [
184 'config:search.page.node_search',
186 'search_index:node_search',
192 // Node search results for shop, should return node:1 (bike shed shop) and
193 // node:2 (Llama shop). The related authors cache tags should be visible as
196 $edit['keys'] = 'shop';
197 $this->drupalPostForm('search/node', $edit, t('Search'));
198 $this->assertText('bike shed shop');
199 $this->assertText('Llama shop');
200 $expected_cache_tags = Cache::mergeTags($default_search_tags, [
206 'config:filter.format.plain_text',
208 $this->assertCacheTags($expected_cache_tags);
210 // Only get the new node in the search results, should result in node:1,
211 // node:2 and user:3 as cache tags even though only node:1 is shown. This is
212 // because node:2 is reference in node:1 as an entity reference.
214 $edit['keys'] = 'Llama';
215 $this->drupalPostForm('search/node', $edit, t('Search'));
216 $this->assertText('Llama shop');
217 $expected_cache_tags = Cache::mergeTags($default_search_tags, [
223 $this->assertCacheTags($expected_cache_tags);