You are here

theme.test in SimpleTest 7

Tests for the theme API.

File

tests/theme.test
View source
<?php

/**
 * @file
 * Tests for the theme API.
 */

/**
 * Unit tests for the Theme API.
 */
class TemplateUnitTest extends DrupalWebTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Theme API',
      'description' => 'Test low-level theme template functions.',
      'group' => 'Theme',
    );
  }

  /**
   * Test function template_page_suggestions() for SA-CORE-2009-003.
   */
  function testTemplateSuggestions() {

    // 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 = template_page_suggestions($args, 'page');
    $this
      ->assertEqual($suggestions, array(
      'page-node',
      'page-node-%',
      'page-node-1',
      'page-node-edit',
    ), t('Found expected node edit page template suggestions'));

    // Check attack vectors.
    $args = array(
      'node',
      '\\1',
    );
    $suggestions = template_page_suggestions($args, 'page');
    $this
      ->assertEqual($suggestions, array(
      'page-node',
      'page-node-%',
      'page-node-1',
    ), t('Removed invalid \\ from template suggestions'));
    $args = array(
      'node',
      '1/',
    );
    $suggestions = template_page_suggestions($args, 'page');
    $this
      ->assertEqual($suggestions, array(
      'page-node',
      'page-node-%',
      'page-node-1',
    ), t('Removed invalid / from template suggestions'));
    $args = array(
      'node',
      "1\0",
    );
    $suggestions = template_page_suggestions($args, 'page');
    $this
      ->assertEqual($suggestions, array(
      'page-node',
      'page-node-%',
      'page-node-1',
    ), t('Removed invalid \\0 from template suggestions'));

    // Tests for drupal_discover_template()
    $suggestions = array(
      'page',
    );
    $this
      ->assertEqual(drupal_discover_template(array(
      'themes/garland',
    ), $suggestions), 'themes/garland/page.tpl.php', t('Safe template discovered'));
    $suggestions = array(
      'page',
    );
    $this
      ->assertEqual(drupal_discover_template(array(
      'themes/garland',
    ), $suggestions, '\\.tpl.php'), 'themes/garland/page.tpl.php', t('Unsafe extension fixed'));
    $suggestions = array(
      'page\\',
    );
    $this
      ->assertEqual(drupal_discover_template(array(
      'themes/garland',
    ), $suggestions), 'themes/garland/page.tpl.php', t('Unsafe template suggestion fixed'));
    $suggestions = array(
      'page/',
    );
    $this
      ->assertEqual(drupal_discover_template(array(
      'themes/garland',
    ), $suggestions), 'themes/garland/page.tpl.php', t('Unsafe template suggestion fixed'));
    $suggestions = array(
      "page\0",
    );
    $this
      ->assertEqual(drupal_discover_template(array(
      'themes/garland',
    ), $suggestions), 'themes/garland/page.tpl.php', t('Unsafe template suggestion fixed'));
  }

}

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

}

Classes

Namesort descending Description
TemplateUnitTest Unit tests for the Theme API.
ThemeTableUnitTest Unit tests for theme_table().