You are here

acquia_search.test in Acquia Search 6.3

Same filename and directory in other branches
  1. 6 tests/acquia_search.test

File

tests/acquia_search.test
View source
<?php

/**
 * @file
 * Tests for the Acquia Search module.
 */
if (!defined('REQUEST_TIME')) {
  define('REQUEST_TIME', (int) $_SERVER['REQUEST_TIME']);
}

/**
 * Unit tests of the functionality of the Acquia Search module.
 */
class AcquiaSearchUnitTestCase extends DrupalUnitTestCase {
  protected $id;
  protected $key;
  protected $salt;
  protected $derivedKey;
  public static function getInfo() {
    return array(
      'name' => 'Acquia Search unit tests',
      'description' => 'Tests the low level Acquia Search functions.',
      'group' => 'Acquia',
    );
  }

  /**
   * Overrides DrupalTestCase::setUp().
   */
  public function setUp() {
    parent::setUp();
    require_once dirname(dirname(__FILE__)) . '/acquia_search.module';

    // Generate and store a random set of credentials.
    // Make them as close to the production values as possible
    // Something like AAAA-1234
    $this->id = $this
      ->randomAcquiaSearchName(10);

    // Most of the keys and salts have a 32char lenght
    $this->key = $this
      ->randomAcquiaSearchName(32);
    $this->salt = $this
      ->randomAcquiaSearchName(32);

    // Create a derived key from these values
    $this->derivedKey = _acquia_search_create_derived_key($this->salt, $this->id, $this->key);
  }

  /**
   * Tests derived key generation.
   */
  public function testDerivedKey() {

    // Mimic the hashing code in the API function.
    $derivation_string = $this->id . 'solr' . $this->salt;

    // str_pad extends the string with the same string in this case
    // until it has filled 80 chars.
    $derived_key = hash_hmac('sha1', str_pad($derivation_string, 80, $derivation_string), $this->key);

    // $this->derivedKey is generated from the API function.
    // @see setUp()
    $this
      ->assertEqual($this->derivedKey, $derived_key, t('Derived key API function generates the expected hash.'), 'Acquia Search');
  }

  /**
   * Original randomName function of simpletest did not produce correct results
   * so we backported the Drupal 7 simpletest function to Drupal 6 to genuinely
   * test the exact same scenario.
   *
   * @param type $length
   * @return string
   */
  public static function randomAcquiaSearchName($length = 8) {
    $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
    $max = count($values) - 1;
    $str = chr(mt_rand(97, 122));
    for ($i = 1; $i < $length; $i++) {
      $str .= chr($values[mt_rand(0, $max)]);
    }
    return $str;
  }

  /**
   * Tests HMAC generation.
   */
  public function testHMACCookie() {

    // Generate the expected hash.
    $time = REQUEST_TIME;
    $nonce = $this
      ->randomAcquiaSearchName(32);
    $string = $time . $nonce . $this
      ->randomAcquiaSearchName();
    $hmac = hash_hmac('sha1', $time . $nonce . $string, $this->derivedKey);

    // @todo Make the API function more testable.
    $authenticator = acquia_search_authenticator($string, $nonce, $this->derivedKey);
    preg_match('/acquia_solr_hmac=([a-zA-Z0-9]{40});/', $authenticator, $matches);
    $this
      ->assertEqual($hmac, $matches[1], t('HMAC API function generates the expected hmac hash.'), 'Acquia Search');
    preg_match('/acquia_solr_time=([0-9]{10});/', $authenticator, $matches);
    $this
      ->assertNotNull($matches, t('HMAC API function generates a timestamp.'), 'Acquia Search');
    preg_match('/acquia_solr_nonce=([a-zA-Z0-9]{32});/', $authenticator, $matches);
    $this
      ->assertEqual($nonce, $matches[1], t('HMAC API function generates the expected nonce.'), 'Acquia Search');
  }

}

/**
 * Tests the functionality of the Acquia Search module.
 */
class AcquiaSearchWebTestCase extends DrupalWebTestCase {
  protected $id;
  protected $key;
  protected $salt;
  protected $derivedKey;
  protected $url;
  public static function getInfo() {
    return array(
      'name' => 'Acquia Search UI tests',
      'description' => 'Tests the Acquia Search user interface and functionality.',
      'group' => 'Acquia',
    );
  }

