function PathTestCase::testNodeAlias in Drupal 7
Tests alias functionality through the node interfaces.
File
- modules/
path/ path.test, line 164 - Tests for the Path module.
Class
- PathTestCase
- Provides a base class for testing the Path module.
Code
function testNodeAlias() {
// Create test node.
$node1 = $this
->drupalCreateNode();
// Create alias.
$edit = array();
$edit['path[alias]'] = $this
->randomName(8);
$this
->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Save'));
// Confirm that the alias works.
$this
->drupalGet($edit['path[alias]']);
$this
->assertText($node1->title, 'Alias works.');
$this
->assertResponse(200);
// Change alias to one containing "exotic" characters.
$previous = $edit['path[alias]'];
$edit['path[alias]'] = "- ._~!\$'\"()*@[]?&+%#,;=:" . "%23%25%26%2B%2F%3F" . "éøïвβ中國書۞";
// Characters from various non-ASCII alphabets.
$this
->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Save'));
// Confirm that the alias works.
$this
->drupalGet($edit['path[alias]']);
$this
->assertText($node1->title, 'Changed alias works.');
$this
->assertResponse(200);
// Make sure that previous alias no longer works.
$this
->drupalGet($previous);
$this
->assertNoText($node1->title, 'Previous alias no longer works.');
$this
->assertResponse(404);
// Create second test node.
$node2 = $this
->drupalCreateNode();
// Set alias to second test node.
// Leave $edit['path[alias]'] the same.
$this
->drupalPost('node/' . $node2->nid . '/edit', $edit, t('Save'));
// Confirm that the alias didn't make a duplicate.
$this
->assertText(t('The alias is already in use.'), 'Attempt to moved alias was rejected.');
// Delete alias.
$this
->drupalPost('node/' . $node1->nid . '/edit', array(
'path[alias]' => '',
), t('Save'));
// Confirm that the alias no longer works.
$this
->drupalGet($edit['path[alias]']);
$this
->assertNoText($node1->title, 'Alias was successfully deleted.');
$this
->assertResponse(404);
// Create third test node.
$node3 = $this
->drupalCreateNode();
// Create an invalid alias with a leading slash and verify that the slash
// is removed when the link is generated. This ensures that URL aliases
// cannot be used to inject external URLs.
// @todo The user interface should either display an error message or
// automatically trim these invalid aliases, rather than allowing them to
// be silently created, at which point the functional aspects of this
// test will need to be moved elsewhere and switch to using a
// programmatically-created alias instead.
$alias = $this
->randomName(8);
$edit = array(
'path[alias]' => '/' . $alias,
);
$this
->drupalPost('node/' . $node3->nid . '/edit', $edit, t('Save'));
$this
->drupalGet('admin/content');
// This checks the link href before clicking it, rather than using
// DrupalWebTestCase::assertUrl() after clicking it, because the test
// browser does not always preserve the correct number of slashes in the
// URL when it visits internal links; using DrupalWebTestCase::assertUrl()
// would actually make the test pass unconditionally on the testbot (or
// anywhere else where Drupal is installed in a subdirectory).
$link_xpath = $this
->xpath('//a[normalize-space(text())=:label]', array(
':label' => $node3->title,
));
$link_href = (string) $link_xpath[0]['href'];
$link_prefix = base_path() . (variable_get('clean_url', 0) ? '' : '?q=');
$this
->assertEqual($link_href, $link_prefix . $alias);
$this
->clickLink($node3->title);
$this
->assertResponse(404);
}