diff --git a/modules/simpletest/simpletest.info b/modules/simpletest/simpletest.info index ad42f17c4dadac5fc74ffb1df61455f677f5f681..ff646b303fd8e1726ec3dc634811be456a95aef9 100644 --- a/modules/simpletest/simpletest.info +++ b/modules/simpletest/simpletest.info @@ -28,6 +28,7 @@ files[] = tests/lock.test files[] = tests/mail.test files[] = tests/menu.test files[] = tests/module.test +files[] = tests/path.test files[] = tests/registry.test files[] = tests/schema.test files[] = tests/session.test diff --git a/modules/simpletest/tests/path.test b/modules/simpletest/tests/path.test new file mode 100644 index 0000000000000000000000000000000000000000..f76ea4089c4f13aa02cc9639915ffafa3d99710e --- /dev/null +++ b/modules/simpletest/tests/path.test @@ -0,0 +1,128 @@ +<?php +// $Id$ + +/** + * @file + * Tests for path.inc. + */ + +/** + * Unit tests for the drupal_match_path() function in path.inc. + * + * @see drupal_match_path(). + */ +class DrupalMatchPathTestCase extends DrupalWebTestCase { + protected $front; + + public static function getInfo() { + return array( + 'name' => '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 '<front>' 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 <code>@path</code> to the pattern <pre>@patterns</pre> - 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 '<front>'. + '<front>' => array( + $this->front => TRUE, + "$this->front/" => FALSE, + "$this->front/edit" => FALSE, + 'node' => FALSE, + '' => FALSE, + ), + // Paths with both '<front>' and wildcards (should not work). + '<front>/*' => 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<front>" => array( + 'test' => TRUE, + $this->front => TRUE, + 'example' => FALSE, + ), + // Test existing regular expressions (should be escaped). + '[^/]+?/[0-9]' => array( + 'test/1' => FALSE, + '[^/]+?/[0-9]' => TRUE, + ), + ); + } +}