  /**
   * Overrides DrupalTestCase::setUp().
   */
  public function setUp() {
    parent::setUp('acquia_agent', 'search', 'content', 'apachesolr', 'apachesolr_search', 'acquia_search');

    // Generate and store a random set of credentials.
    $this->id = AcquiaSearchUnitTestCase::randomAcquiaSearchName(10);
    $this->key = AcquiaSearchUnitTestCase::randomAcquiaSearchName(32);
    $this->salt = AcquiaSearchUnitTestCase::randomAcquiaSearchName(32);
    $this->derivedKey = _acquia_search_create_derived_key($this->salt, $this->id, $this->key);
    $subscription = array(
      'timestamp' => REQUEST_TIME - 60,
      'active' => '1',
    );
    variable_set('acquia_identifier', $this->id);
    variable_set('acquia_key', $this->key);
    variable_set('acquia_subscription_data', $subscription);
    $environment = acquia_search_get_environment();
    $this->url = $environment['url'];
  }

  /**
   * Creates an admin user.
   */
  public function createAdminUser() {
    $permissions = array(
      'access content',
      'search content',
      'administer nodes',
      'administer search',
    );
    return $this
      ->drupalCreateUser($permissions);
  }

  /**
   * Method to clear static caches that could interrupt with the
   * simpletest procedures for Acquia Search.
   */
  public function clearStaticCache() {

    // Reset the static to test for bug where default environment was only set
    // on the current page load. We want to ensure the setting persists.
    // @see http://drupal.org/node/1784804
    apachesolr_default_environment(NULL, TRUE);
    apachesolr_load_all_environments(TRUE);
  }

  /**
   * Enables the environment of Acquia Search.
   */
  public function enableEnvironment() {

    // API function that creates the environemnt if it doesn't exist yet.
    acquia_search_enable_acquia_solr_environment();
  }

  /**
   * Tests Acquia Search environment creation.
   *
   * Tests executed:
   * - Acquia Search environment is saved and loaded.
   * - Acquia Search environment is set as the default environment when created.
   * - The service class is set to AcquiaSearchService.
   * - The environment's URL is built as expected.
   */
  public function testEnvironment() {

    // Enable the Acquia Search environment
    $this
      ->enableEnvironment();

    // Clear the static caches
    $this
      ->clearStaticCache();

    // Load the newly enabled environment
    $environment = apachesolr_environment_load(ACQUIA_SEARCH_ENVIRONMENT_ID);

    // Load the default environment variable
    $default_environment = apachesolr_default_environment();

    // Test all the things!
    // Check if the environment is a valid variable
    $this
      ->assertTrue($environment, t('Acquia Search environment saved.'), 'Acquia Search');

    // Check if the default environment is Acquia Search
    $this
      ->assertEqual(ACQUIA_SEARCH_ENVIRONMENT_ID, $default_environment, t('Acquia Search is set to the default environment.'), 'Acquia Search');

    // Check if the service class is actually the Acquia Search Service Class
    $class = isset($environment['service_class']) ? $environment['service_class'] : '';
    $this
      ->assertEqual('AcquiaSearchService', $class, t('Acquia Search is using the AcquiaSearchService service class.'), 'Acquia Search');

    // Check if the url is the same as the one we wanted to save.
    $this
      ->assertEqual($this->url, $environment['url'], t('Acquia Search is connected to the expected URL.'), 'Acquia Search');
  }

  /**
   * Tests that the Acquia Search environment shows up in the interface and that
   * administrators cannot delete it.
   *
   * Tests executed:
   * - Acquia Search environment is present in the UI.
   * - Acquia Search is reflected as the default environment in the UI.
   * - Admin user receives 403 when attempting to delete the environment.
   */
  public function testEnvironmentUI() {

    // Enable the Acquia Search environment
    $this
      ->enableEnvironment();

    // Clear the static caches
    $this
      ->clearStaticCache();
    $admin_user = $this
      ->createAdminUser();
    $this
      ->drupalLogin($admin_user);
    $settings_path = 'admin/settings/apachesolr/settings';
    $this
      ->drupalGet($settings_path);
    $this
      ->assertText('Acquia Search', t('The Acquia Search environment is displayed in the UI.'), 'Acquia Search');
    $path = 'admin/settings/apachesolr/settings/' . ACQUIA_SEARCH_ENVIRONMENT_ID . '/edit';
    $options = array(
      'query' => array(
        'destination' => $settings_path,
      ),
    );
    $link = l('Acquia Search', $path, $options);
    $raw = t('!environment <em>(Default)</em>', array(
      '!environment' => $link,
    ));
    $this
      ->assertRaw($raw, t('The Acquia Search environment is reflected as the default in the UI.'), 'Acquia Search');
    $this
      ->drupalGet('admin/config/search/apachesolr/settings/' . ACQUIA_SEARCH_ENVIRONMENT_ID . '/delete');
    $this
      ->assertResponse(403, t('The Acquia Search environment cannot be deleted via the UI.'));
  }

}

Classes

Namesort descending Description
AcquiaSearchUnitTestCase Unit tests of the functionality of the Acquia Search module.
AcquiaSearchWebTestCase Tests the functionality of the Acquia Search module.