You are here

subpathauto.test in Sub-pathauto (Sub-path URL Aliases) 7

Test integration for the subpathauto.module.

File

subpathauto.test
View source
<?php

/**
 * @file
 * Test integration for the subpathauto.module.
 */
class SubPathautoUnitTestCase extends DrupalWebTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Sub-pathauto unit tests',
      'description' => 'Test basic functionality for Sub-pathauto.',
      'group' => 'Sub-pathauto',
    );
  }
  function setUp() {
    parent::setUp(array(
      'subpathauto',
    ));
    $this
      ->addAlias('node/1', 'content/first-node');
    $this
      ->addAlias('node/1/test', 'content/first-node-test');
    $this
      ->addAlias('admin', 'malicious-path');
  }
  function testSubPathAliases() {
    $this
      ->assertAlias('node/1', 'content/first-node');
    $this
      ->assertAlias('node/1/a', 'content/first-node/a');
    $this
      ->assertNoAlias('node/1/a/b');
    $this
      ->assertAlias('node/1/test', 'content/first-node-test');
    $this
      ->assertAlias('node/1/test/a', 'content/first-node-test/a');
    $this
      ->assertNoAlias('node/1/test/a/b');

    // Change the depth to two-levels deep.
    variable_set('subpathauto_depth', 2);
    drupal_static_reset();
    $this
      ->assertAlias('node/1', 'content/first-node');
    $this
      ->assertAlias('node/1/a', 'content/first-node/a');
    $this
      ->assertAlias('node/1/a/b', 'content/first-node/a/b');
    $this
      ->assertNoAlias('node/1/a/b/c');
    $this
      ->assertAlias('node/1/test', 'content/first-node-test');
    $this
      ->assertAlias('node/1/test/a/b', 'content/first-node-test/a/b');
    $this
      ->assertNoAlias('node/1/test/a/b/c');

    // Test that admin paths should be excluded.
    drupal_static_reset();
    $this
      ->assertNoAlias('node/1/edit');
    $this
      ->assertNoAlias('admin/modules');

    // Test with $options['alias'] and $options['external'].
    $this
      ->assertNoAlias('node/1/a', array(
      'alias' => TRUE,
    ));
    $this
      ->assertAlias('node/1/a', 'content/first-node/a', array(
      'alias' => FALSE,
    ));
    $this
      ->assertNoAlias('node/1/a', array(
      'external' => TRUE,
    ));
    $this
      ->assertAlias('node/1/a', 'content/first-node/a', array(
      'external' => FALSE,
    ));

    // Enable sub-path aliases for admin paths.
    variable_set('subpathauto_ignore_admin', 0);
    drupal_static_reset();
    $this
      ->assertAlias('node/1/edit', 'content/first-node/edit');
    $this
      ->assertAlias('admin/modules', 'malicious-path/modules');
  }
  function getPathAlias($path, $options = array()) {

    // Merge in defaults.
    $options += array(
      'fragment' => '',
      'query' => array(),
      'absolute' => FALSE,
      'alias' => FALSE,
      'prefix' => '',
    );
    if (!isset($options['external'])) {

      // Return an external link if $path contains an allowed absolute URL. Only
      // call the slow drupal_strip_dangerous_protocols() if $path contains a ':'
      // before any / ? or #. Note: we could use url_is_external($path) here, but
      // that would require another function call, and performance inside url() is
      // critical.
      $colonpos = strpos($path, ':');
      $options['external'] = $colonpos !== FALSE && !preg_match('![/?#]!', substr($path, 0, $colonpos)) && drupal_strip_dangerous_protocols($path) == $path;
    }

    // Preserve the original path before altering or aliasing.
    $original_path = $path;

    // Allow other modules to alter the outbound URL and options.
    drupal_alter('url_outbound', $path, $options, $original_path);
    if (isset($options['fragment']) && $options['fragment'] !== '') {
      $options['fragment'] = '#' . $options['fragment'];
    }
    if ($options['external']) {
      return $path;
    }
    global $base_url, $base_secure_url, $base_insecure_url;

    // The special path '<front>' links to the default front page.
    if ($path == '<front>') {
      $path = '';
    }
    elseif (!empty($path) && !$options['alias']) {
      $language = isset($options['language']) && isset($options['language']->language) ? $options['language']->language : '';
      $alias = drupal_get_path_alias($original_path, $language);
      if ($alias != $original_path) {
        $path = $alias;
      }
    }
    return $path;
  }
  function assertAlias($source, $alias, array $options = array()) {
    $actual_alias = $this
      ->getPathAlias($source, $options);
    $actual_source = drupal_get_normal_path($alias);
    $args = array(
      '@source' => $source,
      '@alias' => $alias,
      '@source-actual' => $actual_source,
      '@alias-actual' => $actual_alias,
    );
    return $this
      ->assertIdentical($alias, $actual_alias, t("drupal_get_path_alias('@source') was '@alias-actual' and expected '@alias'", $args)) || $this
      ->assertIdentical($source, $actual_source, t("drupal_get_normal_path('@alias') was '@source-actual' and expected '@source'", $args));
  }
  function assertNoAlias($source, array $options = array()) {
    return $this
      ->assertAlias($source, $source, $options);
  }
  function addAlias($source, $alias, $langcode = LANGUAGE_NONE) {
    $alias = array(
      'source' => $source,
      'alias' => $alias,
      'language' => $langcode,
    );
    path_save($alias);
    drupal_clear_path_cache();
  }

}

Classes

Namesort descending Description
SubPathautoUnitTestCase @file Test integration for the subpathauto.module.