You are here

public function UrlAlterFunctionalTest::testUrlAlter in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/path_alias/tests/src/Functional/UrlAlterFunctionalTest.php \Drupal\Tests\path_alias\Functional\UrlAlterFunctionalTest::testUrlAlter()
  2. 10 core/modules/path_alias/tests/src/Functional/UrlAlterFunctionalTest.php \Drupal\Tests\path_alias\Functional\UrlAlterFunctionalTest::testUrlAlter()

Test that URL altering works and that it occurs in the correct order.

File

core/modules/path_alias/tests/src/Functional/UrlAlterFunctionalTest.php, line 36

Class

UrlAlterFunctionalTest
Tests altering the inbound path and the outbound path.

Namespace

Drupal\Tests\path_alias\Functional

Code

public function testUrlAlter() {

  // Ensure that the path_alias table exists after Drupal installation.
  $this
    ->assertTrue(Database::getConnection()
    ->schema()
    ->tableExists('path_alias'), 'The path_alias table exists after Drupal installation.');

  // User names can have quotes and plus signs so we should ensure that URL
  // altering works with this.
  $account = $this
    ->drupalCreateUser([
    'administer url aliases',
  ], "a'foo+bar");
  $this
    ->drupalLogin($account);
  $uid = $account
    ->id();
  $name = $account
    ->getAccountName();

  // Test a single altered path.
  $this
    ->drupalGet("user/{$name}");
  $this
    ->assertSession()
    ->statusCodeEquals(200);
  $this
    ->assertUrlOutboundAlter("/user/{$uid}", "/user/{$name}");

  // Test that a path always uses its alias.
  $this
    ->createPathAlias("/user/{$uid}/test1", '/alias/test1');
  $this
    ->rebuildContainer();
  $this
    ->assertUrlInboundAlter('/alias/test1', "/user/{$uid}/test1");
  $this
    ->assertUrlOutboundAlter("/user/{$uid}/test1", '/alias/test1');

  // Test adding an alias via the UI.
  $edit = [
    'path[0][value]' => "/user/{$uid}/edit",
    'alias[0][value]' => '/alias/test2',
  ];
  $this
    ->drupalPostForm('admin/config/search/path/add', $edit, t('Save'));
  $this
    ->assertText(t('The alias has been saved.'));
  $this
    ->drupalGet('alias/test2');
  $this
    ->assertSession()
    ->statusCodeEquals(200);
  $this
    ->assertUrlOutboundAlter("/user/{$uid}/edit", '/alias/test2');

  // Test a non-existent user is not altered.
  $uid++;
  $this
    ->assertUrlOutboundAlter("/user/{$uid}", "/user/{$uid}");

  // Test that 'forum' is altered to 'community' correctly, both at the root
  // level and for a specific existing forum.
  $this
    ->drupalGet('community');
  $this
    ->assertText('General discussion', 'The community path gets resolved correctly');
  $this
    ->assertUrlOutboundAlter('/forum', '/community');
  $forum_vid = $this
    ->config('forum.settings')
    ->get('vocabulary');
  $term_name = $this
    ->randomMachineName();
  $term = Term::create([
    'name' => $term_name,
    'vid' => $forum_vid,
  ]);
  $term
    ->save();
  $this
    ->drupalGet("community/" . $term
    ->id());
  $this
    ->assertText($term_name, 'The community/{tid} path gets resolved correctly');
  $this
    ->assertUrlOutboundAlter("/forum/" . $term
    ->id(), "/community/" . $term
    ->id());

  // Test outbound query string altering.
  $url = Url::fromRoute('user.login');
  $this
    ->assertIdentical(\Drupal::request()
    ->getBaseUrl() . '/user/login?foo=bar', $url
    ->toString());
}