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);
}