AliasTest.php 6.58 KB
Newer Older
1 2 3 4 5 6 7 8 9
<?php

/**
 * @file
 * Definition of Drupal\system\Tests\Path\CrudTest.
 */

namespace Drupal\system\Tests\Path;

10
use Drupal\simpletest\DrupalUnitTestBase;
11 12 13 14 15 16 17
use Drupal\Core\Database\Database;
use Drupal\Core\Path\Path;
use Drupal\Core\Path\AliasManager;

/**
 * Tests path alias CRUD and lookup functionality.
 */
18
class AliasTest extends DrupalUnitTestBase {
19 20 21 22 23 24 25 26 27

  public static function getInfo() {
    return array(
      'name' => t('Path Alias Unit Tests'),
      'description' => t('Tests path alias CRUD and lookup functionality.'),
      'group' => t('Path API'),
    );
  }

28 29
  public function setUp() {
    parent::setUp();
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
    $this->fixtures = new UrlAliasFixtures();
  }

  public function tearDown() {
    $this->fixtures->dropTables(Database::getConnection());

    parent::tearDown();
  }


  function testCRUD() {
    //Prepare database table.
    $connection = Database::getConnection();
    $this->fixtures->createTables($connection);

    //Create AliasManager and Path object.
46
    $aliasManager = new AliasManager($connection, $this->container->get('keyvalue'));
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
    $path = new Path($connection, $aliasManager);

    $aliases = $this->fixtures->sampleUrlAliases();

    //Create a few aliases
    foreach ($aliases as $idx => $alias) {
      $path->save($alias['source'], $alias['alias'], $alias['langcode']);

      $result = $connection->query('SELECT * FROM {url_alias} WHERE source = :source AND alias= :alias AND langcode = :langcode', array(':source' => $alias['source'], ':alias' => $alias['alias'], ':langcode' => $alias['langcode']));
      $rows = $result->fetchAll();

      $this->assertEqual(count($rows), 1, format_string('Created an entry for %alias.', array('%alias' => $alias['alias'])));

      //Cache the pid for further tests.
      $aliases[$idx]['pid'] = $rows[0]->pid;
    }

    //Load a few aliases
    foreach ($aliases as $alias) {
      $pid = $alias['pid'];
      $loadedAlias = $path->load(array('pid' => $pid));
      $this->assertEqual($loadedAlias, $alias, format_string('Loaded the expected path with pid %pid.', array('%pid' => $pid)));
    }

    //Update a few aliases
    foreach ($aliases as $alias) {
      $path->save($alias['source'], $alias['alias'] . '_updated', $alias['langcode'], $alias['pid']);

      $result = $connection->query('SELECT pid FROM {url_alias} WHERE source = :source AND alias= :alias AND langcode = :langcode', array(':source' => $alias['source'], ':alias' => $alias['alias'] . '_updated', ':langcode' => $alias['langcode']));
      $pid = $result->fetchField();

      $this->assertEqual($pid, $alias['pid'], format_string('Updated entry for pid %pid.', array('%pid' => $pid)));
    }

    //Delete a few aliases
    foreach ($aliases as $alias) {
      $pid = $alias['pid'];
      $path->delete(array('pid' => $pid));

      $result = $connection->query('SELECT * FROM {url_alias} WHERE pid = :pid', array(':pid' => $pid));
      $rows = $result->fetchAll();

      $this->assertEqual(count($rows), 0, format_string('Deleted entry with pid %pid.', array('%pid' => $pid)));
    }
  }

  function testLookupPath() {
    //Prepare database table.
    $connection = Database::getConnection();
    $this->fixtures->createTables($connection);

    //Create AliasManager and Path object.
99
    $aliasManager = new AliasManager($connection, $this->container->get('keyvalue'));
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
    $pathObject = new Path($connection, $aliasManager);

    // Test the situation where the source is the same for multiple aliases.
    // Start with a language-neutral alias, which we will override.
    $path = array(
      'source' => "user/1",
      'alias' => 'foo',
    );

    $pathObject->save($path['source'], $path['alias']);
    $this->assertEqual($aliasManager->getPathAlias($path['source']), $path['alias'], 'Basic alias lookup works.');
    $this->assertEqual($aliasManager->getSystemPath($path['alias']), $path['source'], 'Basic source lookup works.');

    // Create a language specific alias for the default language (English).
    $path = array(
      'source' => "user/1",
      'alias' => "users/Dries",
      'langcode' => 'en',
    );
    $pathObject->save($path['source'], $path['alias'], $path['langcode']);
    $this->assertEqual($aliasManager->getPathAlias($path['source']), $path['alias'], 'English alias overrides language-neutral alias.');
    $this->assertEqual($aliasManager->getSystemPath($path['alias']), $path['source'], 'English source overrides language-neutral source.');

    // Create a language-neutral alias for the same path, again.
    $path = array(
      'source' => "user/1",
      'alias' => 'bar',
    );
    $pathObject->save($path['source'], $path['alias']);
    $this->assertEqual($aliasManager->getPathAlias($path['source']), "users/Dries", 'English alias still returned after entering a language-neutral alias.');

    // Create a language-specific (xx-lolspeak) alias for the same path.
    $path = array(
      'source' => "user/1",
      'alias' => 'LOL',
      'langcode' => 'xx-lolspeak',
    );
    $pathObject->save($path['source'], $path['alias'], $path['langcode']);
    $this->assertEqual($aliasManager->getPathAlias($path['source']), "users/Dries", 'English alias still returned after entering a LOLspeak alias.');
    // The LOLspeak alias should be returned if we really want LOLspeak.
    $this->assertEqual($aliasManager->getPathAlias($path['source'], 'xx-lolspeak'), 'LOL', 'LOLspeak alias returned if we specify xx-lolspeak to the alias manager.');

    // Create a new alias for this path in English, which should override the
    // previous alias for "user/1".
    $path = array(
      'source' => "user/1",
      'alias' => 'users/my-new-path',
      'langcode' => 'en',
    );
    $pathObject->save($path['source'], $path['alias'], $path['langcode']);
    $this->assertEqual($aliasManager->getPathAlias($path['source']), $path['alias'], 'Recently created English alias returned.');
    $this->assertEqual($aliasManager->getSystemPath($path['alias']), $path['source'], 'Recently created English source returned.');

    // Remove the English aliases, which should cause a fallback to the most
    // recently created language-neutral alias, 'bar'.
    $pathObject->delete(array('langcode' => 'en'));
    $this->assertEqual($aliasManager->getPathAlias($path['source']), 'bar', 'Path lookup falls back to recently created language-neutral alias.');

    // Test the situation where the alias and language are the same, but
    // the source differs. The newer alias record should be returned.
    $pathObject->save('user/2', 'bar');
    $this->assertEqual($aliasManager->getSystemPath('bar'), 'user/2', 'Newer alias record is returned when comparing two LANGUAGE_NOT_SPECIFIED paths with the same alias.');
  }
}