Expected Path: !expected_path
Expected Status Code: !expected_status
Location: !location
Status: !status'); define('SUCCESS_MESSAGE', 'SUCCESS
Expected Path: !expected_path
Expected Status Code: !expected_status
Location: !location
Status: !status'); /** * @file * Global Redirect functionality tests */ class GlobalRedirectTestCase extends DrupalWebTestCase { function setUp() { parent::setUp('path', 'globalredirect', 'taxonomy', 'forum'); // Create a user $user = $this->drupalCreateUser(array( 'access content', 'create page content', 'create url aliases', )); $this->drupalLogin($user); // Create a dummy node $node = array( 'type' => 'page', 'title' => 'Test Page Node', 'path' => array('alias' => 'test-node'), ); // Save the node $node = $this->drupalCreateNode($node); // Create an alias for the create story path - this is used in the "redirect with permissions testing" test. $path = array('source' => 'node/add/article', 'alias' => 'node-add-artice'); path_save($path); // The forum vocab should already be created - should be term 1? $forum_term = (object)array( 'vid' => variable_get('forum_nav_vocabulary', 0), 'name' => 'Test Forum Term', ); taxonomy_term_save($forum_term); // Create another test vocab (with a default module) - should be vocab 2? $vocab = (object)array( 'name' => 'test vocab', 'multiple' => 0, 'required' => 0, 'hierarchy' => 0, 'module' => 'taxonomy', 'nodes' => array('page', 'story'), ); taxonomy_vocabulary_save($vocab); $vocab = taxonomy_vocabulary_load($vocab->vid, TRUE); // Create a test term - Should be term 2? $term = (object)array( 'vid' => $vocab->vid, 'name' => 'Test Term', 'path' => array('alias' => 'test-term'), ); taxonomy_term_save($term); $term = taxonomy_term_load($term->tid); } protected function _globalredirect_batch_test() { // Get the settings $settings = _globalredirect_get_settings(); $this->assert('pass', '
' . print_r($settings, TRUE) . '
'); // Array of request => "array of expected data" pairs. // The array must have a return-code key (with a numeric HTTP code as a value (eg 301 or 200). // The array may also have an expected-path key with a value representing the expected path. If this is ommitted, the request is passed through url(). $test_paths = array( // "" is the frontpage. Should NOT redirect. -- Test for normal requests array( 'request' => '', 'return-code' => 200, 'expected-path' => '', ), // "node" is the default frontpage. Should redirect to base path. --- Test for frontpage redirect array( 'request' => 'node', 'return-code' => 301, 'expected-path' => '', ), // "node/1" has been defined above as having an alias ("test-node"). Should 301 redirect to the alias. --- Test for source path request on aliased path array( 'request' => 'node/1', 'return-code' => 301, ), // "node/add/article" has an alias, however the redirect depends on the menu_check setting --- Test for access request to secured url array( 'request' => 'node/add/article', 'return-code' => $settings['menu_check'] ? 403 : 301, ), // "user/[uid]/" has no alias, but the redirect depends on the $deslash_check setting --- Test for deslashing redirect array( 'request' => 'user/' . $this->loggedInUser->uid . '/', 'return-code' => $settings['deslash'] ? 301 : 200, 'expected-path' => 'user/' . $this->loggedInUser->uid, ), // NonClean to Clean check 1 --- This should always redirect as we're requesting an aliased path in unaliased form (albeit also unclean) array( 'request' => url('', array('absolute' => TRUE)), 'options' => array('query' => array('q' => 'node/1'), 'external' => TRUE), 'return-code' => 301, 'expected-path' => 'test-node', ), // NonClean to Clean check 2 --- This may or may not redirect, depending on the state of nonclean_to_clean as we're requesting an unaliased path array( 'request' => url('', array('absolute' => TRUE)), 'options' => array('query' => array('q' => 'node/add/page'), 'external' => TRUE), 'return-code' => $settings['nonclean_to_clean'] ? 301 : 200, 'expected-path' => $settings['nonclean_to_clean'] ? 'node/add/page' : '?q=node/add/page', ), // Case Sensitive URL Check --- This may or may not redirect, depending on the state of case_sensitive_urls as we're requesting an aliased path in the wrong case array( 'request' => 'Test-Node', 'options' => array('external' => TRUE), 'return-code' => $settings['case_sensitive_urls'] ? 301 : 200, 'expected-path' => $settings['case_sensitive_urls'] ? 'test-node' : 'Test-Node', ), // Term Path Handler Check --- This may or may not redirect, depending on the state of term_path_handler as we're requesting an aliased path with the wrong source array( 'request' => 'taxonomy/term/1', // TODO: WE're assumeing term 1 is the forum tid created in setUp() - bad? 'return-code' => $settings['term_path_handler'] ? 301 : 200, 'expected-path' => $settings['term_path_handler'] ? 'forum/1' : 'taxonomy/term/1', ), // Trailing Zero Check --- This may or may not redirect, depending on the state of trailing_zero, as we're requesting an aliased path with a trailing zero source // If 1, we trim ALL trailing /0... If 0 (disabled) or 2 (taxonomy term only), then a 200 response should be issued. array( 'request' => 'node/1/0', 'return-code' => $settings['trailing_zero'] == 1 ? 301 : 200, 'expected-path' => $settings['trailing_zero'] == 1 ? 'test-node' : 'node/1/0', ), // Trailing Zero Check --- This may or may not redirect, depending on the state of trailing_zero, as we're requesting an aliased path with a trailing zero source // If not disabled, then we should trim from taxonomy/term/1/0 array( 'request' => 'taxonomy/term/2/0', 'return-code' => $settings['trailing_zero'] > 0 ? 301 : 200, 'expected-path' => $settings['trailing_zero'] > 0 ? 'test-term' : 'taxonomy/term/2/0', ), ); // Foreach of the above, lets check they redirect correctly foreach ($test_paths as $path) { $path['options'] = isset($path['options']) ? $path['options'] + array('absolute' => TRUE) : array('absolute' => TRUE); $request_path = url($path['request'], $path['options'] + array('alias' => TRUE)); // Display a message tellingthe user what we're testing $this->pass(t('Requesting: !path', array('!path' => $request_path))); // Do a HEAD request (don't care about the body). The alias=>TRUE is to tell Drupal not to lookup the alias - this is a raw request. $this->drupalHead($request_path, array('alias' => TRUE)); // Grab the headers from the request $headers = $this->drupalGetHeaders(TRUE); // Build a nice array of results $result = array( '!expected_status' => $path['return-code'], '!location' => isset($headers[0]['location']) ? $headers[0]['location'] : 'N/A', '!status' => $headers[0][':status'], ); // If the expected result is not a redirect, then there is no expected path in the location header. if ($path['return-code'] != 301) { $result['!expected_path'] = 'N/A'; } else { $url_options = array('absolute' => TRUE); if (isset($path['expected-path'])) { // If we have an expected path provided, use this and tell url() not to do an alias lookup $expected = $path['expected-path']; $url_options['alias'] = TRUE; } else { // Otherwise set the path to the request and let url() do an alias lookup. $expected = $path['request']; } $result['!expected_path'] = url($expected, $url_options); } // First test - is the status as expected? (Note: The expected status must be cast to string for strpos to work) if (strpos($result['!status'], (string)$result['!expected_status']) !== FALSE) { // Ok, we have a status and the status contains the appropriate response code (eg, 200, 301, 403 or 404). // Next test (if expected return code is 301) - is the location set, and is it as expected? if ($result['!expected_status'] == 301 && $result['!location'] == $result['!expected_path']) { // We have redirect and ended up in the right place - a PASS!!! $this->pass(t(SUCCESS_MESSAGE, $result), 'GlobalRedirect'); } elseif ($result['!expected_status'] != 301) { // We weren't supposed to redirect - this is good! $this->pass(t(SUCCESS_MESSAGE, $result), 'GlobalRedirect'); } else { // In this case either the return-code or the returned location is unexpected $this->fail(t(ERROR_MESSAGE, $result), 'GlobalRedirect'); $this->fail('
' . print_r($headers, TRUE) . '
'); } } else { // The status either wasn't present or was not as expected $this->fail(t(ERROR_MESSAGE, $result), 'GlobalRedirect'); $this->fail('
' . print_r($headers, TRUE) . '
'); } } } } class GlobalRedirectTestCaseDefault extends GlobalRedirectTestCase { function getInfo() { return array( 'name' => '1. Global Redirect - Default Settings', 'description' => 'Ensure that Global Redirect functions correctly', 'group' => 'Global Redirect', ); } function testGlobalRedirect() { variable_set('globalredirect_settings', array( 'deslash' => 1, 'menu_check' => 0, 'nonclean_to_clean' => 1, 'case_sensitive_urls' => 1, 'term_path_handler' => 0, )); $this->_globalredirect_batch_test(); } } class GlobalRedirectTestCaseConfigAlpha extends GlobalRedirectTestCase { function getInfo() { return array( 'name' => '2. Global Redirect - Config Alpha', 'description' => 'Ensure that Global Redirect functions correctly', 'group' => 'Global Redirect', ); } function testGlobalRedirect() { variable_set('globalredirect_settings', array( 'deslash' => 0, 'menu_check' => 1, 'nonclean_to_clean' => 0, 'case_sensitive_urls' => 0, 'term_path_handler' => 1, )); $this->_globalredirect_batch_test(); } }