View source
<?php
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');
define('INFO_MESSAGE', 'Running Test: !id<br />Requesting URL: !url<br />Path Info:<br />!path');
class GlobalRedirectTestCase extends DrupalWebTestCase {
private $gr_forum_term;
private $gr_term;
function setUp(array $modules = array()) {
$modules[] = 'path';
$modules[] = 'globalredirect';
$modules[] = 'taxonomy';
$modules[] = 'forum';
parent::setUp($modules);
variable_set('clean_url', 1);
$this->normal_user = $this
->drupalCreateUser(array(
'access content',
'create page content',
'create url aliases',
'access administration pages',
));
$this
->drupalLogin($this->normal_user);
$node = array(
'type' => 'page',
'title' => 'Test Page Node',
'path' => array(
'alias' => 'test-node',
),
'language' => LANGUAGE_NONE,
);
$node = $this
->drupalCreateNode($node);
$path = array(
'source' => 'node/add/article',
'alias' => 'node-add-article',
);
path_save($path);
$path = array(
'source' => 'admin',
'alias' => 'administration',
);
path_save($path);
$forum_term = (object) array(
'vid' => variable_get('forum_nav_vocabulary', 0),
'name' => 'Test Forum Term',
);
taxonomy_term_save($forum_term);
$this->gr_forum_term = taxonomy_term_load($forum_term->tid);
$vocab = (object) array(
'name' => 'test vocab',
'machine_name' => 'test-vocab',
'hierarchy' => 0,
'module' => 'taxonomy',
);
taxonomy_vocabulary_save($vocab);
$vocab = taxonomy_vocabulary_load($vocab->vid, TRUE);
$term = (object) array(
'vid' => $vocab->vid,
'name' => 'Test Term',
'path' => array(
'alias' => 'test-term',
),
);
taxonomy_term_save($term);
$this->gr_term = taxonomy_term_load($term->tid);
}
protected function _globalredirect_test_paths() {
$settings = _globalredirect_get_settings();
$this
->assert('pass', '<pre>' . print_r($settings, TRUE) . '</pre>');
return array(
array(
'request' => '',
'return-code' => 200,
'expected-path' => '',
),
array(
'request' => 'node',
'return-code' => $settings['frontpage_redirect'] ? 301 : 200,
'expected-path' => $settings['frontpage_redirect'] ? '' : 'node',
),
array(
'request' => 'node/1',
'return-code' => 301,
),
array(
'request' => 'node/add/article',
'return-code' => $settings['menu_check'] ? 403 : 301,
),
array(
'request' => 'user/' . $this->loggedInUser->uid . '/',
'return-code' => $settings['deslash'] ? 301 : 200,
'expected-path' => 'user/' . $this->loggedInUser->uid,
),
array(
'request' => url('<front>', array(
'absolute' => TRUE,
)),
'options' => array(
'query' => array(
'q' => 'node/1',
),
'external' => TRUE,
),
'return-code' => 301,
'expected-path' => 'test-node',
),
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',
),
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,
),
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,
),
array(
'request' => 'node/1',
'options' => array(
'query' => array(
'destination' => 'http://www.example.com/',
),
),
'return-code' => 301,
'expected-path' => 'test-node',
),
array(
'request' => 'Test-Node',
'options' => array(
'external' => TRUE,
),
'return-code' => $settings['case_sensitive_urls'] ? db_driver() == 'sqlite' ? 404 : 301 : (db_driver() == 'sqlite' ? 404 : 200),
'expected-path' => $settings['case_sensitive_urls'] ? 'test-node' : 'Test-Node',
),
array(
'request' => 'taxonomy/term/' . $this->gr_forum_term->tid,
'return-code' => $settings['term_path_handler'] ? 301 : 200,
'expected-path' => $settings['term_path_handler'] ? 'forum/' . $this->gr_forum_term->tid : 'taxonomy/term/' . $this->gr_forum_term->tid,
),
array(
'request' => 'node/1/0',
'return-code' => $settings['trailing_zero'] == 1 ? 301 : 200,
'expected-path' => $settings['trailing_zero'] == 1 ? 'test-node' : 'node/1/0',
),
array(
'request' => 'taxonomy/term/' . $this->gr_term->tid . '/0',
'return-code' => $settings['trailing_zero'] > 0 ? 301 : 200,
'expected-path' => $settings['trailing_zero'] > 0 ? 'test-term' : 'taxonomy/term/' . $this->gr_term->tid . '/0',
),
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',
),
array(
'request' => 'admin',
'return-code' => $settings['ignore_admin_path'] > 0 ? 200 : 301,
'expected-path' => $settings['ignore_admin_path'] > 0 ? 'admin' : 'administration',
),
);
}
protected function _globalredirect_batch_test() {
$path_defaults = array(
'options' => array(),
);
$path_options_defaults = array(
'base_url' => $GLOBALS['base_url'] . base_path(),
'absolute' => TRUE,
'alias' => TRUE,
'external' => TRUE,
);
$test_paths = $this
->_globalredirect_test_paths();
$this
->assert('pass', '<pre>' . print_r($test_paths, TRUE) . '</pre>');
foreach ($test_paths as $id => $path) {
$path += $path_defaults;
$path['options'] += $path_options_defaults;
$request_path = $path['options']['external'] ? $path['options']['base_url'] . $path['request'] : $path['request'];
$request_path = url($request_path, $path['options']);
$info = array(
'!id' => $id,
'!path' => '<pre>' . print_r($path, TRUE) . '</pre>',
'!url' => $request_path,
);
$this
->pass(t(INFO_MESSAGE, $info), 'GlobalRedirect');
$this
->drupalHead($request_path, array(
'alias' => TRUE,
));
$headers = $this
->drupalGetHeaders(TRUE);
$result = array(
'!expected_status' => $path['return-code'],
'!location' => isset($headers[0]['location']) ? $headers[0]['location'] : 'N/A',
'!status' => $headers[0][':status'],
);
if ($path['return-code'] != 301) {
$result['!expected_path'] = 'N/A';
}
else {
$url_options = array(
'absolute' => TRUE,
);
if (isset($path['expected-path'])) {
$expected = $path['expected-path'];
$url_options['alias'] = TRUE;
}
else {
$expected = $path['request'];
}
$result['!expected_path'] = url($expected, $url_options);
}
if (strpos($result['!status'], (string) $result['!expected_status']) !== FALSE) {
if ($result['!expected_status'] == 301 && $result['!location'] == $result['!expected_path']) {
$this
->pass(t(SUCCESS_MESSAGE, $result), 'GlobalRedirect');
}
elseif ($result['!expected_status'] != 301) {
$this
->pass(t(SUCCESS_MESSAGE, $result), 'GlobalRedirect');
}
else {
$this
->fail(t(ERROR_MESSAGE, $result), 'GlobalRedirect');
$this
->fail('<pre>' . print_r($headers, TRUE) . '</pre>');
}
}
else {
$this
->fail(t(ERROR_MESSAGE, $result), 'GlobalRedirect');
$this
->fail('<pre>' . print_r($headers, TRUE) . '</pre>');
}
}
}
}
class GlobalRedirectTestCaseDefault extends GlobalRedirectTestCase {
public static 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' => 1,
'frontpage_redirect' => 1,
'trailing_zero' => 0,
'ignore_admin_path' => 1,
));
$this
->_globalredirect_batch_test();
}
}
class GlobalRedirectTestCaseConfigAlpha extends GlobalRedirectTestCase {
public static function getInfo() {
return array(
'name' => '2. Global Redirect - Config Alpha',
'description' => 'Ensure that Global Redirect functions correctly. Only enable Trailing Zero',
'group' => 'Global Redirect',
);
}
function testGlobalRedirect() {
variable_set('globalredirect_settings', array(
'deslash' => 0,
'menu_check' => 0,
'nonclean_to_clean' => 0,
'case_sensitive_urls' => 0,
'term_path_handler' => 0,
'frontpage_redirect' => 0,
'trailing_zero' => 1,
'ignore_admin_path' => 0,
));
$this
->_globalredirect_batch_test();
}
}
class GlobalRedirectTestCaseConfigBeta extends GlobalRedirectTestCase {
public static function getInfo() {
return array(
'name' => '3. Global Redirect - Config Beta',
'description' => 'Ensure that Global Redirect functions correctly. Only enable Menu Checking',
'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' => 0,
'frontpage_redirect' => 0,
'trailing_zero' => 0,
));
$this
->_globalredirect_batch_test();
}
}
class GlobalRedirectTestCaseConfigLanguages extends GlobalRedirectTestCase {
public static function getInfo() {
return array(
'name' => '4. Global Redirect - Languages',
'description' => 'Ensure that Global Redirect functions correctly when locales are used',
'group' => 'Global Redirect',
);
}
protected function _globalredirect_test_paths() {
$settings = _globalredirect_get_settings();
$paths = parent::_globalredirect_test_paths();
$paths[] = array(
'request' => 'fr/node/1',
'return-code' => 301,
'expected-path' => 'fr/test-node',
);
$paths[] = array(
'request' => 'node/2',
'return-code' => 301,
'expected-path' => 'test-english-node',
);
$paths[] = array(
'request' => 'node/3',
'return-code' => 301,
'expected-path' => 'test-english-node',
);
$paths[] = array(
'request' => 'fr/node/3',
'return-code' => 301,
'expected-path' => 'fr/test-french-node',
);
$paths[] = array(
'request' => 'fr/node/4',
'return-code' => 301,
'expected-path' => 'fr/test-french-node',
);
$paths[] = array(
'request' => 'de/node/3',
'return-code' => 301,
'expected-path' => 'de/test-german-node',
);
return $paths;
}
function setUp(array $modules = array()) {
parent::setUp(array(
'locale',
'translation',
));
$this->admin_user = $this
->drupalCreateUser(array(
'bypass node access',
'administer nodes',
'administer languages',
'administer content types',
'administer blocks',
'access administration pages',
));
$this
->drupalLogin($this->admin_user);
foreach (array(
'en',
'fr',
'de',
) as $langcode) {
$prefix = '';
if ($langcode != 'en') {
$this
->addLanguage($langcode);
$prefix = $langcode;
}
$edit = array(
'prefix' => $prefix,
);
$this
->drupalPost('admin/config/regional/language/edit/' . $langcode, $edit, t('Save language'));
}
$this
->drupalGet('admin/structure/types/manage/page');
$edit = array();
$edit['language_content_type'] = 2;
$this
->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
$this
->assertRaw(t('The content type %type has been updated.', array(
'%type' => 'Basic page',
)), t('Basic page content type has been updated.'));
$edit = array(
'language[enabled][locale-url]' => TRUE,
);
$this
->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
$this
->assertRaw(t('Language negotiation configuration saved.'), t('URL language detection enabled.'));
drupal_static_reset('locale_url_outbound_alter');
$edit = array(
'locale_language_negotiation_url_part' => 0,
);
$this
->drupalPost('admin/config/regional/language/configure/url', $edit, t('Save configuration'));
$this
->assertRaw(t('The configuration options have been saved.'), t('URL language part set to prefix.'));
$node = array(
'type' => 'page',
'title' => 'Test English Page Node',
'path' => array(
'alias' => 'test-english-node',
),
'language' => 'en',
'tnid' => 2,
'body' => array(
'en' => array(
array(),
),
),
);
$node = $this
->drupalCreateNode($node);
$node = array(
'type' => 'page',
'title' => 'Test French Page Node',
'path' => array(
'alias' => 'test-french-node',
),
'language' => 'fr',
'tnid' => 2,
'body' => array(
'fr' => array(
array(),
),
),
);
$node = $this
->drupalCreateNode($node);
$node = array(
'type' => 'page',
'title' => 'Test German Page Node',
'path' => array(
'alias' => 'test-german-node',
),
'language' => 'de',
'tnid' => 2,
'body' => array(
'de' => array(
array(),
),
),
);
$node = $this
->drupalCreateNode($node);
}
function testGlobalRedirect() {
variable_set('globalredirect_settings', array(
'language_redirect' => 1,
));
$this
->_globalredirect_batch_test();
}
function addLanguage($language_code) {
$this
->drupalGet('admin/config/regional/language');
if (strpos($this
->drupalGetContent(), 'enabled[' . $language_code . ']') === FALSE) {
$edit = array();
$edit['langcode'] = $language_code;
$this
->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
drupal_static_reset('language_list');
$languages = language_list('language');
$this
->assertTrue(array_key_exists($language_code, $languages), t('Language was installed successfully.'));
if (array_key_exists($language_code, $languages)) {
$this
->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array(
'%language' => $languages[$language_code]->name,
'@locale-help' => url('admin/help/locale'),
)), t('Language has been created.'));
}
}
elseif ($this
->xpath('//input[@type="checkbox" and @name=:name and @checked="checked"]', array(
':name' => 'enabled[' . $language_code . ']',
))) {
$this
->assertTrue(true, 'Language [' . $language_code . '] already installed and enabled.');
}
else {
$this
->assertTrue(true, 'Language [' . $language_code . '] already installed.');
$this
->drupalPost(NULL, array(
'enabled[' . $language_code . ']' => TRUE,
), t('Save configuration'));
$this
->assertRaw(t('Configuration saved.'), t('Language successfully enabled.'));
}
}
}