X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fsearch%2Ftests%2Fsrc%2FFunctional%2FSearchPageCacheTagsTest.php;fp=web%2Fcore%2Fmodules%2Fsearch%2Ftests%2Fsrc%2FFunctional%2FSearchPageCacheTagsTest.php;h=d11304bb4b66780b29d8528419e128255eb34176;hp=0000000000000000000000000000000000000000;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/web/core/modules/search/tests/src/Functional/SearchPageCacheTagsTest.php b/web/core/modules/search/tests/src/Functional/SearchPageCacheTagsTest.php new file mode 100644 index 000000000..d11304bb4 --- /dev/null +++ b/web/core/modules/search/tests/src/Functional/SearchPageCacheTagsTest.php @@ -0,0 +1,226 @@ +drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']); + + // Create user. + $this->searchingUser = $this->drupalCreateUser(['search content', 'access user profiles']); + + // Create a node and update the search index. + $this->node = $this->drupalCreateNode(['title' => 'bike shed shop']); + $this->node->setOwner($this->searchingUser); + $this->node->save(); + $this->container->get('plugin.manager.search')->createInstance('node_search')->updateIndex(); + search_update_totals(); + } + + /** + * Tests the presence of the expected cache tag in various situations. + */ + public function testSearchText() { + $this->drupalLogin($this->searchingUser); + + // Initial page for searching nodes. + $this->drupalGet('search/node'); + $this->assertCacheTag('config:search.page.node_search'); + $this->assertCacheTag('search_index:node_search'); + $this->assertCacheTag('node_list'); + + // Node search results. + $edit = []; + $edit['keys'] = 'bike shed'; + $this->drupalPostForm('search/node', $edit, t('Search')); + $this->assertText('bike shed shop'); + $this->assertCacheTag('config:search.page.node_search'); + $this->assertCacheTag('search_index'); + $this->assertCacheTag('search_index:node_search'); + $this->assertCacheTag('node:1'); + $this->assertCacheTag('user:2'); + $this->assertCacheTag('rendered'); + $this->assertCacheTag('http_response'); + $this->assertCacheTag('node_list'); + + // Updating a node should invalidate the search plugin's index cache tag. + $this->node->title = 'bike shop'; + $this->node->save(); + $this->drupalPostForm('search/node', $edit, t('Search')); + $this->assertText('bike shop'); + $this->assertCacheTag('config:search.page.node_search'); + $this->assertCacheTag('search_index'); + $this->assertCacheTag('search_index:node_search'); + $this->assertCacheTag('node:1'); + $this->assertCacheTag('user:2'); + $this->assertCacheTag('rendered'); + $this->assertCacheTag('http_response'); + $this->assertCacheTag('node_list'); + + // Deleting a node should invalidate the search plugin's index cache tag. + $this->node->delete(); + $this->drupalPostForm('search/node', $edit, t('Search')); + $this->assertText('Your search yielded no results.'); + $this->assertCacheTag('config:search.page.node_search'); + $this->assertCacheTag('search_index'); + $this->assertCacheTag('search_index:node_search'); + $this->assertCacheTag('node_list'); + + // Initial page for searching users. + $this->drupalGet('search/user'); + $this->assertCacheTag('config:search.page.user_search'); + $this->assertCacheTag('user_list'); + $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index'); + $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index:user_search'); + + // User search results. + $edit['keys'] = $this->searchingUser->getUsername(); + $this->drupalPostForm('search/user', $edit, t('Search')); + $this->assertCacheTag('config:search.page.user_search'); + $this->assertCacheTag('user_list'); + $this->assertCacheTag('user:2'); + $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index'); + $this->assertSession()->responseHeaderNotContains('X-Drupal-Cache-Tags', 'search_index:user_search'); + } + + /** + * Tests the presence of expected cache tags with referenced entities. + */ + public function testSearchTagsBubbling() { + + // Install field UI and entity reference modules. + $this->container->get('module_installer')->install(['field_ui', 'entity_reference']); + $this->resetAll(); + + // Creates a new content type that will have an entity reference. + $type_name = 'entity_reference_test'; + $type = $this->drupalCreateContentType(['name' => $type_name, 'type' => $type_name]); + + $bundle_path = 'admin/structure/types/manage/' . $type->id(); + + // Create test user. + $admin_user = $this->drupalCreateUser([ + 'access content', + 'create ' . $type_name . ' content', + 'administer node fields', + 'administer node display', + + ]); + $this->drupalLogin($admin_user); + + // First step: 'Add new field' on the 'Manage fields' page. + $this->drupalGet($bundle_path . '/fields/add-field'); + $this->drupalPostForm(NULL, [ + 'label' => 'Test label', + 'field_name' => 'test__ref', + 'new_storage_type' => 'entity_reference', + ], t('Save and continue')); + + // Second step: 'Field settings' form. + $this->drupalPostForm(NULL, [], t('Save field settings')); + + // Create a new node of our newly created node type and fill in the entity + // reference field. + $edit = [ + 'title[0][value]' => 'Llama shop', + 'field_test__ref[0][target_id]' => $this->node->getTitle(), + ]; + $this->drupalPostForm('node/add/' . $type->id(), $edit, t('Save')); + + // Test that the value of the entity reference field is shown. + $this->drupalGet('node/2'); + $this->assertText('bike shed shop'); + + // Refresh the search index. + $this->container->get('plugin.manager.search')->createInstance('node_search')->updateIndex(); + search_update_totals(); + + // Log in with searching user again. + $this->drupalLogin($this->searchingUser); + + // Default search cache tags. + $default_search_tags = [ + 'config:search.page.node_search', + 'search_index', + 'search_index:node_search', + 'http_response', + 'rendered', + 'node_list', + ]; + + // Node search results for shop, should return node:1 (bike shed shop) and + // node:2 (Llama shop). The related authors cache tags should be visible as + // well. + $edit = []; + $edit['keys'] = 'shop'; + $this->drupalPostForm('search/node', $edit, t('Search')); + $this->assertText('bike shed shop'); + $this->assertText('Llama shop'); + $expected_cache_tags = Cache::mergeTags($default_search_tags, [ + 'node:1', + 'user:2', + 'node:2', + 'user:3', + 'node_view', + 'config:filter.format.plain_text', + ]); + $this->assertCacheTags($expected_cache_tags); + + // Only get the new node in the search results, should result in node:1, + // node:2 and user:3 as cache tags even though only node:1 is shown. This is + // because node:2 is reference in node:1 as an entity reference. + $edit = []; + $edit['keys'] = 'Llama'; + $this->drupalPostForm('search/node', $edit, t('Search')); + $this->assertText('Llama shop'); + $expected_cache_tags = Cache::mergeTags($default_search_tags, [ + 'node:1', + 'node:2', + 'user:3', + 'node_view', + ]); + $this->assertCacheTags($expected_cache_tags); + } + +}