Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / search / tests / src / Functional / SearchNodeUpdateAndDeletionTest.php
diff --git a/web/core/modules/search/tests/src/Functional/SearchNodeUpdateAndDeletionTest.php b/web/core/modules/search/tests/src/Functional/SearchNodeUpdateAndDeletionTest.php
new file mode 100644 (file)
index 0000000..9615cfb
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+namespace Drupal\Tests\search\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Tests search index is updated properly when nodes are removed or updated.
+ *
+ * @group search
+ */
+class SearchNodeUpdateAndDeletionTest extends BrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = ['node', 'search'];
+
+  /**
+   * A user with permission to access and search content.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  public $testUser;
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
+
+    // Create a test user and log in.
+    $this->testUser = $this->drupalCreateUser(['access content', 'search content']);
+    $this->drupalLogin($this->testUser);
+  }
+
+  /**
+   * Tests that the search index info is properly updated when a node changes.
+   */
+  public function testSearchIndexUpdateOnNodeChange() {
+    // Create a node.
+    $node = $this->drupalCreateNode([
+      'title' => 'Someone who says Ni!',
+      'body' => [['value' => "We are the knights who say Ni!"]],
+      'type' => 'page',
+    ]);
+
+    $node_search_plugin = $this->container->get('plugin.manager.search')->createInstance('node_search');
+    // Update the search index.
+    $node_search_plugin->updateIndex();
+    search_update_totals();
+
+    // Search the node to verify it appears in search results
+    $edit = ['keys' => 'knights'];
+    $this->drupalPostForm('search/node', $edit, t('Search'));
+    $this->assertText($node->label());
+
+    // Update the node
+    $node->body->value = "We want a shrubbery!";
+    $node->save();
+
+    // Run indexer again
+    $node_search_plugin->updateIndex();
+    search_update_totals();
+
+    // Search again to verify the new text appears in test results.
+    $edit = ['keys' => 'shrubbery'];
+    $this->drupalPostForm('search/node', $edit, t('Search'));
+    $this->assertText($node->label());
+  }
+
+  /**
+   * Tests that the search index info is updated when a node is deleted.
+   */
+  public function testSearchIndexUpdateOnNodeDeletion() {
+    // Create a node.
+    $node = $this->drupalCreateNode([
+      'title' => 'No dragons here',
+      'body' => [['value' => 'Again: No dragons here']],
+      'type' => 'page',
+    ]);
+
+    $node_search_plugin = $this->container->get('plugin.manager.search')->createInstance('node_search');
+    // Update the search index.
+    $node_search_plugin->updateIndex();
+    search_update_totals();
+
+    // Search the node to verify it appears in search results
+    $edit = ['keys' => 'dragons'];
+    $this->drupalPostForm('search/node', $edit, t('Search'));
+    $this->assertText($node->label());
+
+    // Get the node info from the search index tables.
+    $search_index_dataset = db_query("SELECT sid FROM {search_index} WHERE type = 'node_search' AND  word = :word", [':word' => 'dragons'])
+      ->fetchField();
+    $this->assertNotEqual($search_index_dataset, FALSE, t('Node info found on the search_index'));
+
+    // Delete the node.
+    $node->delete();
+
+    // Check if the node info is gone from the search table.
+    $search_index_dataset = db_query("SELECT sid FROM {search_index} WHERE type = 'node_search' AND  word = :word", [':word' => 'dragons'])
+      ->fetchField();
+    $this->assertFalse($search_index_dataset, t('Node info successfully removed from search_index'));
+
+    // Search again to verify the node doesn't appear anymore.
+    $this->drupalPostForm('search/node', $edit, t('Search'));
+    $this->assertNoText($node->label());
+  }
+
+}