Version 1
[yaffs-website] / web / core / modules / views / tests / src / Functional / SearchIntegrationTest.php
diff --git a/web/core/modules/views/tests/src/Functional/SearchIntegrationTest.php b/web/core/modules/views/tests/src/Functional/SearchIntegrationTest.php
new file mode 100644 (file)
index 0000000..f4daac7
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+
+namespace Drupal\Tests\views\Functional;
+
+use Drupal\Component\Utility\SafeMarkup;
+use Drupal\Tests\Traits\Core\CronRunTrait;
+
+/**
+ * Tests search integration filters.
+ *
+ * @group views
+ */
+class SearchIntegrationTest extends ViewTestBase {
+
+  use CronRunTrait;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['node', 'search'];
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_search'];
+
+  /**
+   * Tests search integration.
+   */
+  public function testSearchIntegration() {
+    // Create a content type.
+    $type = $this->drupalCreateContentType();
+
+    // Add three nodes, one containing the word "pizza", one containing
+    // "sandwich", and one containing "cola is good with pizza". Make the
+    // second node link to the first.
+    $node['title'] = 'pizza';
+    $node['body'] = [['value' => 'pizza']];
+    $node['type'] = $type->id();
+    $this->drupalCreateNode($node);
+
+    $this->drupalGet('node/1');
+    $node_url = $this->getUrl();
+
+    $node['title'] = 'sandwich';
+    $node['body'] = [['value' => 'sandwich with a <a href="' . $node_url . '">link to first node</a>']];
+    $this->drupalCreateNode($node);
+
+    $node['title'] = 'cola';
+    $node['body'] = [['value' => 'cola is good with pizza']];
+    $node['type'] = $type->id();
+    $this->drupalCreateNode($node);
+
+    // Run cron so that the search index tables are updated.
+    $this->cronRun();
+
+    // Test the various views filters by visiting their pages.
+    // These are in the test view 'test_search', and they just display the
+    // titles of the nodes in the result, as links.
+
+    // Page with a keyword filter of 'pizza'.
+    $this->drupalGet('test-filter');
+    $this->assertLink('pizza');
+    $this->assertNoLink('sandwich');
+    $this->assertLink('cola');
+
+    // Page with a keyword argument, various argument values.
+    // Verify that the correct nodes are shown, and only once.
+    $this->drupalGet('test-arg/pizza');
+    $this->assertOneLink('pizza');
+    $this->assertNoLink('sandwich');
+    $this->assertOneLink('cola');
+
+    $this->drupalGet('test-arg/sandwich');
+    $this->assertNoLink('pizza');
+    $this->assertOneLink('sandwich');
+    $this->assertNoLink('cola');
+
+    $this->drupalGet('test-arg/pizza OR sandwich');
+    $this->assertOneLink('pizza');
+    $this->assertOneLink('sandwich');
+    $this->assertOneLink('cola');
+
+    $this->drupalGet('test-arg/pizza sandwich OR cola');
+    $this->assertNoLink('pizza');
+    $this->assertNoLink('sandwich');
+    $this->assertOneLink('cola');
+
+    $this->drupalGet('test-arg/cola pizza');
+    $this->assertNoLink('pizza');
+    $this->assertNoLink('sandwich');
+    $this->assertOneLink('cola');
+
+    $this->drupalGet('test-arg/"cola is good"');
+    $this->assertNoLink('pizza');
+    $this->assertNoLink('sandwich');
+    $this->assertOneLink('cola');
+
+    // Test sorting.
+    $node = [
+      'title' => "Drupal's search rocks.",
+      'type' => $type->id(),
+    ];
+    $this->drupalCreateNode($node);
+    $node['title'] = "Drupal's search rocks <em>really</em> rocks!";
+    $this->drupalCreateNode($node);
+    $this->cronRun();
+    $this->drupalGet('test-arg/rocks');
+    $xpath = '//div[@class="views-row"]//a';
+    /** @var \Behat\Mink\Element\NodeElement[] $results */
+    $results = $this->xpath($xpath);
+    $this->assertEqual($results[0]->getText(), "Drupal's search rocks <em>really</em> rocks!");
+    $this->assertEqual($results[1]->getText(), "Drupal's search rocks.");
+    $this->assertEscaped("Drupal's search rocks <em>really</em> rocks!");
+
+    // Test sorting with another set of titles.
+    $node = [
+      'title' => "Testing one two two two",
+      'type' => $type->id(),
+    ];
+    $this->drupalCreateNode($node);
+    $node['title'] = "Testing one one one";
+    $this->drupalCreateNode($node);
+    $this->cronRun();
+    $this->drupalGet('test-arg/one');
+    $xpath = '//div[@class="views-row"]//a';
+    /** @var \SimpleXMLElement[] $results */
+    $results = $this->xpath($xpath);
+    $this->assertEqual($results[0]->getText(), "Testing one one one");
+    $this->assertEqual($results[1]->getText(), "Testing one two two two");
+  }
+
+  /**
+   * Asserts that exactly one link exists with the given text.
+   *
+   * @param string $label
+   *   Link label to assert.
+   *
+   * @return bool
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertOneLink($label) {
+    $links = $this->xpath('//a[normalize-space(text())=:label]', [':label' => $label]);
+    $message = SafeMarkup::format('Link with label %label found once.', ['%label' => $label]);
+    return $this->assert(isset($links[0]) && !isset($links[1]), $message);
+  }
+
+}