diff --git a/core/modules/simpletest/drupal_web_test_case.php b/core/modules/simpletest/drupal_web_test_case.php index a5fb606..8168257 100644 --- a/core/modules/simpletest/drupal_web_test_case.php +++ b/core/modules/simpletest/drupal_web_test_case.php @@ -3138,8 +3138,21 @@ class DrupalWebTestCase extends DrupalTestCase { * @return * TRUE on pass, FALSE on fail. */ - protected function assertFieldByName($name, $value = '', $message = '') { - return $this->assertFieldByXPath($this->constructFieldXpath('name', $name), $value, $message ? $message : t('Found field by name @name', array('@name' => $name)), t('Browser')); + protected function assertFieldByName($name, $value = NULL, $message = NULL) { + if (!isset($message)) { + if (!isset($value)) { + $message = t('Found field with name @name', array( + '@name' => var_export($name, TRUE), + )); + } + else { + $message = t('Found field with name @name and value @value', array( + '@name' => var_export($name, TRUE), + '@value' => var_export($value, TRUE), + )); + } + } + return $this->assertFieldByXPath($this->constructFieldXpath('name', $name), $value, $message, t('Browser')); } /** diff --git a/core/modules/system/system.test b/core/modules/system/system.test index 12797ed..15c6455 100644 --- a/core/modules/system/system.test +++ b/core/modules/system/system.test @@ -1600,6 +1600,8 @@ class SystemMainContentFallback extends DrupalWebTestCase { * Tests for the theme interface functionality. */ class SystemThemeFunctionalTest extends DrupalWebTestCase { + protected $profile = 'testing'; + public static function getInfo() { return array( 'name' => 'Theme interface functionality', @@ -1609,7 +1611,9 @@ class SystemThemeFunctionalTest extends DrupalWebTestCase { } function setUp() { - parent::setUp(); + parent::setUp(array('block')); + + $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page')); $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'view the administration theme', 'administer themes', 'bypass node access', 'administer blocks')); $this->drupalLogin($this->admin_user); @@ -1618,30 +1622,133 @@ class SystemThemeFunctionalTest extends DrupalWebTestCase { /** * Test the theme settings form. + * + * @todo This test cannot use path_to_theme(), because the testing environment + * is not properly initialized. See http://drupal.org/node/1376122 */ function testThemeSettings() { // Specify a filesystem path to be used for the logo. $file = current($this->drupalGetTestFiles('image')); - $fullpath = drupal_realpath($file->uri); - $edit = array( - 'default_logo' => FALSE, - 'logo_path' => $fullpath, + $file_relative = strtr($file->uri, array('public:/' => variable_get('file_public_path', conf_path() . '/files'))); + $default_theme_path = 'core/themes/stark'; + + $supported_paths = array( + // Raw stream wrapper URI. + $file->uri => array( + 'form' => file_uri_target($file->uri), + 'src' => file_create_url($file->uri), + ), + // Relative path within the public filesystem. + file_uri_target($file->uri) => array( + 'form' => file_uri_target($file->uri), + 'src' => file_create_url($file->uri), + ), + // Relative path to a public file. + $file_relative => array( + 'form' => $file_relative, + 'src' => file_create_url($file->uri), + ), + // Relative path to an arbitrary file. + 'core/misc/druplicon.png' => array( + 'form' => 'core/misc/druplicon.png', + 'src' => $GLOBALS['base_url'] . '/' . 'core/misc/druplicon.png', + ), + // Relative path to a file in a theme. + $default_theme_path . '/logo.png' => array( + 'form' => $default_theme_path . '/logo.png', + 'src' => $GLOBALS['base_url'] . '/' . $default_theme_path . '/logo.png', + ), ); - $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration')); - $this->drupalGet('node'); - $this->assertRaw($fullpath, t('Logo path successfully changed.')); + foreach ($supported_paths as $input => $expected) { + $edit = array( + 'default_logo' => FALSE, + 'logo_path' => $input, + ); + $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration')); + $this->assertNoText('The custom logo path is invalid.'); + $this->assertFieldByName('logo_path', $expected['form']); + + // Verify logo path examples. + $elements = $this->xpath('//div[contains(@class, :item)]/div[@class=:description]/code', array( + ':item' => 'form-item-logo-path', + ':description' => 'description', + )); + // Expected default values (if all else fails). + $implicit_public_file = 'logo.png'; + $explicit_file = 'public://logo.png'; + $local_file = $default_theme_path . '/logo.png'; + // Adjust for fully qualified stream wrapper URI in public filesystem. + if (file_uri_scheme($input) == 'public') { + $implicit_public_file = file_uri_target($input); + $explicit_file = $input; + $local_file = strtr($input, array('public:/' => variable_get('file_public_path', conf_path() . '/files'))); + } + // Adjust for fully qualified stream wrapper URI elsewhere. + elseif (file_uri_scheme($input) !== FALSE) { + $explicit_file = $input; + } + // Adjust for relative path within public filesystem. + elseif ($input == file_uri_target($file->uri)) { + $implicit_public_file = $input; + $explicit_file = 'public://' . $input; + $local_file = variable_get('file_public_path', conf_path() . '/files') . '/' . $input; + } + $this->assertEqual((string) $elements[0], $implicit_public_file); + $this->assertEqual((string) $elements[1], $explicit_file); + $this->assertEqual((string) $elements[2], $local_file); + + // Verify the actual 'src' attribute of the logo being output. + $this->drupalGet(''); + $elements = $this->xpath('//*[@id=:id]/img', array(':id' => 'logo')); + $this->assertEqual((string) $elements[0]['src'], $expected['src']); + } + + $unsupported_paths = array( + // Stream wrapper URI to non-existing file. + 'public://whatever.png', + 'private://whatever.png', + 'temporary://whatever.png', + // Bogus stream wrapper URIs. + 'public:/whatever.png', + '://whatever.png', + ':whatever.png', + 'public://', + // Relative path within the public filesystem to non-existing file. + 'whatever.png', + // Relative path to non-existing file in public filesystem. + variable_get('file_public_path', conf_path() . '/files') . '/whatever.png', + // Semi-absolute path to non-existing file in public filesystem. + '/' . variable_get('file_public_path', conf_path() . '/files') . '/whatever.png', + // Relative path to arbitrary non-existing file. + 'core/misc/whatever.png', + // Semi-absolute path to arbitrary non-existing file. + '/core/misc/whatever.png', + // Absolute paths to any local file (even if it exists). + drupal_realpath($file->uri), + ); + foreach ($unsupported_paths as $path) { + $edit = array( + 'default_logo' => FALSE, + 'logo_path' => $path, + ); + $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration')); + $this->assertText('The custom logo path is invalid.'); + } // Upload a file to use for the logo. - $file = current($this->drupalGetTestFiles('image')); $edit = array( 'default_logo' => FALSE, 'logo_path' => '', 'files[logo_upload]' => drupal_realpath($file->uri), ); - $options = array(); - $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration'), $options); - $this->drupalGet('node'); - $this->assertRaw($file->name, t('Logo file successfully uploaded.')); + $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration')); + + $fields = $this->xpath($this->constructFieldXpath('name', 'logo_path')); + $uploaded_filename = 'public://' . $fields[0]['value']; + + $this->drupalGet(''); + $elements = $this->xpath('//*[@id=:id]/img', array(':id' => 'logo')); + $this->assertEqual($elements[0]['src'], file_create_url($uploaded_filename)); } /** @@ -1700,20 +1807,20 @@ class SystemThemeFunctionalTest extends DrupalWebTestCase { * Test switching the default theme. */ function testSwitchDefaultTheme() { - // Enable "stark" and set it as the default theme. - theme_enable(array('stark')); + // Enable Bartik and set it as the default theme. + theme_enable(array('bartik')); $this->drupalGet('admin/appearance'); - $this->clickLink(t('Set default'), 1); - $this->assertTrue(variable_get('theme_default', '') == 'stark', t('Site default theme switched successfully.')); + $this->clickLink(t('Set default')); + $this->assertEqual(variable_get('theme_default', ''), 'bartik'); // Test the default theme on the secondary links (blocks admin page). $this->drupalGet('admin/structure/block'); - $this->assertText('Stark(' . t('active tab') . ')', t('Default local task on blocks admin page is the default theme.')); - // Switch back to Bartik and test again to test that the menu cache is cleared. + $this->assertText('Bartik(' . t('active tab') . ')', t('Default local task on blocks admin page is the default theme.')); + // Switch back to Stark and test again to test that the menu cache is cleared. $this->drupalGet('admin/appearance'); $this->clickLink(t('Set default'), 0); $this->drupalGet('admin/structure/block'); - $this->assertText('Bartik(' . t('active tab') . ')', t('Default local task on blocks admin page has changed.')); + $this->assertText('Stark(' . t('active tab') . ')', t('Default local task on blocks admin page has changed.')); } }