'Drupal match path', 'description' => 'Tests the drupal_match_path() function to make sure it works properly.', 'group' => 'Path API', ); } function setUp() { // Set up the database and testing environment. parent::setUp(); // Set up a random site front page to test the '' placeholder. $this->front = $this->randomName(); variable_set('site_frontpage', $this->front); // Refresh our static variables from the database. $this->refreshVariables(); } /** * Run through our test cases, making sure each one works as expected. */ function testDrupalMatchPath() { // Set up our test cases. $tests = $this->drupalMatchPathTests(); foreach ($tests as $patterns => $cases) { foreach ($cases as $path => $expected_result) { $actual_result = drupal_match_path($path, $patterns); $this->assertIdentical($actual_result, $expected_result, 'Tried matching the path ' . $path . ' to the pattern
' . $patterns . '
- expected ' . var_export($expected_result, TRUE) . ', got ' . var_export($actual_result, TRUE) . '.'); } } } /** * Helper function for testDrupalMatchPath(): set up an array of test cases. * * @return * An array of test cases to cycle through. */ private function drupalMatchPathTests() { return array( // Single absolute paths. 'blog/1' => array( 'blog/1' => TRUE, 'blog/2' => FALSE, 'test' => FALSE, ), // Single paths with wildcards. 'blog/*' => array( 'blog/1' => TRUE, 'blog/2' => TRUE, 'blog/3/edit' => TRUE, 'blog/' => TRUE, 'blog' => FALSE, 'test' => FALSE, ), // Single paths with multiple wildcards. 'node/*/revisions/*' => array( 'node/1/revisions/3' => TRUE, 'node/345/revisions/test' => TRUE, 'node/23/edit' => FALSE, 'test' => FALSE, ), // Single paths with ''. '' => array( $this->front => TRUE, "$this->front/" => FALSE, "$this->front/edit" => FALSE, 'node' => FALSE, '' => FALSE, ), // Paths with both '' and wildcards (should not work). '/*' => array( $this->front => FALSE, "$this->front/" => FALSE, "$this->front/edit" => FALSE, 'node/12' => FALSE, '' => FALSE, ), // Multiple paths with the \n delimiter. "node/*\nnode/*/edit" => array( 'node/1' => TRUE, 'node/view' => TRUE, 'node/32/edit' => TRUE, 'node/delete/edit' => TRUE, 'node/50/delete' => TRUE, 'test/example' => FALSE, ), // Multiple paths with the \r delimiter. "user/*\rblog/*" => array( 'user/1' => TRUE, 'blog/1' => TRUE, 'user/1/blog/1' => TRUE, 'user/blog' => TRUE, 'test/example' => FALSE, 'user' => FALSE, 'blog' => FALSE, ), // Multiple paths with the \r\n delimiter. "test\r\n" => array( 'test' => TRUE, $this->front => TRUE, 'example' => FALSE, ), // Test existing regular expressions (should be escaped). '[^/]+?/[0-9]' => array( 'test/1' => FALSE, '[^/]+?/[0-9]' => TRUE, ), ); } } /** * Tests hook_url_alter functions. */ class UrlAlterFunctionalTest extends DrupalWebTestCase { public static function getInfo() { return array( 'name' => t('URL altering'), 'description' => t('Tests hook_url_inbound_alter() and hook_url_outbound_alter().'), 'group' => t('Path API'), ); } function setUp() { parent::setUp('path', 'forum', 'url_alter_test'); } /** * Test that URL altering works and that it occurs in the correct order. */ function testUrlAlter() { $account = $this->drupalCreateUser(array('administer url aliases')); $this->drupalLogin($account); $uid = $account->uid; $name = $account->name; // Test a single altered path. $this->assertUrlInboundAlter("user/$name", "user/$uid"); $this->assertUrlOutboundAlter("user/$uid", "user/$name"); // Test that a path always uses its alias. $path = array('source' => "user/$uid/test1", 'alias' => 'alias/test1'); path_save($path); $this->assertUrlInboundAlter('alias/test1', "user/$uid/test1"); $this->assertUrlOutboundAlter("user/$uid/test1", 'alias/test1'); // Test that alias source paths are normalized in the interface. $edit = array('source' => "user/$name/edit", 'alias' => 'alias/test2'); $this->drupalPost('admin/config/search/path/add', $edit, t('Save')); $this->assertText(t('The alias has been saved.')); // Test that a path always uses its alias. $this->assertUrlInboundAlter('alias/test2', "user/$uid/edit"); $this->assertUrlOutboundAlter("user/$uid/edit", 'alias/test2'); // Test a non-existant user is not altered. $uid++; $this->assertUrlInboundAlter("user/$uid", "user/$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->assertUrlInboundAlter('community', 'forum'); $this->assertUrlOutboundAlter('forum', 'community'); $forum_vid = db_query("SELECT vid FROM {taxonomy_vocabulary} WHERE module = 'forum'")->fetchField(); $tid = db_insert('taxonomy_term_data') ->fields(array( 'name' => $this->randomName(), 'vid' => $forum_vid, )) ->execute(); $this->assertUrlInboundAlter("community/$tid", "forum/$tid"); $this->assertUrlOutboundAlter("forum/$tid", "community/$tid"); } /** * Test current_path() and request_path(). */ function testCurrentUrlRequestedPath() { $this->drupalGet('url-alter-test/bar'); $this->assertRaw('request_path=url-alter-test/bar', 'request_path() returns the requested path.'); $this->assertRaw('current_path=url-alter-test/foo', 'current_path() returns the internal path.'); } /** * Assert that an outbound path is altered to an expected value. * * @param $original * A string with the original path that is run through url(). * @param $final * A string with the expected result after url(). * @return * TRUE if $original was correctly altered to $final, FALSE otherwise. */ protected function assertUrlOutboundAlter($original, $final) { // Test outbound altering. $result = url($original); $base_path = base_path() . (variable_get('clean_url', '0') ? '' : '?q='); $result = substr($result, strlen($base_path)); $this->assertIdentical($result, $final, 'Altered outbound URL ' . $original . ', expected ' . $final . ', and got ' . $result . '.'); } /** * Assert that a inbound path is altered to an expected value. * * @param $original * A string with the aliased or un-normal path that is run through * drupal_get_normal_path(). * @param $final * A string with the expected result after url(). * @return * TRUE if $original was correctly altered to $final, FALSE otherwise. */ protected function assertUrlInboundAlter($original, $final) { // Test inbound altering. $result = drupal_get_normal_path($original); $this->assertIdentical($result, $final, 'Altered inbound URL ' . $original . ', expected ' . $final . ', and got ' . $result . '.'); } }