diff options
Diffstat (limited to 'modules/simpletest/tests/theme.test')
-rw-r--r-- | modules/simpletest/tests/theme.test | 490 |
1 files changed, 0 insertions, 490 deletions
diff --git a/modules/simpletest/tests/theme.test b/modules/simpletest/tests/theme.test deleted file mode 100644 index fd881243f66..00000000000 --- a/modules/simpletest/tests/theme.test +++ /dev/null @@ -1,490 +0,0 @@ -<?php - -/** - * @file - * Tests for the theme API. - */ - -/** - * Unit tests for the Theme API. - */ -class ThemeUnitTest extends DrupalWebTestCase { - public static function getInfo() { - return array( - 'name' => 'Theme API', - 'description' => 'Test low-level theme functions.', - 'group' => 'Theme', - ); - } - - function setUp() { - parent::setUp('theme_test'); - theme_enable(array('test_theme')); - } - - /** - * Test function theme_get_suggestions() for SA-CORE-2009-003. - */ - function testThemeSuggestions() { - // Set the front page as something random otherwise the CLI - // test runner fails. - variable_set('site_frontpage', 'nobody-home'); - $args = array('node', '1', 'edit'); - $suggestions = theme_get_suggestions($args, 'page'); - $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1', 'page__node__edit'), t('Found expected node edit page suggestions')); - // Check attack vectors. - $args = array('node', '\\1'); - $suggestions = theme_get_suggestions($args, 'page'); - $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1'), t('Removed invalid \\ from suggestions')); - $args = array('node', '1/'); - $suggestions = theme_get_suggestions($args, 'page'); - $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1'), t('Removed invalid / from suggestions')); - $args = array('node', "1\0"); - $suggestions = theme_get_suggestions($args, 'page'); - $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1'), t('Removed invalid \\0 from suggestions')); - // Define path with hyphens to be used to generate suggestions. - $args = array('node', '1', 'hyphen-path'); - $result = array('page__node', 'page__node__%', 'page__node__1', 'page__node__hyphen_path'); - $suggestions = theme_get_suggestions($args, 'page'); - $this->assertEqual($suggestions, $result, t('Found expected page suggestions for paths containing hyphens.')); - } - - /** - * Preprocess functions for the base hook should run even for suggestion implementations. - */ - function testPreprocessForSuggestions() { - $this->drupalGet('theme-test/suggestion'); - $this->assertText('test_theme_breadcrumb__suggestion: 1', t('Theme hook suggestion ran with data available from a preprocess function for the base hook.')); - } - - /** - * Ensure page-front template suggestion is added when on front page. - */ - function testFrontPageThemeSuggestion() { - $q = $_GET['q']; - // Set $_GET['q'] to node because theme_get_suggestions() will query it to - // see if we are on the front page. - $_GET['q'] = variable_get('site_frontpage', 'node'); - $suggestions = theme_get_suggestions(explode('/', $_GET['q']), 'page'); - // Set it back to not annoy the batch runner. - $_GET['q'] = $q; - $this->assertTrue(in_array('page__front', $suggestions), t('Front page template was suggested.')); - } - - /** - * Ensures theme hook_*_alter() implementations can run before anything is rendered. - */ - function testAlter() { - $this->drupalGet('theme-test/alter'); - $this->assertText('The altered data is test_theme_theme_test_alter_alter was invoked.', t('The theme was able to implement an alter hook during page building before anything was rendered.')); - } - - /** - * Ensures a theme's .info file is able to override a module CSS file from being added to the page. - * - * @see test_theme.info - */ - function testCSSOverride() { - // Reuse the same page as in testPreprocessForSuggestions(). We're testing - // what is output to the HTML HEAD based on what is in a theme's .info file, - // so it doesn't matter what page we get, as long as it is themed with the - // test theme. First we test with CSS aggregation disabled. - variable_set('preprocess_css', 0); - $this->drupalGet('theme-test/suggestion'); - $this->assertNoText('system.base.css', t('The theme\'s .info file is able to override a module CSS file from being added to the page.')); - - // Also test with aggregation enabled, simply ensuring no PHP errors are - // triggered during drupal_build_css_cache() when a source file doesn't - // exist. Then allow remaining tests to continue with aggregation disabled - // by default. - variable_set('preprocess_css', 1); - $this->drupalGet('theme-test/suggestion'); - variable_set('preprocess_css', 0); - } - - /** - * Ensures a themes template is overrideable based on the 'template' filename. - */ - function testTemplateOverride() { - variable_set('theme_default', 'test_theme'); - $this->drupalGet('theme-test/template-test'); - $this->assertText('Success: Template overridden.', t('Template overridden by defined \'template\' filename.')); - } -} - -/** - * Unit tests for theme_table(). - */ -class ThemeTableUnitTest extends DrupalWebTestCase { - public static function getInfo() { - return array( - 'name' => 'Theme Table', - 'description' => 'Tests built-in theme functions.', - 'group' => 'Theme', - ); - } - - /** - * Tableheader.js provides 'sticky' table headers, and is included by default. - */ - function testThemeTableStickyHeaders() { - $header = array('one', 'two', 'three'); - $rows = array(array(1,2,3), array(4,5,6), array(7,8,9)); - $this->content = theme('table', array('header' => $header, 'rows' => $rows)); - $js = drupal_add_js(); - $this->assertTrue(isset($js['misc/tableheader.js']), t('tableheader.js was included when $sticky = TRUE.')); - $this->assertRaw('sticky-enabled', t('Table has a class of sticky-enabled when $sticky = TRUE.')); - drupal_static_reset('drupal_add_js'); - } - - /** - * If $sticky is FALSE, no tableheader.js should be included. - */ - function testThemeTableNoStickyHeaders() { - $header = array('one', 'two', 'three'); - $rows = array(array(1,2,3), array(4,5,6), array(7,8,9)); - $attributes = array(); - $caption = NULL; - $colgroups = array(); - $this->content = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => $attributes, 'caption' => $caption, 'colgroups' => $colgroups, 'sticky' => FALSE)); - $js = drupal_add_js(); - $this->assertFalse(isset($js['misc/tableheader.js']), t('tableheader.js was not included because $sticky = FALSE.')); - $this->assertNoRaw('sticky-enabled', t('Table does not have a class of sticky-enabled because $sticky = FALSE.')); - drupal_static_reset('drupal_add_js'); - } - - /** - * Tests that the table header is printed correctly even if there are no rows, - * and that the empty text is displayed correctly. - */ - function testThemeTableWithEmptyMessage() { - $header = array( - t('Header 1'), - array( - 'data' => t('Header 2'), - 'colspan' => 2, - ), - ); - $this->content = theme('table', array('header' => $header, 'rows' => array(), 'empty' => t('No strings available.'))); - $this->assertRaw('<tr class="odd"><td colspan="3" class="empty message">No strings available.</td>', t('Correct colspan was set on empty message.')); - $this->assertRaw('<thead><tr><th>Header 1</th>', t('Table header was printed.')); - } - -} - -/** - * Tests for common theme functions. - */ -class ThemeFunctionsTestCase extends DrupalWebTestCase { - protected $profile = 'testing'; - - public static function getInfo() { - return array( - 'name' => 'Theme functions', - 'description' => 'Tests common theme functions.', - 'group' => 'Theme', - ); - } - - /** - * Tests theme_item_list(). - */ - function testItemList() { - // Verify that empty variables produce no output. - $variables = array(); - $expected = ''; - $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback generates no output.'); - - $variables = array(); - $variables['title'] = 'Some title'; - $expected = ''; - $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback with title generates no output.'); - - // Verify nested item lists. - $variables = array(); - $variables['title'] = 'Some title'; - $variables['attributes'] = array( - 'id' => 'parentlist', - ); - $variables['items'] = array( - 'a', - array( - 'data' => 'b', - 'children' => array( - 'c', - // Nested children may use additional attributes. - array( - 'data' => 'd', - 'class' => array('dee'), - ), - // Any string key is treated as child list attribute. - 'id' => 'childlist', - ), - // Any other keys are treated as item attributes. - 'id' => 'bee', - ), - array( - 'data' => 'e', - 'id' => 'E', - ), - ); - $inner = '<div class="item-list"><ul id="childlist">'; - $inner .= '<li class="odd first">c</li>'; - $inner .= '<li class="dee even last">d</li>'; - $inner .= '</ul></div>'; - - $expected = '<div class="item-list">'; - $expected .= '<h3>Some title</h3>'; - $expected .= '<ul id="parentlist">'; - $expected .= '<li class="odd first">a</li>'; - $expected .= '<li id="bee" class="even">b' . $inner . '</li>'; - $expected .= '<li id="E" class="odd last">e</li>'; - $expected .= '</ul></div>'; - - $this->assertThemeOutput('item_list', $variables, $expected); - } - - /** - * Asserts themed output. - * - * @param $callback - * The name of the theme function to invoke; e.g. 'links' for theme_links(). - * @param $variables - * An array of variables to pass to the theme function. - * @param $expected - * The expected themed output string. - * @param $message - * (optional) An assertion message. - */ - protected function assertThemeOutput($callback, array $variables = array(), $expected, $message = '') { - $output = theme($callback, $variables); - $this->verbose('Variables:' . '<pre>' . check_plain(var_export($variables, TRUE)) . '</pre>' - . '<hr />' . 'Result:' . '<pre>' . check_plain(var_export($output, TRUE)) . '</pre>' - . '<hr />' . 'Expected:' . '<pre>' . check_plain(var_export($expected, TRUE)) . '</pre>' - . '<hr />' . $output - ); - if (!$message) { - $message = '%callback rendered correctly.'; - } - $message = t($message, array('%callback' => 'theme_' . $callback . '()')); - $this->assertIdentical($output, $expected, $message); - } -} - -/** - * Unit tests for theme_links(). - */ -class ThemeLinksTest extends DrupalWebTestCase { - public static function getInfo() { - return array( - 'name' => 'Links', - 'description' => 'Test the theme_links() function and rendering groups of links.', - 'group' => 'Theme', - ); - } - - /** - * Test the use of drupal_pre_render_links() on a nested array of links. - */ - function testDrupalPreRenderLinks() { - // Define the base array to be rendered, containing a variety of different - // kinds of links. - $base_array = array( - '#theme' => 'links', - '#pre_render' => array('drupal_pre_render_links'), - '#links' => array( - 'parent_link' => array( - 'title' => 'Parent link original', - 'href' => 'parent-link-original', - ), - ), - 'first_child' => array( - '#theme' => 'links', - '#links' => array( - // This should be rendered if 'first_child' is rendered separately, - // but ignored if the parent is being rendered (since it duplicates - // one of the parent's links). - 'parent_link' => array( - 'title' => 'Parent link copy', - 'href' => 'parent-link-copy', - ), - // This should always be rendered. - 'first_child_link' => array( - 'title' => 'First child link', - 'href' => 'first-child-link', - ), - ), - ), - // This should always be rendered as part of the parent. - 'second_child' => array( - '#theme' => 'links', - '#links' => array( - 'second_child_link' => array( - 'title' => 'Second child link', - 'href' => 'second-child-link', - ), - ), - ), - // This should never be rendered, since the user does not have access to - // it. - 'third_child' => array( - '#theme' => 'links', - '#links' => array( - 'third_child_link' => array( - 'title' => 'Third child link', - 'href' => 'third-child-link', - ), - ), - '#access' => FALSE, - ), - ); - - // Start with a fresh copy of the base array, and try rendering the entire - // thing. We expect a single <ul> with appropriate links contained within - // it. - $render_array = $base_array; - $html = drupal_render($render_array); - $dom = new DOMDocument(); - $dom->loadHTML($html); - $this->assertEqual($dom->getElementsByTagName('ul')->length, 1, t('One "ul" tag found in the rendered HTML.')); - $list_elements = $dom->getElementsByTagName('li'); - $this->assertEqual($list_elements->length, 3, t('Three "li" tags found in the rendered HTML.')); - $this->assertEqual($list_elements->item(0)->nodeValue, 'Parent link original', t('First expected link found.')); - $this->assertEqual($list_elements->item(1)->nodeValue, 'First child link', t('Second expected link found.')); - $this->assertEqual($list_elements->item(2)->nodeValue, 'Second child link', t('Third expected link found.')); - $this->assertIdentical(strpos($html, 'Parent link copy'), FALSE, t('"Parent link copy" link not found.')); - $this->assertIdentical(strpos($html, 'Third child link'), FALSE, t('"Third child link" link not found.')); - - // Now render 'first_child', followed by the rest of the links, and make - // sure we get two separate <ul>'s with the appropriate links contained - // within each. - $render_array = $base_array; - $child_html = drupal_render($render_array['first_child']); - $parent_html = drupal_render($render_array); - // First check the child HTML. - $dom = new DOMDocument(); - $dom->loadHTML($child_html); - $this->assertEqual($dom->getElementsByTagName('ul')->length, 1, t('One "ul" tag found in the rendered child HTML.')); - $list_elements = $dom->getElementsByTagName('li'); - $this->assertEqual($list_elements->length, 2, t('Two "li" tags found in the rendered child HTML.')); - $this->assertEqual($list_elements->item(0)->nodeValue, 'Parent link copy', t('First expected link found.')); - $this->assertEqual($list_elements->item(1)->nodeValue, 'First child link', t('Second expected link found.')); - // Then check the parent HTML. - $dom = new DOMDocument(); - $dom->loadHTML($parent_html); - $this->assertEqual($dom->getElementsByTagName('ul')->length, 1, t('One "ul" tag found in the rendered parent HTML.')); - $list_elements = $dom->getElementsByTagName('li'); - $this->assertEqual($list_elements->length, 2, t('Two "li" tags found in the rendered parent HTML.')); - $this->assertEqual($list_elements->item(0)->nodeValue, 'Parent link original', t('First expected link found.')); - $this->assertEqual($list_elements->item(1)->nodeValue, 'Second child link', t('Second expected link found.')); - $this->assertIdentical(strpos($parent_html, 'First child link'), FALSE, t('"First child link" link not found.')); - $this->assertIdentical(strpos($parent_html, 'Third child link'), FALSE, t('"Third child link" link not found.')); - } -} - -/** - * Functional test for initialization of the theme system in hook_init(). - */ -class ThemeHookInitUnitTest extends DrupalWebTestCase { - public static function getInfo() { - return array( - 'name' => 'Theme initialization in hook_init()', - 'description' => 'Tests that the theme system can be correctly initialized in hook_init().', - 'group' => 'Theme', - ); - } - - function setUp() { - parent::setUp('theme_test'); - } - - /** - * Test that the theme system can generate output when called by hook_init(). - */ - function testThemeInitializationHookInit() { - $this->drupalGet('theme-test/hook-init'); - $this->assertRaw('Themed output generated in hook_init()', t('Themed output generated in hook_init() correctly appears on the page.')); - $this->assertRaw('bartik/css/style.css', t("The default theme's CSS appears on the page when the theme system is initialized in hook_init().")); - } -} - -/** - * Tests autocompletion not loading registry. - */ -class ThemeFastTestCase extends DrupalWebTestCase { - public static function getInfo() { - return array( - 'name' => 'Theme fast initialization', - 'description' => 'Test that autocompletion does not load the registry.', - 'group' => 'Theme' - ); - } - - function setUp() { - parent::setUp('theme_test'); - $this->account = $this->drupalCreateUser(array('access user profiles')); - } - - /** - * Tests access to user autocompletion and verify the correct results. - */ - function testUserAutocomplete() { - $this->drupalLogin($this->account); - $this->drupalGet('user/autocomplete/' . $this->account->name); - $this->assertText('registry not initialized', t('The registry was not initialized')); - } -} - -/** - * Unit tests for theme_html_tag(). - */ -class ThemeHtmlTag extends DrupalUnitTestCase { - public static function getInfo() { - return array( - 'name' => 'Theme HTML Tag', - 'description' => 'Tests theme_html_tag() built-in theme functions.', - 'group' => 'Theme', - ); - } - - /** - * Test function theme_html_tag() - */ - function testThemeHtmlTag() { - // Test auto-closure meta tag generation - $tag['element'] = array('#tag' => 'meta', '#attributes' => array('name' => 'description', 'content' => 'Drupal test')); - $this->assertEqual('<meta name="description" content="Drupal test" />'."\n", theme_html_tag($tag), t('Test auto-closure meta tag generation.')); - - // Test title tag generation - $tag['element'] = array('#tag' => 'title', '#value' => 'title test'); - $this->assertEqual('<title>title test</title>'."\n", theme_html_tag($tag), t('Test title tag generation.')); - } -} - -/** - * Functional test for attributes of html.tpl.php. - */ -class ThemeHtmlTplPhpAttributesTestCase extends DrupalWebTestCase { - public static function getInfo() { - return array( - 'name' => 'html.tpl.php html and body attributes', - 'description' => 'Tests attributes inserted in the html and body elements of html.tpl.php.', - 'group' => 'Theme', - ); - } - - function setUp() { - parent::setUp('theme_test'); - } - - /** - * Tests that modules and themes can alter variables in html.tpl.php. - */ - function testThemeHtmlTplPhpAttributes() { - $this->drupalGet(''); - $attributes = $this->xpath('/html[@theme_test_html_attribute="theme test html attribute value"]'); - $this->assertTrue(count($attributes) == 1, t('Attribute set in the html element via hook_preprocess_html() found.')); - $attributes = $this->xpath('/html/body[@theme_test_body_attribute="theme test body attribute value"]'); - $this->assertTrue(count($attributes) == 1, t('Attribute set in the body element via hook_preprocess_html() found.')); - } -} |