home | career | drupal | java | mac | mysql | perl | php | scala | uml | unix

Drupal example source code file (globalredirect.test)

This example Drupal source code file (globalredirect.test) is included in the DevDaily.com "Drupal Source Code Warehouse" project. The intent of this project is to help you "Learn Drupal by Example".

PHP - Drupal tags/keywords

200, 301, array, expected-path, function, path, php, request, result, return-code, status, test-node, true

The globalredirect.test Drupal example source code

<?php
// $Id: globalredirect.test,v 1.2 2010/07/13 00:46:27 njt1982 Exp $

define('ERROR_MESSAGE',     'ERROR<br />Expected Path: !expected_path<br />Expected Status Code: !expected_status<br />Location: !location<br />Status: !status');
define('SUCCESS_MESSAGE', 'SUCCESS<br />Expected Path: !expected_path<br />Expected Status Code: !expected_status<br />Location: !location<br />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', '<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
      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('<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',
      ),

      // 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('<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>');
      }
    }
  }
}


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();
  }
}

Other Drupal examples (source code examples)

Here is a short list of links related to this Drupal globalredirect.test source code file:

new blog posts

"Drupal" is a registered trademark of Dries Buytaert.

my drupal tutorials and examples  

Copyright 1998-2016 Alvin Alexander, alvinalexander.com
All Rights Reserved.

Beginning in 2016, a portion of the proceeds from pages under the '/drupal-code-examples/' URI will be donated to charity.