You are here

StatisticsLoggingTest.php in Zircon Profile 8

Same filename and directory in other branches
  1. 8.0 core/modules/statistics/src/Tests/StatisticsLoggingTest.php

File

core/modules/statistics/src/Tests/StatisticsLoggingTest.php
View source
<?php

/**
 * @file
 * Contains \Drupal\statistics\Tests\StatisticsLoggingTest.
 */
namespace Drupal\statistics\Tests;

use Drupal\simpletest\WebTestBase;

/**
 * Tests request logging for cached and uncached pages.
 *
 * We subclass WebTestBase rather than StatisticsTestBase, because we
 * want to test requests from an anonymous user.
 *
 * @group statistics
 */
class StatisticsLoggingTest extends WebTestBase {

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = array(
    'node',
    'statistics',
    'block',
    'locale',
  );

  /**
   * User with permissions to create and edit pages.
   *
   * @var \Drupal\user\UserInterface
   */
  protected $authUser;

  /**
   * Associative array representing a hypothetical Drupal language.
   *
   * @var array
   */
  protected $language;

  /**
   * The Guzzle HTTP client.
   *
   * @var \GuzzleHttp\Client;
   */
  protected $client;
  protected function setUp() {
    parent::setUp();

    // Create Basic page node type.
    if ($this->profile != 'standard') {
      $this
        ->drupalCreateContentType(array(
        'type' => 'page',
        'name' => 'Basic page',
      ));
    }
    $this->authUser = $this
      ->drupalCreateUser(array(
      // For node creation.
      'access content',
      'create page content',
      'edit own page content',
      // For language negotiation administration.
      'administer languages',
      'access administration pages',
    ));

    // Ensure we have a node page to access.
    $this->node = $this
      ->drupalCreateNode(array(
      'title' => $this
        ->randomMachineName(255),
      'uid' => $this->authUser
        ->id(),
    ));

    // Add a custom language and enable path-based language negotiation.
    $this
      ->drupalLogin($this->authUser);
    $this->language = array(
      'predefined_langcode' => 'custom',
      'langcode' => 'xx',
      'label' => $this
        ->randomMachineName(16),
      'direction' => 'ltr',
    );
    $this
      ->drupalPostForm('admin/config/regional/language/add', $this->language, t('Add custom language'));
    $this
      ->drupalPostForm('admin/config/regional/language/detection', array(
      'language_interface[enabled][language-url]' => 1,
    ), t('Save settings'));
    $this
      ->drupalLogout();

    // Enable access logging.
    $this
      ->config('statistics.settings')
      ->set('count_content_views', 1)
      ->save();

    // Clear the logs.
    db_truncate('node_counter');
    $this->client = \Drupal::service('http_client_factory')
      ->fromOptions([
      'config/curl' => [
        CURLOPT_TIMEOUT => 10,
      ],
    ]);
  }

  /**
   * Verifies node hit counter logging and script placement.
   */
  function testLogging() {
    $path = 'node/' . $this->node
      ->id();
    $module_path = drupal_get_path('module', 'statistics');
    $stats_path = base_path() . $module_path . '/statistics.php';
    $lib_path = base_path() . $module_path . '/statistics.js';
    $expected_library = '/<script src=".*?' . preg_quote($lib_path, '/.') . '.*?">/is';

    // Verify that logging scripts are not found on a non-node page.
    $this
      ->drupalGet('node');
    $settings = $this
      ->getDrupalSettings();
    $this
      ->assertNoPattern($expected_library, 'Statistics library JS not found on node page.');
    $this
      ->assertFalse(isset($settings['statistics']), 'Statistics settings not found on node page.');

    // Verify that logging scripts are not found on a non-existent node page.
    $this
      ->drupalGet('node/9999');
    $settings = $this
      ->getDrupalSettings();
    $this
      ->assertNoPattern($expected_library, 'Statistics library JS not found on non-existent node page.');
    $this
      ->assertFalse(isset($settings['statistics']), 'Statistics settings not found on node page.');

    // Verify that logging scripts are found on a valid node page.
    $this
      ->drupalGet($path);
    $settings = $this
      ->getDrupalSettings();
    $this
      ->assertPattern($expected_library, 'Found statistics library JS on node page.');
    $this
      ->assertIdentical($this->node
      ->id(), $settings['statistics']['data']['nid'], 'Found statistics settings on node page.');

    // Verify the same when loading the site in a non-default language.
    $this
      ->drupalGet($this->language['langcode'] . '/' . $path);
    $settings = $this
      ->getDrupalSettings();
    $this
      ->assertPattern($expected_library, 'Found statistics library JS on a valid node page in a non-default language.');
    $this
      ->assertIdentical($this->node
      ->id(), $settings['statistics']['data']['nid'], 'Found statistics settings on valid node page in a non-default language.');

    // Manually call statistics.php to simulate ajax data collection behavior.
    global $base_root;
    $post = array(
      'nid' => $this->node
        ->id(),
    );
    $this->client
      ->post($base_root . $stats_path, array(
      'form_params' => $post,
    ));
    $node_counter = statistics_get($this->node
      ->id());
    $this
      ->assertIdentical($node_counter['totalcount'], '1');
  }

}

Classes

Namesort descending Description
StatisticsLoggingTest Tests request logging for cached and uncached pages.