You are here

protected function GlobalRedirectTestCase::_globalredirect_batch_test in Global Redirect 6

Same name and namespace in other branches
  1. 7 globalredirect.test \GlobalRedirectTestCase::_globalredirect_batch_test()
2 calls to GlobalRedirectTestCase::_globalredirect_batch_test()
GlobalRedirectTestCaseConfigAlpha::testGlobalRedirect in ./globalredirect.test
GlobalRedirectTestCaseDefault::testGlobalRedirect in ./globalredirect.test

File

./globalredirect.test, line 81
Global Redirect functionality tests

Class

GlobalRedirectTestCase
@file Global Redirect functionality tests

Code

protected function _globalredirect_batch_test() {

  // Get the settings
  $settings = _globalredirect_get_settings();
  $this
    ->assert('pass', '<pre>' . print_r($settings, TRUE) . '</pre>');

  // 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
    // The result depends on settings
    array(
      'request' => 'node',
      'return-code' => $settings['frontpage_redirect'] ? 301 : 200,
      'expected-path' => $settings['frontpage_redirect'] ? '' : 'node',
    ),
    // "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/story" has an alias, however the redirect depends on the menu_check setting --- Test for access request to secured url
    array(
      'request' => 'node/add/story',
      '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('<front>', 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('<front>', 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',
    ),
    // Ensure that the NonClean to Clean with an external URL does not redirect.
    array(
      'request' => url('<front>', array(
        'absolute' => TRUE,
      )),
      'options' => array(
        'query' => array(
          'q' => 'http://www.example.com',
        ),
        'external' => TRUE,
      ),
      'return-code' => 404,
    ),
    array(
      'request' => url('<front>', array(
        'absolute' => TRUE,
      )),
      'options' => array(
        'query' => array(
          'q' => 'http://www.example.com/',
        ),
        'external' => TRUE,
      ),
      'return-code' => 404,
    ),
    // Also test un-escaped query strings with external URLs.
    array(
      'request' => url('<front>', array(
        'absolute' => TRUE,
      )) . '?q=http://www.example.com',
      'options' => array(
        'external' => TRUE,
      ),
      'return-code' => 404,
    ),
    array(
      'request' => url('<front>', array(
        'absolute' => TRUE,
      )) . '?q=http://www.example.com/',
      'options' => array(
        'external' => TRUE,
      ),
      'return-code' => 404,
    ),
    // Test with external URLs in the destination query string.
    array(
      'request' => 'node/1',
      'options' => array(
        'query' => array(
          'destination' => 'http://www.example.com/',
        ),
      ),
      'return-code' => 301,
      'expected-path' => url('test-node', array(
        'absolute' => TRUE,
        'query' => array(
          'destination' => 'http://www.example.com/',
        ),
      )),
    ),
    // 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',
      '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',
    ),
    // Regression test for 867654 - What happens to a term with a zero on the end
    array(
      'request' => 'taxonomy/term/10/0',
      'return-code' => $settings['trailing_zero'] > 0 ? 301 : 404,
      'expected-path' => $settings['trailing_zero'] > 0 ? 'taxonomy/term/10' : 'taxonomy/term/10/0',
    ),
    // Regression test for http://drupal.org/node/867654 - term 10 does not exist
    array(
      'request' => 'admin',
      'return-code' => $settings['ignore_admin_path'] > 0 ? 200 : 301,
      // Ignoring the admin path means no src=>alias redirecting.
      'expected-path' => $settings['ignore_admin_path'] > 0 ? 'admin' : 'administration',
    ),
  );

  // Foreach of the above, lets check they redirect correctly
  foreach ($test_paths as $id => $path) {

    // Overlay some defaults onto the path. This ensures 'options' is set as an array.
    $path += array(
      'options' => array(),
    );

    // If the path doesn't have an absolute or alias setting, set them to TRUE.
    $path['options'] += array(
      'absolute' => TRUE,
      'alias' => TRUE,
    );

    // Build a URL from the path
    $request_path = url($path['request'], $path['options']);

    // Display a message telling the user what we're testing
    $info = array(
      '!id' => $id,
      '!url' => $request_path,
    );
    $this
      ->pass(t(INFO_MESSAGE, $info), 'GlobalRedirect');

    // 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 = $path['options'];
      $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('<pre>' . print_r($headers, TRUE) . '</pre>');
      }
    }
    else {

      // The status either wasn't present or was not as expected
      $this
        ->fail(t(ERROR_MESSAGE, $result), 'GlobalRedirect');
      $this
        ->fail('<pre>' . print_r($headers, TRUE) . '</pre>');
    }
  }
}