Wordpress/tests/phpunit/tests/theme.php
John Blackbourn 1271cbd258 Themes: Remove paged.php from the theme template hierarchy.
The position of this template within the hierarchy is of so little use that zero themes in the WordPress.org theme directory make use of it. It's second only to `index.php` in the hierarchy, meaning that any archive template such as `category.php` or `archive.php` will be chosen before it.

Fixes #38162
Props ryankienstra for initial patch


git-svn-id: https://develop.svn.wordpress.org/trunk@38755 602fd350-edb4-49c9-b593-d223f7449a82
2016-10-07 21:02:39 +00:00

299 lines
11 KiB
PHP

<?php
/**
* test wp-includes/theme.php
*
* @group themes
*/
class Tests_Theme extends WP_UnitTestCase {
protected $theme_slug = 'twentyeleven';
protected $theme_name = 'Twenty Eleven';
protected $default_themes = array(
'twentyten', 'twentyeleven', 'twentytwelve', 'twentythirteen',
'twentyfourteen', 'twentyfifteen',
);
function setUp() {
parent::setUp();
add_filter( 'extra_theme_headers', array( $this, '_theme_data_extra_headers' ) );
wp_clean_themes_cache();
unset( $GLOBALS['wp_themes'] );
}
function tearDown() {
remove_filter( 'extra_theme_headers', array( $this, '_theme_data_extra_headers' ) );
wp_clean_themes_cache();
unset( $GLOBALS['wp_themes'] );
parent::tearDown();
}
function test_wp_get_themes_default() {
$themes = wp_get_themes();
$this->assertInstanceOf( 'WP_Theme', $themes[ $this->theme_slug ] );
$this->assertEquals( $this->theme_name, $themes[ $this->theme_slug ]->get('Name') );
$single_theme = wp_get_theme( $this->theme_slug );
$this->assertEquals( $single_theme->get('Name'), $themes[ $this->theme_slug ]->get('Name') );
$this->assertEquals( $themes[ $this->theme_slug ], $single_theme );
}
/**
* @expectedDeprecated get_theme
* @expectedDeprecated get_themes
*/
function test_get_themes_default() {
$themes = get_themes();
$this->assertInstanceOf( 'WP_Theme', $themes[ $this->theme_name ] );
$this->assertEquals( $themes[ $this->theme_name ], get_theme( $this->theme_name ) );
$this->assertEquals( $this->theme_name, $themes[ $this->theme_name ]['Name'] );
$this->assertEquals( $this->theme_name, $themes[ $this->theme_name ]->Name );
$this->assertEquals( $this->theme_name, $themes[ $this->theme_name ]->name );
}
/**
* @expectedDeprecated get_theme
* @expectedDeprecated get_themes
*/
function test_get_theme() {
$themes = get_themes();
foreach (array_keys($themes) as $name) {
$theme = get_theme($name);
// WP_Theme implements ArrayAccess. Even ArrayObject returns false for is_array().
$this->assertFalse( is_array( $theme ) );
$this->assertInstanceOf( 'WP_Theme', $theme );
$this->assertEquals($theme, $themes[$name]);
}
}
function test_wp_get_theme() {
$themes = wp_get_themes();
foreach ( $themes as $theme ) {
$this->assertInstanceOf( 'WP_Theme', $theme );
$this->assertFalse( $theme->errors() );
$_theme = wp_get_theme( $theme->get_stylesheet() );
// This primes internal WP_Theme caches for the next assertion (headers_sanitized, textdomain_loaded)
$this->assertEquals( $theme->get('Name'), $_theme->get('Name') );
$this->assertEquals( $theme, $_theme );
}
}
/**
* @expectedDeprecated get_themes
*/
function test_get_themes_contents() {
$themes = get_themes();
// Generic tests that should hold true for any theme
foreach ( $themes as $k => $theme ) {
// Don't run these checks for custom themes.
if ( empty( $theme['Author'] ) || false === strpos( $theme['Author'], 'WordPress' ) ) {
continue;
}
$this->assertEquals( $theme['Name'], $k );
$this->assertNotEmpty( $theme['Title'] );
// important attributes should all be set
$default_headers = array(
'Title' => 'Theme Title',
'Version' => 'Version',
'Parent Theme' => 'Parent Theme',
'Template Dir' => 'Template Dir',
'Stylesheet Dir' => 'Stylesheet Dir',
'Template' => 'Template',
'Stylesheet' => 'Stylesheet',
'Screenshot' => 'Screenshot',
'Description' => 'Description',
'Author' => 'Author',
'Tags' => 'Tags',
// Introduced in WordPress 2.9
'Theme Root' => 'Theme Root',
'Theme Root URI' => 'Theme Root URI'
);
foreach ($default_headers as $name => $value) {
$this->assertTrue(isset($theme[$name]));
}
// Make the tests work both for WordPress 2.8.5 and WordPress 2.9-rare
$dir = isset($theme['Theme Root']) ? '' : WP_CONTENT_DIR;
// important attributes should all not be empty as well
$this->assertNotEmpty( $theme['Description'] );
$this->assertNotEmpty( $theme['Author'] );
$this->assertTrue(version_compare($theme['Version'], 0) > 0);
$this->assertNotEmpty( $theme['Template'] );
$this->assertNotEmpty( $theme['Stylesheet'] );
// template files should all exist
$this->assertTrue(is_array($theme['Template Files']));
$this->assertTrue(count($theme['Template Files']) > 0);
foreach ($theme['Template Files'] as $file) {
$this->assertTrue(is_file($dir . $file));
$this->assertTrue(is_readable($dir . $file));
}
// css files should all exist
$this->assertTrue(is_array($theme['Stylesheet Files']));
$this->assertTrue(count($theme['Stylesheet Files']) > 0);
foreach ($theme['Stylesheet Files'] as $file) {
$this->assertTrue(is_file($dir . $file));
$this->assertTrue(is_readable($dir . $file));
}
$this->assertTrue(is_dir($dir . $theme['Template Dir']));
$this->assertTrue(is_dir($dir . $theme['Stylesheet Dir']));
$this->assertEquals('publish', $theme['Status']);
$this->assertTrue(is_file($dir . $theme['Stylesheet Dir'] . '/' . $theme['Screenshot']));
$this->assertTrue(is_readable($dir . $theme['Stylesheet Dir'] . '/' . $theme['Screenshot']));
}
}
function test_wp_get_theme_contents() {
$theme = wp_get_theme( $this->theme_slug );
$this->assertEquals( $this->theme_name, $theme->get( 'Name' ) );
$this->assertNotEmpty( $theme->get( 'Description' ) );
$this->assertNotEmpty( $theme->get( 'Author' ) );
$this->assertNotEmpty( $theme->get( 'Version' ) );
$this->assertNotEmpty( $theme->get( 'AuthorURI' ) );
$this->assertNotEmpty( $theme->get( 'ThemeURI' ) );
$this->assertEquals( $this->theme_slug, $theme->get_stylesheet() );
$this->assertEquals( $this->theme_slug, $theme->get_template() );
$this->assertEquals('publish', $theme->get( 'Status' ) );
$this->assertEquals( WP_CONTENT_DIR . '/themes/' . $this->theme_slug, $theme->get_stylesheet_directory(), 'get_stylesheet_directory' );
$this->assertEquals( WP_CONTENT_DIR . '/themes/' . $this->theme_slug, $theme->get_template_directory(), 'get_template_directory' );
$this->assertEquals( content_url( 'themes/' . $this->theme_slug ), $theme->get_stylesheet_directory_uri(), 'get_stylesheet_directory_uri' );
$this->assertEquals( content_url( 'themes/' . $this->theme_slug ), $theme->get_template_directory_uri(), 'get_template_directory_uri' );
}
/**
* Make sure we update the default theme list to include the latest default theme.
*
* @ticket 29925
*/
function test_default_theme_in_default_theme_list() {
$this->markTestSkipped( 'Core repository inclusion was stopped after Twenty Fifteen' );
if ( 'twenty' === substr( WP_DEFAULT_THEME, 0, 6 ) ) {
$this->assertContains( WP_DEFAULT_THEME, $this->default_themes );
}
}
function test_default_themes_have_textdomain() {
foreach ( $this->default_themes as $theme ) {
$this->assertEquals( $theme, wp_get_theme( $theme )->get( 'TextDomain' ) );
}
}
/**
* @ticket 20897
* @expectedDeprecated get_theme_data
*/
function test_extra_theme_headers() {
$wp_theme = wp_get_theme( $this->theme_slug );
$this->assertNotEmpty( $wp_theme->get('License') );
$path_to_style_css = $wp_theme->get_theme_root() . '/' . $wp_theme->get_stylesheet() . '/style.css';
$this->assertTrue( file_exists( $path_to_style_css ) );
$theme_data = get_theme_data( $path_to_style_css );
$this->assertArrayHasKey( 'License', $theme_data );
$this->assertArrayNotHasKey( 'Not a Valid Key', $theme_data );
$this->assertNotEmpty( $theme_data['License'] );
$this->assertSame( $theme_data['License'], $wp_theme->get('License') );
}
function _theme_data_extra_headers() {
return array( 'License' );
}
/**
* @expectedDeprecated get_themes
* @expectedDeprecated get_current_theme
*/
function test_switch_theme() {
$themes = get_themes();
// Switch to each theme in sequence.
// Do it twice to make sure we switch to the first theme, even if it's our starting theme.
// Do it a third time to ensure switch_theme() works with one argument.
for ( $i = 0; $i < 3; $i++ ) {
foreach ( $themes as $name => $theme ) {
// switch to this theme
if ( $i === 2 )
switch_theme( $theme['Template'], $theme['Stylesheet'] );
else
switch_theme( $theme['Stylesheet'] );
$this->assertEquals($name, get_current_theme());
// make sure the various get_* functions return the correct values
$this->assertEquals($theme['Template'], get_template());
$this->assertEquals($theme['Stylesheet'], get_stylesheet());
$root_fs = get_theme_root();
$this->assertTrue(is_dir($root_fs));
$root_uri = get_theme_root_uri();
$this->assertTrue(!empty($root_uri));
$this->assertEquals($root_fs . '/' . get_stylesheet(), get_stylesheet_directory());
$this->assertEquals($root_uri . '/' . get_stylesheet(), get_stylesheet_directory_uri());
$this->assertEquals($root_uri . '/' . get_stylesheet() . '/style.css', get_stylesheet_uri());
# $this->assertEquals($root_uri . '/' . get_stylesheet(), get_locale_stylesheet_uri());
$this->assertEquals($root_fs . '/' . get_template(), get_template_directory());
$this->assertEquals($root_uri . '/' . get_template(), get_template_directory_uri());
//get_query_template
// template file that doesn't exist
$this->assertEquals('', get_query_template(rand_str()));
// template files that do exist
//foreach ($theme['Template Files'] as $path) {
//$file = basename($path, '.php');
// FIXME: untestable because get_query_template uses TEMPLATEPATH
//$this->assertEquals('', get_query_template($file));
//}
// these are kind of tautologies but at least exercise the code
$this->assertEquals(get_404_template(), get_query_template('404'));
$this->assertEquals(get_archive_template(), get_query_template('archive'));
$this->assertEquals(get_author_template(), get_query_template('author'));
$this->assertEquals(get_category_template(), get_query_template('category'));
$this->assertEquals(get_date_template(), get_query_template('date'));
$this->assertEquals(get_home_template(), get_query_template('home', array('home.php','index.php')));
$this->assertEquals(get_page_template(), get_query_template('page'));
$this->assertEquals(get_search_template(), get_query_template('search'));
$this->assertEquals(get_single_template(), get_query_template('single'));
$this->assertEquals(get_attachment_template(), get_query_template('attachment'));
$this->assertEquals(get_tag_template(), get_query_template('tag'));
// nb: this probably doesn't run because WP_INSTALLING is defined
$this->assertTrue(validate_current_theme());
}
}
}
function test_switch_theme_bogus() {
// try switching to a theme that doesn't exist
$template = rand_str();
$style = rand_str();
update_option('template', $template);
update_option('stylesheet', $style);
$theme = wp_get_theme();
$this->assertEquals( $style, (string) $theme );
$this->assertNotSame( false, $theme->errors() );
$this->assertFalse( $theme->exists() );
// these return the bogus name - perhaps not ideal behaviour?
$this->assertEquals($template, get_template());
$this->assertEquals($style, get_stylesheet());
}
}