<?php
-// $Id$
/**
* @file
public static function getInfo() {
return array(
'name' => t('Google Analytics basic tests'),
- 'description' => t('Test basic Google Analytics module functionality.'),
+ 'description' => t('Test basic functionality of Google Analytics module.'),
'group' => 'Google Analytics',
);
}
- public function setUp() {
+ function setUp() {
parent::setUp('googleanalytics');
- $permissions = array('administer google analytics');
+ $permissions = array(
+ 'access administration pages',
+ 'administer google analytics',
+ );
// User to set up google_analytics.
- $user = $this->drupalCreateUser($permissions);
- $this->drupalLogin($user);
+ $this->admin_user = $this->drupalCreateUser($permissions);
+ $this->drupalLogin($this->admin_user);
}
- public function testGoogleAnalytics() {
+ function testGoogleAnalyticsConfiguration() {
// Check for setting page's presence.
$this->drupalGet('admin/config/system/googleanalytics');
- $this->assertRaw(t('Google Analytics account number'), '[testGoogleAnalytics]: Settings page displayed.');
+ $this->assertRaw(t('Web Property ID'), '[testGoogleAnalyticsConfiguration]: Settings page displayed.');
// Check for account code validation.
$edit['googleanalytics_account'] = $this->randomName(2);
$this->drupalPost('admin/config/system/googleanalytics', $edit, 'Save configuration');
- $this->assertRaw(t('A valid Google Analytics account number is case sensitive and formatted like UA-xxxxxx-x.'), '[testGoogleAnalytics]: Invalid account number validated.');
+ $this->assertRaw(t('A valid Google Analytics Web Property ID is case sensitive and formatted like UA-xxxxxxx-yy.'), '[testGoogleAnalyticsConfiguration]: Invalid Web Property ID number validated.');
}
- public function testGoogleAnalyticsTracking() {
- // Set visibility to hide tracking code on admin page only,
- // track authenticated users.
- variable_set('googleanalytics_visibility', 0);
- variable_set('googleanalytics_pages', 'admin*');
- variable_set('googleanalytics_roles', array(DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID));
- $ua_code = 'UA-123456-7';
+ function testGoogleAnalyticsPageVisibility() {
+ $ua_code = 'UA-123456-1';
variable_set('googleanalytics_account', $ua_code);
+ // Show tracking on "every page except the listed pages".
+ variable_set('googleanalytics_visibility_pages', 0);
+ // Disable tracking one "admin*" pages only.
+ variable_set('googleanalytics_pages', "admin\nadmin/*");
+ // Enable tracking only for authenticated users only.
+ variable_set('googleanalytics_roles', array(DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID));
+
// Check tracking code visibility.
$this->drupalGet('');
- $this->assertRaw($ua_code, '[testGoogleAnalyticsTracking]: Tracking code is displayed for authenticated users.');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsPageVisibility]: Tracking code is displayed for authenticated users.');
+
+ // Test whether tracking code is not included on pages to omit.
+ $this->drupalGet('admin');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsPageVisibility]: Tracking code is not displayed on admin page.');
+ $this->drupalGet('admin/config/system/googleanalytics');
+ // Checking for tracking code URI here, as $ua_code is displayed in the form.
+ $this->assertNoRaw('google-analytics.com/analytics.js', '[testGoogleAnalyticsPageVisibility]: Tracking code is not displayed on admin subpage.');
+
+ // Test whether tracking code display is properly flipped.
+ variable_set('googleanalytics_visibility_pages', 1);
+ $this->drupalGet('admin');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsPageVisibility]: Tracking code is displayed on admin page.');
+ $this->drupalGet('admin/config/system/googleanalytics');
+ // Checking for tracking code URI here, as $ua_code is displayed in the form.
+ $this->assertRaw('google-analytics.com/analytics.js', '[testGoogleAnalyticsPageVisibility]: Tracking code is displayed on admin subpage.');
+ $this->drupalGet('');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsPageVisibility]: Tracking code is NOT displayed on front page.');
+
+ // Test whether tracking code is not display for anonymous.
+ $this->drupalLogout();
+ $this->drupalGet('');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsPageVisibility]: Tracking code is NOT displayed for anonymous.');
+
+ // Switch back to every page except the listed pages.
+ variable_set('googleanalytics_visibility_pages', 0);
+ // Enable tracking code for all user roles.
+ variable_set('googleanalytics_roles', array());
+
+ // Test whether 403 forbidden tracking code is shown if user has no access.
+ $this->drupalGet('admin');
+ $this->assertRaw('/403.html', '[testGoogleAnalyticsPageVisibility]: 403 Forbidden tracking code shown if user has no access.');
+
+ // Test whether 404 not found tracking code is shown on non-existent pages.
+ $this->drupalGet($this->randomName(64));
+ $this->assertRaw('/404.html', '[testGoogleAnalyticsPageVisibility]: 404 Not Found tracking code shown on non-existent page.');
+
+ // DNT Tests:
+ // Enable caching of pages for anonymous users.
+ variable_set('cache', 1);
+ // Test whether DNT headers will fail to disable embedding of tracking code.
+ $this->drupalGet('', array(), array('DNT: 1'));
+ $this->assertRaw('ga("send", "pageview");', '[testGoogleAnalyticsDNTVisibility]: DNT header send from client, but page caching is enabled and tracker cannot removed.');
+ // DNT works only with caching of pages for anonymous users disabled.
+ variable_set('cache', 0);
+ $this->drupalGet('');
+ $this->assertRaw('ga("send", "pageview");', '[testGoogleAnalyticsDNTVisibility]: Tracking is enabled without DNT header.');
+ // Test whether DNT header is able to remove the tracking code.
+ $this->drupalGet('', array(), array('DNT: 1'));
+ $this->assertNoRaw('ga("send", "pageview");', '[testGoogleAnalyticsDNTVisibility]: DNT header received from client. Tracking has been disabled by browser.');
+ // Disable DNT feature and see if tracker is still embedded.
+ variable_set('googleanalytics_privacy_donottrack', 0);
+ $this->drupalGet('', array(), array('DNT: 1'));
+ $this->assertRaw('ga("send", "pageview");', '[testGoogleAnalyticsDNTVisibility]: DNT feature is disabled, DNT header from browser has been ignored.');
+ }
+
+ function testGoogleAnalyticsTrackingCode() {
+ $ua_code = 'UA-123456-2';
+ variable_set('googleanalytics_account', $ua_code);
+
+ // Show tracking code on every page except the listed pages.
+ variable_set('googleanalytics_visibility_pages', 0);
+ // Enable tracking code for all user roles.
+ variable_set('googleanalytics_roles', array());
/* Sample JS code as added to page:
<script type="text/javascript" src="/sites/all/modules/google_analytics/googleanalytics.js?w"></script>
- <script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-123456-7']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
+ <script>
+ (function(q,u,i,c,k){window['GoogleAnalyticsObject']=q;
+ window[q]=window[q]||function(){(window[q].q=window[q].q||[]).push(arguments)},
+ window[q].l=1*new Date();c=i.createElement(u),k=i.getElementsByTagName(u)[0];
+ c.async=true;c.src='//www.google-analytics.com/analytics.js';
+ k.parentNode.insertBefore(c,k)})('ga','script',document);
+ ga('create', 'UA-123456-7');
+ ga('send', 'pageview');
</script>
+ <!-- End Google Analytics -->
*/
// Test whether tracking code uses latest JS.
variable_set('googleanalytics_cache', 0);
$this->drupalGet('');
- $this->assertRaw('google-analytics.com/ga.js', '[testGoogleAnalyticsTracking]: Latest tracking code used.');
+ $this->assertRaw('google-analytics.com/analytics.js', '[testGoogleAnalyticsTrackingCode]: Latest tracking code used.');
- // Test whether tracking code is not included on pages to omit.
+ // Test whether anonymize visitors IP address feature has been enabled.
+ $this->drupalGet('');
+ $this->assertNoRaw('ga("set", "anonymizeIp", 1);', '[testGoogleAnalyticsTrackingCode]: Anonymize visitors IP address not found on frontpage.');
+ // Enable anonymizing of IP addresses.
+ variable_set('googleanalytics_tracker_anonymizeip', 1);
+ $this->drupalGet('');
+ $this->assertRaw('ga("set", "anonymizeIp", 1);', '[testGoogleAnalyticsTrackingCode]: Anonymize visitors IP address found on frontpage.');
+
+ // Test whether single domain tracking is active.
+ $this->drupalGet('');
+ $this->assertNoRaw('ga("set", "cookieDomain",', '[testGoogleAnalyticsTrackingCode]: Single domain tracking is active.');
+
+ // Enable "One domain with multiple subdomains".
+ variable_set('googleanalytics_domain_mode', 1);
+ $this->drupalGet('');
+
+ // Test may run on localhost, an ipaddress or real domain name.
+ // TODO: Workaround to run tests successfully. This feature cannot tested reliable.
+ global $cookie_domain;
+ if (count(explode('.', $cookie_domain)) > 2 && !is_numeric(str_replace('.', '', $cookie_domain))) {
+ $this->assertRaw('ga("set", "cookieDomain",', '[testGoogleAnalyticsTrackingCode]: One domain with multiple subdomains is active on real host.');
+ }
+ else {
+ // Special cases, Localhost and IP addresses don't show '_setDomainName'.
+ $this->assertNoRaw('ga("set", "cookieDomain",', '[testGoogleAnalyticsTrackingCode]: One domain with multiple subdomains may be active on localhost (test result is not reliable).');
+ }
+
+ // Enable "Multiple top-level domains" tracking.
+ variable_set('googleanalytics_domain_mode', 2);
+ variable_set('googleanalytics_cross_domains', "www.example.com\nwww.example.net");
+ $this->drupalGet('');
+ $this->assertRaw('ga("set", "cookieDomain", "none");', '[testGoogleAnalyticsTrackingCode]: _setDomainName: "none" found. Cross domain tracking is active.');
+ $this->assertRaw('ga("set", "allowLinker", true);', '[testGoogleAnalyticsTrackingCode]: _setAllowLinker: true found. Cross domain tracking is active.');
+ $this->assertRaw('"trackCrossDomains":["www.example.com","www.example.net"]', '[testGoogleAnalyticsTrackingCode]: Cross domain tracking with www.example.com and www.example.net is active.');
+
+ // Test whether the BEFORE and AFTER code is added to the tracker.
+ // @todo: review detectFlash once API docs are available.
+ variable_set('googleanalytics_codesnippet_before', 'ga("set", "detectFlash", false);');
+ variable_set('googleanalytics_codesnippet_after', 'ga("create", "UA-123456-3", {name: "newTracker"});ga("newTracker.send", "pageview");');
+ $this->drupalGet('');
+ $this->assertRaw('ga("set", "detectFlash", false);', '[testGoogleAnalyticsTrackingCode]: Before codesnippet has been found with "Flash" detection disabled.');
+ $this->assertRaw('ga("create", "UA-123456-3", {name: "newTracker"});', '[testGoogleAnalyticsTrackingCode]: After codesnippet with "newTracker" tracker has been found.');
+ }
+}
+
+/* @todo: upgrade to custom dimensions
+class GoogleAnalyticsCustomVariablesTest extends DrupalWebTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => t('Google Analytics Custom Variables tests'),
+ 'description' => t('Test custom variables functionality of Google Analytics module.'),
+ 'group' => 'Google Analytics',
+ 'dependencies' => array('token'),
+ );
+ }
+
+ function setUp() {
+ parent::setUp('googleanalytics', 'token');
+
+ $permissions = array(
+ 'access administration pages',
+ 'administer google analytics',
+ );
+
+ // User to set up google_analytics.
+ $this->admin_user = $this->drupalCreateUser($permissions);
+ }
+
+ function testGoogleAnalyticsCustomVariables() {
+ $ua_code = 'UA-123456-3';
+ variable_set('googleanalytics_account', $ua_code);
+
+ // Basic test if the feature works.
+ $custom_vars = array(
+ 'slots' => array(
+ 1 => array(
+ 'slot' => 1,
+ 'name' => 'Foo 1',
+ 'value' => 'Bar 1',
+ 'scope' => 3,
+ ),
+ 2 => array(
+ 'slot' => 2,
+ 'name' => 'Foo 2',
+ 'value' => 'Bar 2',
+ 'scope' => 2,
+ ),
+ 3 => array(
+ 'slot' => 3,
+ 'name' => 'Foo 3',
+ 'value' => 'Bar 3',
+ 'scope' => 3,
+ ),
+ 4 => array(
+ 'slot' => 4,
+ 'name' => 'Foo 4',
+ 'value' => 'Bar 4',
+ 'scope' => 2,
+ ),
+ 5 => array(
+ 'slot' => 5,
+ 'name' => 'Foo 5',
+ 'value' => 'Bar 5',
+ 'scope' => 1,
+ ),
+ )
+ );
+ variable_set('googleanalytics_custom_var', $custom_vars);
+ $this->drupalGet('');
+
+ foreach ($custom_vars['slots'] as $slot) {
+ $this->assertRaw("ga('set', 'customvar', " . $slot['slot'] . ", \"" . $slot['name'] . "\", \"" . $slot['value'] . "\", " . $slot['scope'] . ");", '[testGoogleAnalyticsCustomVariables]: _setCustomVar ' . $slot['slot'] . ' is shown.');
+ }
+
+ // Test whether tokens are replaced in custom variable names.
+ $site_slogan = $this->randomName(16);
+ variable_set('site_slogan', $site_slogan);
+
+ $custom_vars = array(
+ 'slots' => array(
+ 1 => array(
+ 'slot' => 1,
+ 'name' => 'Name: [site:slogan]',
+ 'value' => 'Value: [site:slogan]',
+ 'scope' => 3,
+ ),
+ 2 => array(
+ 'slot' => 2,
+ 'name' => '',
+ 'value' => $this->randomName(16),
+ 'scope' => 1,
+ ),
+ 3 => array(
+ 'slot' => 3,
+ 'name' => $this->randomName(16),
+ 'value' => '',
+ 'scope' => 2,
+ ),
+ 4 => array(
+ 'slot' => 4,
+ 'name' => '',
+ 'value' => '',
+ 'scope' => 3,
+ ),
+ 5 => array(
+ 'slot' => 5,
+ 'name' => '',
+ 'value' => '',
+ 'scope' => 3,
+ ),
+ )
+ );
+ variable_set('googleanalytics_custom_var', $custom_vars);
+ $this->verbose('<pre>' . print_r($custom_vars, TRUE) . '</pre>');
+
+ $this->drupalGet('');
+ $this->assertRaw("ga('set', 'customvar', 1, \"Name: $site_slogan\", \"Value: $site_slogan\", 3);", '[testGoogleAnalyticsCustomVariables]: Tokens have been replaced in custom variable.');
+ $this->assertNoRaw("ga('set', 'customvar', 2,", '[testGoogleAnalyticsCustomVariables]: Value with empty name is not shown.');
+ $this->assertNoRaw("ga('set', 'customvar', 3,", '[testGoogleAnalyticsCustomVariables]: Name with empty value is not shown.');
+ $this->assertNoRaw("ga('set', 'customvar', 4,", '[testGoogleAnalyticsCustomVariables]: Empty name and value is not shown.');
+ $this->assertNoRaw("ga('set', 'customvar', 5,", '[testGoogleAnalyticsCustomVariables]: Empty name and value is not shown.');
+ }
+} */
+
+class GoogleAnalyticsStatusMessagesTest extends DrupalWebTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => t('Google Analytics status messages tests'),
+ 'description' => t('Test status messages functionality of Google Analytics module.'),
+ 'group' => 'Google Analytics',
+ );
+ }
+
+ function setUp() {
+ parent::setUp('googleanalytics');
+
+ $permissions = array(
+ 'access administration pages',
+ 'administer google analytics',
+ );
+
+ // User to set up google_analytics.
+ $this->admin_user = $this->drupalCreateUser($permissions);
+ }
+
+ function testGoogleAnalyticsStatusMessages() {
+ $ua_code = 'UA-123456-4';
+ variable_set('googleanalytics_account', $ua_code);
+
+ // Enable logging of errors only.
+ variable_set('googleanalytics_trackmessages', array('error' => 'error'));
+
+ $this->drupalPost('user/login', array(), 'Log in');
+ $this->assertRaw('ga("send", "event", "Messages", "Error message", "Username field is required.");', '[testGoogleAnalyticsStatusMessages]: Event message "Username field is required." is shown.');
+ $this->assertRaw('ga("send", "event", "Messages", "Error message", "Password field is required.");', '[testGoogleAnalyticsStatusMessages]: Event message "Password field is required." is shown.');
+
+ // @todo: investigate why drupal_set_message() fails.
+ //drupal_set_message('Example status message.', 'status');
+ //drupal_set_message('Example warning message.', 'warning');
+ //drupal_set_message('Example error message.', 'error');
+ //drupal_set_message('Example error <em>message</em> with html tags and <a href="http://example.com/">link</a>.', 'error');
+ //$this->drupalGet('');
+ //$this->assertNoRaw('ga("send", "event", "Messages", "Status message", "Example status message.");', '[testGoogleAnalyticsStatusMessages]: Example status message is not enabled for tracking.');
+ //$this->assertNoRaw('ga("send", "event", "Messages", "Warning message", "Example warning message.");', '[testGoogleAnalyticsStatusMessages]: Example warning message is not enabled for tracking.');
+ //$this->assertRaw('ga("send", "event", "Messages", "Error message", "Example error message.");', '[testGoogleAnalyticsStatusMessages]: Example error message is shown.');
+ //$this->assertRaw('ga("send", "event", "Messages", "Error message", "Example error message with html tags and link.");', '[testGoogleAnalyticsStatusMessages]: HTML has been stripped successful from Example error message with html tags and link.');
+ }
+}
+
+class GoogleAnalyticsRolesTest extends DrupalWebTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => t('Google Analytics role tests'),
+ 'description' => t('Test roles functionality of Google Analytics module.'),
+ 'group' => 'Google Analytics',
+ );
+ }
+
+ function setUp() {
+ parent::setUp('googleanalytics');
+
+ $permissions = array(
+ 'access administration pages',
+ 'administer google analytics',
+ );
+
+ // User to set up google_analytics.
+ $this->admin_user = $this->drupalCreateUser($permissions);
+ }
+
+ function testGoogleAnalyticsRolesTracking() {
+ $ua_code = 'UA-123456-4';
+ variable_set('googleanalytics_account', $ua_code);
+
+ // Test if the default settings are working as expected.
+
+ // Add to the selected roles only.
+ variable_set('googleanalytics_visibility_roles', 0);
+ // Enable tracking for all users.
+ variable_set('googleanalytics_roles', array());
+
+ // Check tracking code visibility.
+ $this->drupalGet('');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is displayed for anonymous users on frontpage with default settings.');
$this->drupalGet('admin');
- $this->assertNoRaw($ua_code, '[testGoogleAnalyticsTracking]: Tracking code is not displayed on admin page.');
- $this->drupalGet('admin/config/system/googleanalytics');
- // Checking for tracking code URI here, as $ua_code is displayed in the form.
- $this->assertNoRaw('google-analytics.com/ga.js', '[testGoogleAnalyticsTracking]: Tracking code is not displayed on admin subpage.');
+ $this->assertRaw('/403.html', '[testGoogleAnalyticsRoleVisibility]: 403 Forbidden tracking code is displayed for anonymous users in admin section with default settings.');
- // Test whether tracking code display is properly flipped.
- variable_set('googleanalytics_visibility', 1);
+ $this->drupalLogin($this->admin_user);
+
+ $this->drupalGet('');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is displayed for authenticated users on frontpage with default settings.');
$this->drupalGet('admin');
- $this->assertRaw($ua_code, '[testGoogleAnalyticsTracking]: Tracking code is displayed on admin page.');
- $this->drupalGet('admin/config/system/googleanalytics');
- // Checking for tracking code URI here, as $ua_code is displayed in the form.
- $this->assertRaw('google-analytics.com/ga.js', '[testGoogleAnalyticsTracking]: Tracking code is displayed on admin subpage.');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is NOT displayed for authenticated users in admin section with default settings.');
+
+ // Test if the non-default settings are working as expected.
+
+ // Enable tracking only for authenticated users.
+ variable_set('googleanalytics_roles', array(DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID));
+
$this->drupalGet('');
- $this->assertNoRaw($ua_code, '[testGoogleAnalyticsTracking]: Tracking code is not displayed on front page.');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is displayed for authenticated users only on frontpage.');
- // Test whether tracking code is not display for anonymous.
- $this->drupalGet('logout');
+ $this->drupalLogout();
+ $this->drupalGet('');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is NOT displayed for anonymous users on frontpage.');
+
+ // Add to every role except the selected ones.
+ variable_set('googleanalytics_visibility_roles', 1);
+ // Enable tracking for all users.
+ variable_set('googleanalytics_roles', array());
+
+ // Check tracking code visibility.
+ $this->drupalGet('');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is added to every role and displayed for anonymous users.');
+ $this->drupalGet('admin');
+ $this->assertRaw('/403.html', '[testGoogleAnalyticsRoleVisibility]: 403 Forbidden tracking code is shown for anonymous users if every role except the selected ones is selected.');
+
+ $this->drupalLogin($this->admin_user);
+
+ $this->drupalGet('');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is added to every role and displayed on frontpage for authenticated users.');
+ $this->drupalGet('admin');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is added to every role and NOT displayed in admin section for authenticated users.');
+
+ // Disable tracking for authenticated users.
+ variable_set('googleanalytics_roles', array(DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID));
+
+ $this->drupalGet('');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is NOT displayed on frontpage for excluded authenticated users.');
+ $this->drupalGet('admin');
+ $this->assertNoRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is NOT displayed in admin section for excluded authenticated users.');
+
+ $this->drupalLogout();
$this->drupalGet('');
- $this->assertNoRaw($ua_code, '[testGoogleAnalyticsTracking]: Tracking code is not displayed for anonymous.');
+ $this->assertRaw($ua_code, '[testGoogleAnalyticsRoleVisibility]: Tracking code is displayed on frontpage for included anonymous users.');
}
}