You are here

public function SearchRankingTest::testHTMLRankings in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/search/src/Tests/SearchRankingTest.php \Drupal\search\Tests\SearchRankingTest::testHTMLRankings()

Test rankings of HTML tags.

File

core/modules/search/src/Tests/SearchRankingTest.php, line 205
Contains \Drupal\search\Tests\SearchRankingTest.

Class

SearchRankingTest
Indexes content and tests ranking factors.

Namespace

Drupal\search\Tests

Code

public function testHTMLRankings() {
  $full_html_format = entity_create('filter_format', array(
    'format' => 'full_html',
    'name' => 'Full HTML',
  ));
  $full_html_format
    ->save();

  // Test HTML tags with different weights.
  $sorted_tags = array(
    'h1',
    'h2',
    'h3',
    'h4',
    'a',
    'h5',
    'h6',
    'notag',
  );
  $shuffled_tags = $sorted_tags;

  // Shuffle tags to ensure HTML tags are ranked properly.
  shuffle($shuffled_tags);
  $settings = array(
    'type' => 'page',
    'title' => 'Simple node',
  );
  $nodes = array();
  foreach ($shuffled_tags as $tag) {
    switch ($tag) {
      case 'a':
        $settings['body'] = array(
          array(
            'value' => \Drupal::l('Drupal Rocks', new Url('<front>')),
            'format' => 'full_html',
          ),
        );
        break;
      case 'notag':
        $settings['body'] = array(
          array(
            'value' => 'Drupal Rocks',
          ),
        );
        break;
      default:
        $settings['body'] = array(
          array(
            'value' => "<{$tag}>Drupal Rocks</{$tag}>",
            'format' => 'full_html',
          ),
        );
        break;
    }
    $nodes[$tag] = $this
      ->drupalCreateNode($settings);
  }

  // Update the search index.
  $this->nodeSearch
    ->getPlugin()
    ->updateIndex();
  search_update_totals();
  $this->nodeSearch
    ->getPlugin()
    ->setSearch('rocks', array(), array());

  // Do the search and assert the results.
  $set = $this->nodeSearch
    ->getPlugin()
    ->execute();

  // Test the ranking of each tag.
  foreach ($sorted_tags as $tag_rank => $tag) {

    // Assert the results.
    if ($tag == 'notag') {
      $this
        ->assertEqual($set[$tag_rank]['node']
        ->id(), $nodes[$tag]
        ->id(), 'Search tag ranking for plain text order.');
    }
    else {
      $this
        ->assertEqual($set[$tag_rank]['node']
        ->id(), $nodes[$tag]
        ->id(), 'Search tag ranking for "&lt;' . $sorted_tags[$tag_rank] . '&gt;" order.');
    }
  }

  // Test tags with the same weight against the sorted tags.
  $unsorted_tags = array(
    'u',
    'b',
    'i',
    'strong',
    'em',
  );
  foreach ($unsorted_tags as $tag) {
    $settings['body'] = array(
      array(
        'value' => "<{$tag}>Drupal Rocks</{$tag}>",
        'format' => 'full_html',
      ),
    );
    $node = $this
      ->drupalCreateNode($settings);

    // Update the search index.
    $this->nodeSearch
      ->getPlugin()
      ->updateIndex();
    search_update_totals();
    $this->nodeSearch
      ->getPlugin()
      ->setSearch('rocks', array(), array());

    // Do the search and assert the results.
    $set = $this->nodeSearch
      ->getPlugin()
      ->execute();

    // Ranking should always be second to last.
    $set = array_slice($set, -2, 1);

    // Assert the results.
    $this
      ->assertEqual($set[0]['node']
      ->id(), $node
      ->id(), 'Search tag ranking for "&lt;' . $tag . '&gt;" order.');

    // Delete node so it doesn't show up in subsequent search results.
    $node
      ->delete();
  }
}