View source  
  <?php
namespace Drupal\optimizely\Tests;
use Drupal\simpletest\WebTestBase;
use Drupal\Core\Language\LanguageInterface;
class OptimizelyPageSnippetTest extends WebTestBase {
  protected $addUpdatePage = 'admin/config/system/optimizely/add_update';
  protected $update2Page = 'admin/config/system/optimizely/add_update/2';
  protected $update3Page = 'admin/config/system/optimizely/add_update/3';
  protected $update4Page = 'admin/config/system/optimizely/add_update/4';
  protected $update5Page = 'admin/config/system/optimizely/add_update/5';
  protected $listingPage = 'admin/config/system/optimizely';
  protected $addAliasPage = 'admin/config/search/path/add';
  protected $anonymousUser;
  protected $privilegedUser;
  protected $optimizelyPermission = 'administer optimizely';
  protected $projectCode;
  protected $projectNodes;
  
  protected $projectPaths;
  protected $projectAliases;
  
  
  public static $modules = array(
    'optimizely',
    'node',
    'path',
  );
  
  public static function getInfo() {
    return array(
      'name' => 'Optimizely Presence of Javascript Snippet',
      'description' => 'Test the presence of the Optimizely snippet' . ' (Javascript call) on pages (paths) defined in project entries.',
      'group' => 'Optimizely',
    );
  }
  
  public function setUp() {
    parent::setUp();
    $this
      ->drupalCreateContentType(array(
      'type' => 'page',
      'name' => 'Basic page',
    ));
    $this->anonymousUser = $this
      ->drupalCreateUser(array(
      'access content',
    ));
    $this->privilegedUser = $this
      ->drupalCreateUser(array(
      'access content',
      'create page content',
      'administer url aliases',
      'create url aliases',
      $this->optimizelyPermission,
    ));
    
    
    $this->projectNodes = array();
    $this->projectAliases = array();
    $this->projectPaths = array();
    $subpath = '';
    
    $this
      ->drupalLogin($this->privilegedUser);
    for ($project_count = 0; $project_count < 4; $project_count++) {
      $this->projectPaths[$project_count] = '';
      for ($page_count = 0; $page_count < 5; $page_count++) {
        
        $settings = array(
          'type' => 'page',
          'title' => $this
            ->randomMachineName(32),
          'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
          'body' => array(
            array(
              'value' => $this
                ->randomMachineName(64),
              'format' => filter_default_format(),
            ),
          ),
        );
        $node = $this
          ->drupalCreateNode($settings);
        
        $this->projectNodes[] = $node
          ->id();
        $random_alias_node = mt_rand(0, 1);
        if ($random_alias_node) {
          $alias = '/' . $this
            ->randomMachineName(10);
          
          $random_subalias_node = mt_rand(0, 1);
          if ($random_subalias_node) {
            $subpath = '/' . $this
              ->randomMachineName(10);
            $alias = $subpath . $alias;
          }
          
          $edit_node = array();
          $edit_node['source'] = '/node/' . $node
            ->id();
          $edit_node['alias'] = $alias;
          $this
            ->drupalPostForm($this->addAliasPage, $edit_node, t('Save'));
          
          $this->projectAliases[] = $alias;
          
          $random_project_wildcard = mt_rand(0, 1);
          if ($random_project_wildcard && $subpath != '') {
            $edit_node['alias'] = $subpath . '/*';
            $subpath = '';
            
            if (!empty($this->projectPaths[$project_count])) {
              $this->projectPaths[$project_count] = $edit_node['alias'] . "\n" . $this->projectPaths[$project_count];
            }
            else {
              $this->projectPaths[$project_count] = $edit_node['alias'];
            }
          }
          elseif ($subpath == '') {
            if (!empty($this->projectPaths[$project_count])) {
              $this->projectPaths[$project_count] = $edit_node['alias'] . "\n" . $this->projectPaths[$project_count];
            }
            else {
              $this->projectPaths[$project_count] = $edit_node['alias'];
            }
          }
        }
        else {
          if (!empty($this->projectPaths[$project_count])) {
            $this->projectPaths[$project_count] = '/node/' . $node
              ->id() . "\n" . $this->projectPaths[$project_count];
          }
          else {
            $this->projectPaths[$project_count] = '/node/' . $node
              ->id();
          }
        }
      }
      
      $this->projectCode[$project_count] = mt_rand(0, 10000);
      
      $edit = array(
        'optimizely_project_title' => $this
          ->randomMachineName(8),
        'optimizely_project_code' => $this->projectCode[$project_count],
        'optimizely_path' => $this->projectPaths[$project_count],
        'optimizely_enabled' => 0,
      );
      $this
        ->drupalPostForm($this->addUpdatePage, $edit, t('Add'));
    }
  }
  
  public function testPageSnippetPresence() {
    $this
      ->drupalLogin($this->privilegedUser);
    
    $edit = array(
      'optimizely_enabled' => 1,
    );
    $this
      ->drupalPostForm($this->update2Page, $edit, t('Update'));
    $this
      ->drupalPostForm($this->update3Page, $edit, t('Update'));
    $this
      ->drupalPostForm($this->update4Page, $edit, t('Update'));
    $this
      ->drupalPostForm($this->update5Page, $edit, t('Update'));
    
    $this
      ->drupalGet($this->listingPage);
    $this
      ->assertRaw('name="project-2" checked="checked"', '<strong>Project 2 is enabled, ready to test path settings for presence of snippet.</strong>', 'Optimizely');
    $this
      ->drupalLogout();
    $this
      ->drupalLogin($this->anonymousUser);
    $num_projects = count($this->projectCode);
    for ($project_count = 0; $project_count <= $num_projects; $project_count++) {
      
      if (!empty($this->projectPaths[$project_count])) {
        $paths = explode("\n", $this->projectPaths[$project_count]);
      }
      else {
        $paths = array();
      }
      foreach ($paths as $path) {
        
        if ($path == '') {
          break;
        }
        
        if (strpos($path, '/*') === FALSE) {
          
          $this
            ->drupalGet($path);
          $target_html = '"//cdn.optimizely.com/js/' . $this->projectCode[$project_count] . '.js"';
          $this
            ->assertRaw("src={$target_html}", "<strong>Optimizely snippet call {$target_html} found</strong> at: " . $path, 'Optimizely');
        }
      }
    }
  }
}