'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, t('Tried matching the path @path to the pattern
@patterns
- expected @expected, got @actual.', array('@path' => $path, '@patterns' => $patterns, '@expected' => var_export($expected_result, TRUE), '@actual' => 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('Create new alias')); $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. $this->assertUrlInboundAlter('community', 'forum'); $this->assertUrlOutboundAlter('forum', 'community'); // Add a forum to test url altering. $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(); // Test that a existing forum URL is altered. $this->assertUrlInboundAlter("community/$tid", "forum/$tid"); $this->assertUrlOutboundAlter("taxonomy/term/$tid", "community/$tid"); // Test that a non-existant forum URL is not altered. $tid++; $this->assertUrlInboundAlter("taxonomy/term/$tid", "taxonomy/term/$tid"); $this->assertUrlOutboundAlter("taxonomy/term/$tid", "taxonomy/term/$tid"); } /** * 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, t('Altered outbound URL %original, expected %final, and got %result.', array('%original' => $original, '%final' => $final, '%result' => $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, t('Altered inbound URL %original, expected %final, and got %result.', array('%original' => $original, '%final' => $final, '%result' => $result))); } }