FrontpageTest.php

Contains \Drupal\node\Tests\Views\FrontPageTest.

Namespace

Drupal\node\Tests\Views

File

drupal/core/modules/node/lib/Drupal/node/Tests/Views/FrontpageTest.php
View source
<?php

/**
 * @file
 * Contains \Drupal\node\Tests\Views\FrontPageTest.
 */
namespace Drupal\node\Tests\Views;

use Drupal\views\Tests\ViewTestBase;
use Drupal\views\ViewExecutable;

/**
 * Tests the default frontpage provided by views.
 */
class FrontPageTest extends ViewTestBase {

  /**
   * The entity storage controller for nodes.
   *
   * @var \Drupal\node\NodeStorageController
   */
  protected $nodeStorageController;

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = array(
    'node',
  );
  public static function getInfo() {
    return array(
      'name' => 'Node: Frontpage view',
      'description' => 'Tests the default frontpage provided by views.',
      'group' => 'Views module integration',
    );
  }
  protected function setUp() {
    parent::setUp();
    $this->nodeStorageController = $this->container
      ->get('plugin.manager.entity')
      ->getStorageController('node');
  }

  /**
   * Tests the frontpage.
   */
  public function testFrontPage() {
    $site_name = $this
      ->randomName();
    $this->container
      ->get('config.factory')
      ->get('system.site')
      ->set('name', $site_name)
      ->save();
    $view = views_get_view('frontpage');
    $view
      ->setDisplay('page_1');
    $this
      ->executeView($view);
    $view
      ->preview();
    $this
      ->assertEqual($view
      ->getTitle(), format_string('Welcome to @site_name', array(
      '@site_name' => $site_name,
    )), 'The welcome title is used for the empty view.');
    $view
      ->destroy();

    // Create some nodes on the frontpage view. Add more than 10 nodes in order
    // to enable paging.
    $expected = array();
    for ($i = 0; $i < 20; $i++) {
      $values = array();
      $values['type'] = 'article';
      $values['title'] = $this
        ->randomName();
      $values['promote'] = TRUE;
      $values['status'] = TRUE;

      // Test descending sort order.
      $values['created'] = REQUEST_TIME - $i;

      // Test the sticky order.
      if ($i == 5) {
        $values['sticky'] = TRUE;
        $node = $this->nodeStorageController
          ->create($values);
        $node
          ->save();

        // Put the sticky on at the front.
        array_unshift($expected, array(
          'nid' => $node
            ->id(),
        ));
      }
      else {
        $values['sticky'] = FALSE;
        $node = $this->nodeStorageController
          ->create($values);
        $node
          ->save();
        array_push($expected, array(
          'nid' => $node
            ->id(),
        ));
      }
    }

    // Create some nodes which aren't on the frontpage, either because they
    // aren't promoted or because they aren't published.
    $not_expected_nids = array();
    $values = array();
    $values['type'] = 'article';
    $values['title'] = $this
      ->randomName();
    $values['status'] = TRUE;
    $values['promote'] = FALSE;
    $node = $this->nodeStorageController
      ->create($values);
    $node
      ->save();
    $not_expected_nids[] = $node
      ->id();
    $values['promote'] = TRUE;
    $values['status'] = FALSE;
    $values['title'] = $this
      ->randomName();
    $node = $this->nodeStorageController
      ->create($values);
    $node
      ->save();
    $not_expected_nids[] = $node
      ->id();
    $values['promote'] = TRUE;
    $values['sticky'] = TRUE;
    $values['status'] = FALSE;
    $values['title'] = $this
      ->randomName();
    $node = $this->nodeStorageController
      ->create($values);
    $node
      ->save();
    $not_expected_nids[] = $node
      ->id();
    $column_map = array(
      'nid' => 'nid',
    );
    $view
      ->setDisplay('page_1');
    $this
      ->executeView($view);
    $this
      ->assertIdenticalResultset($view, array_slice($expected, 0, 10), $column_map, 'Ensure that the right nodes are displayed on the frontpage.');
    $this
      ->assertNotInResultSet($view, $not_expected_nids, 'Ensure no unexpected node is in the result.');
    $view
      ->destroy();
    $view
      ->setDisplay('page_1');
    $view
      ->setCurrentPage(1);
    $this
      ->executeView($view);
    $this
      ->assertIdenticalResultset($view, array_slice($expected, 10, 10), $column_map, 'Ensure that the right nodes are displayed on second page of the frontpage.');
    $this
      ->assertNotInResultSet($view, $not_expected_nids, 'Ensure no unexpected node is in the result.');
    $view
      ->destroy();
  }

  /**
   * Verifies that an amount of nids aren't in the result.
   *
   * @param \Drupal\views\ViewExecutable $view
   *   An executed View.
   * @param array $not_expected_nids
   *   An array of nids which should not be part of the resultset.
   * @param string $message
   *   (optional) A custom message to display with the assertion.
   */
  protected function assertNotInResultSet(ViewExecutable $view, array $not_expected_nids, $message = '') {
    $found_nids = array_filter($view->result, function ($row) use ($not_expected_nids) {
      return in_array($row->nid, $not_expected_nids);
    });
    $this
      ->assertFalse($found_nids, $message);
  }

}

Classes

Namesort descending Description
FrontPageTest Tests the default frontpage provided by views.