You are here

public function BetterStatisticsTest::testDataCollection in Better Statistics 7

Test data collection functionality.

File

./better_statistics.test, line 209
Tests for the Better Statistics Module.

Class

BetterStatisticsTest
Functional tests for Better Statistics.

Code

public function testDataCollection() {

  // Ensure statistics are collected when caching is disabled.
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog data being collected when page cache is disabled.'));

  // Ensure statistics are collected when caching is enabled (cache miss).
  variable_set('cache', 1);
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 2, t('Accesslog data being collected when page cache is enabled (cache miss).'));

  // Ensure statistics are collected when caching is enabled (cache hit).
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 3, t('Accesslog data being collected when page cache is enabled (cache hit).'));

  // Create a user and log it in.
  $this->admin_user = $this
    ->drupalCreateUser(array(
    'access administration pages',
    'administer statistics',
    'access content',
    'access statistics',
    'administer site configuration',
  ));
  $this
    ->drupalLogin($this->admin_user);

  // Disable logging of <front> page.
  $edit = array(
    'statistics_access_log_restrictions_pages' => '<front>',
  );
  $this
    ->drupalPost($this->stats_admin, $edit, t('Save configuration'));

  // Check page access to <front> is not logged, and no issues with
  // alias resolution in case of caching.
  $this
    ->drupalLogout();
  db_truncate('accesslog')
    ->execute();
  db_truncate('watchdog')
    ->execute();

  // First get will be a MISS.
  $this
    ->drupalGet('node');

  // Second get will be a HIT.
  $this
    ->drupalGet('node');

  // We expect no access to be logged.
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('Accesslog data for access to "node" not being collected, when page restriction for "front" is set.'));

  // We expect no php type entries in the watchdog.
  $query = db_query("SELECT wid FROM {watchdog} where type = 'php'");
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('No errors matching "node" request path to "front" alias.'));

  // Reset pages restrictions.
  $this
    ->drupalLogin($this->admin_user);
  $edit = array(
    'statistics_access_log_restrictions_pages' => '',
  );
  $this
    ->drupalPost($this->stats_admin, $edit, t('Save configuration'));

  // Disable logging of cached page requests.
  $edit = array(
    'statistics_access_log_restrictions_cache' => FALSE,
  );
  $this
    ->drupalPost($this->perf_admin, $edit, t('Save configuration'));

  // Check page access is not logged.
  $this
    ->drupalLogout();
  db_truncate('accesslog')
    ->execute();

  // First get will be a MISS.
  $this
    ->drupalGet('node');

  // Second get will be a HIT.
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();

  // We expect the MISS to be logged, the HIT not.
  $this
    ->assertTrue($rows == 1, t('Accesslog data not being collected when page cache is enabled, and logging of cached pages is disabled.'));

  // Re-enable logging of cached page requests.
  $this
    ->drupalLogin($this->admin_user);
  $edit = array(
    'statistics_access_log_restrictions_cache' => TRUE,
  );
  $this
    ->drupalPost($this->perf_admin, $edit, t('Save configuration'));

  // Set statistics to only log anonymous users.
  $edit = array(
    'statistics_access_log_restrictions_roles[1]' => 1,
  );
  $this
    ->drupalPost($this->stats_admin, $edit, t('Save configuration'));

  // Check page access is not logged.
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('Accesslog data not being collected when logging is only enabled for anonymous users.'));

  // Log out and check page access is logged.
  $this
    ->drupalLogout();
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog data being collected when logging is only enabled for anonymous users.'));
  $this
    ->drupalLogin($this->admin_user);

  // Re-enable logging of all roles.
  $edit = array(
    'statistics_access_log_restrictions_roles[1]' => FALSE,
  );
  $this
    ->drupalPost($this->stats_admin, $edit, t('Save configuration'));

  // Disable logging of admin pages.
  $edit = array(
    'statistics_access_log_restrictions_pages' => 'admin/*',
  );
  $this
    ->drupalPost($this->stats_admin, $edit, t('Save configuration'));

  // Check admin page access is not logged.
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('admin/config');

  // for some reason, this logs an access to 'node'
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('admin/config');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('Accesslog data not being collected on defined exclusion.'));

  // Check normal page access is logged.
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog data being collected when exclusion is defined, but a non-excluded page is loaded.'));

  // Enable logging of only admin pages.
  $edit = array(
    'statistics_access_log_restrictions_page' => 1,
  );
  $this
    ->drupalPost($this->stats_admin, $edit, t('Save configuration'));

  // Check normal page access is not logged.
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('node');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('Accesslog data not being collected when inclusion is defined, but a non-included page is loaded.'));

  // Check admin page access is logged.
  $this
    ->drupalGet('admin/config');
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog data being collected on defined inclusion.'));

  // Reset page settings.
  $edit = array(
    'statistics_access_log_restrictions_page' => 0,
  );
  $this
    ->drupalPost($this->stats_admin, $edit, t('Save configuration'));

  // By default, a request with a DNT header should have no effect.
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('node', array(), array(
    'DNT: 1',
  ));
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog data being collected by default when do not track headers are provided.'));

  // Configure the module to respect the DNT header.
  variable_set('statistics_access_log_restrictions_dnt', TRUE);

  // A request with a DNT header should not be logged.
  $this
    ->drupalGet('node', array(), array(
    'DNT: 1',
  ));
  $query = db_query('SELECT aid FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog data not collected when do not track headers are provided.'));

  // Reset the DNT configuration.
  variable_set('statistics_access_log_restrictions_dnt', FALSE);

  // Ensure that POSTing to the Accesslog callback creates a valid entry.
  db_truncate('accesslog')
    ->execute();
  $this
    ->betterStatisticsPost($this->ajax_accesslog);
  $query = db_query('SELECT * FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog data collected via AJAX callback.'));

  // Ensure data POSTed to the Accesslog callback overrides server-side data.
  $custom_path = 'custom/path';
  $this
    ->betterStatisticsPost($this->ajax_accesslog, array(
    'path' => $custom_path,
  ));
  $query = db_query('SELECT * FROM {accesslog} WHERE path = :path', array(
    ':path' => $custom_path,
  ));
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Accesslog server-side data successfully overridden by JSON overrides.'));

  // Ensure that data POSTed to the Accesslog callback that doesn't correspond
  // to a field is safely ignored.
  db_truncate('accesslog')
    ->execute();
  $this
    ->betterStatisticsPost($this->ajax_accesslog, array(
    'fake_field' => 'fake data',
  ));
  $query = db_query('SELECT * FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Irrelevant accesslog data sucessfully ignored on AJAX callback.'));

  // Ensure that when cache is enabled in mixed mode, duplicate entries are
  // not created because hook_exit() is still run.
  $this
    ->drupalLogout();
  variable_set('cache', 1);
  variable_set('statistics_enable_access_log', BETTER_STATISTICS_ACCESSLOG_MIXED);
  db_truncate('accesslog')
    ->execute();
  $this
    ->drupalGet('node');
  $this
    ->drupalGet('node');
  $query = db_query('SELECT * FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('Accesslog data not collected in mixed mode when cache is enabled.'));
  db_truncate('accesslog')
    ->execute();
  variable_set('statistics_enable_access_log', BETTER_STATISTICS_ACCESSLOG_CLIENT);
  $this
    ->drupalGet('node');
  $this
    ->drupalGet('node');
  $query = db_query('SELECT * FROM {accesslog}');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('Accesslog data not collected in client-side mode when cache is enabled.'));
  variable_set('cache', 0);

  // Ensure that data POSTed to the Entity View callback creates a valid entry.
  $entity_view_data = array(
    'entity_type' => 'node',
    'entity_id' => 1,
  );
  db_truncate('node_counter')
    ->execute();
  $this
    ->betterStatisticsPost($this->ajax_entityview, $entity_view_data);
  $query = db_query('SELECT * FROM {node_counter} WHERE nid=1 AND daycount=1');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Entity View data collected via AJAX callback.'));
  db_truncate('node_counter')
    ->execute();
  $this
    ->betterStatisticsPost($this->ajax_entityview, $entity_view_data);
  $query = db_query('SELECT * FROM {node_counter} WHERE nid=1 AND daycount=1');
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 1, t('Entity View data collected via AJAX callback.'));

  // Ensure that when cache is enabled in mixed mode, duplicate entries are
  // not created because hook_exit() is still run.
  variable_set('cache', 1);
  variable_set('statistics_count_content_views', BETTER_STATISTICS_ENTITY_VIEW_CLIENT);
  db_truncate('node_counter')
    ->execute();
  $this
    ->drupalGet('node/' . $this->node->nid);
  $this
    ->drupalGet('node/' . $this->node->nid);
  $query = db_query('SELECT * FROM {node_counter} WHERE nid=:nid', array(
    ':nid' => $this->node->nid,
  ));
  $rows = $query
    ->rowCount();
  $this
    ->assertTrue($rows == 0, t('Entity View data not collected in client-side only mode when cache is enabled.'));
  variable_set('cache', 0);
}