You are here

public function GlossaryTest::testGlossaryView in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/views/tests/src/Functional/GlossaryTest.php \Drupal\Tests\views\Functional\GlossaryTest::testGlossaryView()

Tests the default glossary view.

File

core/modules/views/tests/src/Functional/GlossaryTest.php, line 34

Class

GlossaryTest
Tests glossary functionality of views.

Namespace

Drupal\Tests\views\Functional

Code

public function testGlossaryView() {

  // Create a content type and add some nodes, with a non-random title.
  $type = $this
    ->drupalCreateContentType();
  $nodes_per_char = [
    'd' => 1,
    'r' => 4,
    'u' => 10,
    'p' => 2,
    'a' => 3,
    'l' => 6,
  ];
  $nodes_by_char = [];
  foreach ($nodes_per_char as $char => $count) {
    $setting = [
      'type' => $type
        ->id(),
    ];
    for ($i = 0; $i < $count; $i++) {
      $node = $setting;
      $node['title'] = $char . $this
        ->randomString(3);
      $node = $this
        ->drupalCreateNode($node);
      $nodes_by_char[$char][] = $node;
    }
  }

  // Execute glossary view
  $view = Views::getView('glossary');
  $view
    ->setDisplay('attachment_1');
  $view
    ->executeDisplay('attachment_1');

  // Check that the amount of nodes per char.
  foreach ($view->result as $item) {
    $this
      ->assertEquals($nodes_per_char[$item->title_truncated], $item->num_records);
  }

  // Enable the glossary to be displayed.
  $view->storage
    ->enable()
    ->save();
  $this->container
    ->get('router.builder')
    ->rebuildIfNeeded();
  $url = Url::fromRoute('view.glossary.page_1');

  // Verify cache tags.
  $this
    ->assertPageCacheContextsAndTags($url, [
    'timezone',
    'languages:' . LanguageInterface::TYPE_CONTENT,
    'languages:' . LanguageInterface::TYPE_INTERFACE,
    'theme',
    'url',
    'user.node_grants:view',
    'user.permissions',
    'route',
  ], [
    'config:views.view.glossary',
    // Listed for letter 'a'
    'node:' . $nodes_by_char['a'][0]
      ->id(),
    'node:' . $nodes_by_char['a'][1]
      ->id(),
    'node:' . $nodes_by_char['a'][2]
      ->id(),
    // Link for letter 'd'.
    'node:1',
    // Link for letter 'p'.
    'node:16',
    // Link for letter 'r'.
    'node:2',
    // Link for letter 'l'.
    'node:21',
    // Link for letter 'u'.
    'node:6',
    'node_list',
    'user:0',
    'user_list',
    'http_response',
    'rendered',
    // FinishResponseSubscriber adds this cache tag to responses that have
    // the 'user.permissions' cache context for anonymous users.
    'config:user.role.anonymous',
  ]);

  // Check the actual page response.
  $this
    ->drupalGet($url);
  $this
    ->assertSession()
    ->statusCodeEquals(200);
  foreach ($nodes_per_char as $char => $count) {
    $href = Url::fromRoute('view.glossary.page_1', [
      'arg_0' => $char,
    ])
      ->toString();
    $label = mb_strtoupper($char);

    // Get the summary link for a certain character. Filter by label and href
    // to ensure that both of them are correct.
    $result = $this
      ->assertSession()
      ->elementExists('xpath', "//a[contains(@href, '{$href}') and normalize-space(text())='{$label}']/..");

    // The rendered output looks like "<a href=''>X</a> | (count)" so let's
    // figure out the int.
    $result_count = explode(' ', trim(str_replace([
      '|',
      '(',
      ')',
    ], '', $result
      ->getText())))[1];
    $this
      ->assertEquals($count, $result_count, 'The expected number got rendered.');
  }
}