You are here

public function GoogleAnalyticsBasicTest::testGoogleAnalyticsTrackingCode in Google Analytics 4.x

Same name and namespace in other branches
  1. 8.3 tests/src/Functional/GoogleAnalyticsBasicTest.php \Drupal\Tests\google_analytics\Functional\GoogleAnalyticsBasicTest::testGoogleAnalyticsTrackingCode()
  2. 8.2 tests/src/Functional/GoogleAnalyticsBasicTest.php \Drupal\Tests\google_analytics\Functional\GoogleAnalyticsBasicTest::testGoogleAnalyticsTrackingCode()

Tests if tracking code is properly added to the page.

File

tests/src/Functional/GoogleAnalyticsBasicTest.php, line 186

Class

GoogleAnalyticsBasicTest
Test basic functionality of Google Analytics module.

Namespace

Drupal\Tests\google_analytics\Functional

Code

public function testGoogleAnalyticsTrackingCode() {
  $ua_code = 'UA-123456-2';
  $this
    ->config('google_analytics.settings')
    ->set('account', $ua_code)
    ->save();

  // Show tracking code on every page except the listed pages.
  $this
    ->config('google_analytics.settings')
    ->set('visibility.request_path_mode', 0)
    ->save();

  // Enable tracking code for all user roles.
  $this
    ->config('google_analytics.settings')
    ->set('visibility.user_role_roles', [])
    ->save();

  /* Sample JS code as added to page:
     <script type="text/javascript" src="/sites/all/modules/google_analytics/google_analytics.js?w"></script>
     <!-- Global Site Tag (gtag.js) - Google Analytics -->
     <script async src="https://www.googletagmanager.com/gtag/js?id=UA-123456-7"></script>
     <script>
     window.dataLayer = window.dataLayer || [];
     function gtag(){dataLayer.push(arguments)};
     gtag('js', new Date());
     gtag('config', 'UA-123456-7');
     </script>
      */

  // Test whether tracking code uses latest JS.
  $this
    ->config('google_analytics.settings')
    ->set('cache', 0)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('<script async src="https://www.googletagmanager.com/gtag/js?id=' . $ua_code . '"></script>');
  $this
    ->assertRaw('window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments)};gtag("js", new Date());');
  $this
    ->assertRaw('"google_analytics":{"account":"' . $ua_code . '"');

  // Enable anonymizing of IP addresses.
  $this
    ->config('google_analytics.settings')
    ->set('privacy.anonymizeip', 1)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('"anonymize_ip":true');

  // Test whether anonymize visitors IP address feature has been enabled.
  $this
    ->config('google_analytics.settings')
    ->set('privacy.anonymizeip', 0)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertNoRaw('"anonymize_ip":true');

  // Test if track Enhanced Link Attribution is enabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.linkid', 1)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('"link_attribution":true');

  // Test if track Enhanced Link Attribution is disabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.linkid', 0)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertNoRaw('"link_attribution":true');

  // Test if tracking of User ID is enabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.userid', 1)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('"user_id":"');

  // Test if tracking of User ID is disabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.userid', 0)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertNoRaw('"user_id":"');

  // Test if track display features is disabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.displayfeatures', 0)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('"allow_ad_personalization_signals":false');

  // Test if track display features is enabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.displayfeatures', 1)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertNoRaw('"allow_ad_personalization_signals":false');

  // Test if tracking of url fragments is enabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.urlfragments', 1)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('"page_path":location.pathname + location.search + location.hash});');

  // Test if tracking of url fragments is disabled.
  $this
    ->config('google_analytics.settings')
    ->set('track.urlfragments', 0)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertNoRaw('"page_path":location.pathname + location.search + location.hash});');

  // Test whether single domain tracking is active.
  $this
    ->drupalGet('');
  $this
    ->assertRaw('{"groups":"default"}');

  // Enable "One domain with multiple subdomains".
  $this
    ->config('google_analytics.settings')
    ->set('domain_mode', 1)
    ->save();
  $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('"cookie_domain":"' . $cookie_domain . '"');
  }
  else {

    // Special cases, Localhost and IP addresses don't show 'cookieDomain'.
    $this
      ->assertNoRaw('"cookie_domain":"' . $cookie_domain . '"');
  }

  // Enable "Multiple top-level domains" tracking.
  $this
    ->config('google_analytics.settings')
    ->set('domain_mode', 2)
    ->set('cross_domains', "www.example.com\nwww.example.net")
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('gtag("config", "' . $ua_code . '", {"groups":"default","linker":');
  $this
    ->assertRaw('gtag("config", "' . $ua_code . '", {"groups":"default","linker":{"domains":["www.example.com","www.example.net"]}});');
  $this
    ->assertRaw('"trackDomainMode":2,');
  $this
    ->assertRaw('"trackCrossDomains":["www.example.com","www.example.net"]');
  $this
    ->config('google_analytics.settings')
    ->set('domain_mode', 0)
    ->save();

  // Test whether debugging script has been enabled.
  $this
    ->config('google_analytics.settings')
    ->set('debug', 1)
    ->save();
  $this
    ->drupalGet('');

  // @FIXME

  //$this->assertRaw('https://www.google-analytics.com/analytics_debug.js');

  // Check if text and link is shown on 'Status Reports' page.
  // Requires 'administer site configuration' permission.
  $this
    ->drupalGet('admin/reports/status');
  $this
    ->assertRaw($this
    ->t('Google Analytics module has debugging enabled. Please disable debugging setting in production sites from the <a href=":url">Google Analytics settings page</a>.', [
    ':url' => Url::fromRoute('google_analytics.admin_settings_form')
      ->toString(),
  ]));

  // Test whether debugging script has been disabled.
  $this
    ->config('google_analytics.settings')
    ->set('debug', 0)
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('https://www.googletagmanager.com/gtag/js?id=');

  // Test whether the CREATE and BEFORE and AFTER code is added to the
  // tracking code.
  $codesnippet_parameters = [
    'cookie_domain' => 'foo.example.com',
    'cookie_name' => 'myNewName',
    'cookie_expires' => 20000,
    'sample_rate' => 4.3,
  ];
  $this
    ->config('google_analytics.settings')
    ->set('codesnippet.create', $codesnippet_parameters)
    ->set('codesnippet.before', 'gtag("set", {"currency":"USD"});')
    ->set('codesnippet.after', 'gtag("config", "UA-123456-3", {"groups":"default"});if(1 == 1 && 2 < 3 && 2 > 1){console.log("Google Analytics: Custom condition works.");}')
    ->save();
  $this
    ->drupalGet('');
  $this
    ->assertRaw('gtag("config", "' . $ua_code . '", {"groups":"default","cookie_domain":"foo.example.com","cookie_name":"myNewName","cookie_expires":20000,"sample_rate":4.3});');
  $this
    ->assertRaw('gtag("set", {"currency":"USD"});');
  $this
    ->assertRaw('gtag("config", "UA-123456-3", {"groups":"default"});');
  $this
    ->assertRaw('if(1 == 1 && 2 < 3 && 2 > 1){console.log("Google Analytics: Custom condition works.");}');
}