164b22cf6a
This ensures that not only the return values match the expected results, but also that their type is the same. Going forward, stricter type checking by using `assertSame()` should generally be preferred to `assertEquals()` where appropriate, to make the tests more reliable. Props johnbillion, jrf, SergeyBiryukov. See #38266. git-svn-id: https://develop.svn.wordpress.org/trunk@48937 602fd350-edb4-49c9-b593-d223f7449a82
298 lines
10 KiB
PHP
298 lines
10 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Test functions that fetch stuff from the theme directory
|
|
*
|
|
* @group themes
|
|
*/
|
|
class Tests_Theme_ThemeDir extends WP_UnitTestCase {
|
|
|
|
function setUp() {
|
|
parent::setUp();
|
|
$this->theme_root = DIR_TESTDATA . '/themedir1';
|
|
|
|
$this->orig_theme_dir = $GLOBALS['wp_theme_directories'];
|
|
|
|
// /themes is necessary as theme.php functions assume /themes is the root if there is only one root.
|
|
$GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root );
|
|
|
|
add_filter( 'theme_root', array( $this, '_theme_root' ) );
|
|
add_filter( 'stylesheet_root', array( $this, '_theme_root' ) );
|
|
add_filter( 'template_root', array( $this, '_theme_root' ) );
|
|
// Clear caches.
|
|
wp_clean_themes_cache();
|
|
unset( $GLOBALS['wp_themes'] );
|
|
}
|
|
|
|
function tearDown() {
|
|
$GLOBALS['wp_theme_directories'] = $this->orig_theme_dir;
|
|
remove_filter( 'theme_root', array( $this, '_theme_root' ) );
|
|
remove_filter( 'stylesheet_root', array( $this, '_theme_root' ) );
|
|
remove_filter( 'template_root', array( $this, '_theme_root' ) );
|
|
wp_clean_themes_cache();
|
|
unset( $GLOBALS['wp_themes'] );
|
|
parent::tearDown();
|
|
}
|
|
|
|
// Replace the normal theme root directory with our premade test directory.
|
|
function _theme_root( $dir ) {
|
|
return $this->theme_root;
|
|
}
|
|
|
|
/**
|
|
* @expectedDeprecated get_theme
|
|
* @expectedDeprecated get_themes
|
|
*/
|
|
function test_theme_default() {
|
|
$themes = get_themes();
|
|
$theme = get_theme( 'WordPress Default' );
|
|
$this->assertSame( $themes['WordPress Default'], $theme );
|
|
|
|
$this->assertFalse( empty( $theme ) );
|
|
|
|
// echo gen_tests_array( 'theme', $theme );
|
|
|
|
$this->assertSame( 'WordPress Default', $theme['Name'] );
|
|
$this->assertSame( 'WordPress Default', $theme['Title'] );
|
|
$this->assertSame( 'The default WordPress theme based on the famous <a href="http://binarybonsai.com/kubrick/">Kubrick</a>.', $theme['Description'] );
|
|
$this->assertSame( '<a href="http://binarybonsai.com/">Michael Heilemann</a>', $theme['Author'] );
|
|
$this->assertSame( '1.6', $theme['Version'] );
|
|
$this->assertSame( 'default', $theme['Template'] );
|
|
$this->assertSame( 'default', $theme['Stylesheet'] );
|
|
|
|
$this->assertContains( $this->theme_root . '/default/functions.php', $theme['Template Files'] );
|
|
$this->assertContains( $this->theme_root . '/default/index.php', $theme['Template Files'] );
|
|
$this->assertContains( $this->theme_root . '/default/style.css', $theme['Stylesheet Files'] );
|
|
|
|
$this->assertSame( $this->theme_root . '/default', $theme['Template Dir'] );
|
|
$this->assertSame( $this->theme_root . '/default', $theme['Stylesheet Dir'] );
|
|
$this->assertSame( 'publish', $theme['Status'] );
|
|
$this->assertSame( '', $theme['Parent Theme'] );
|
|
}
|
|
|
|
/**
|
|
* @expectedDeprecated get_theme
|
|
* @expectedDeprecated get_themes
|
|
*/
|
|
function test_theme_sandbox() {
|
|
$theme = get_theme( 'Sandbox' );
|
|
|
|
$this->assertFalse( empty( $theme ) );
|
|
|
|
// echo gen_tests_array( 'theme', $theme );
|
|
|
|
$this->assertSame( 'Sandbox', $theme['Name'] );
|
|
$this->assertSame( 'Sandbox', $theme['Title'] );
|
|
$this->assertSame( 'A theme with powerful, semantic CSS selectors and the ability to add new skins.', $theme['Description'] );
|
|
$this->assertSame( '<a href="http://andy.wordpress.com/">Andy Skelton</a> & <a href="http://www.plaintxt.org/">Scott Allan Wallick</a>', $theme['Author'] );
|
|
$this->assertSame( '0.6.1-wpcom', $theme['Version'] );
|
|
$this->assertSame( 'sandbox', $theme['Template'] );
|
|
$this->assertSame( 'sandbox', $theme['Stylesheet'] );
|
|
|
|
$template_files = $theme['Template Files'];
|
|
|
|
$this->assertSame( $this->theme_root . '/sandbox/functions.php', reset( $template_files ) );
|
|
$this->assertSame( $this->theme_root . '/sandbox/index.php', next( $template_files ) );
|
|
|
|
$stylesheet_files = $theme['Stylesheet Files'];
|
|
|
|
$this->assertSame( $this->theme_root . '/sandbox/style.css', reset( $stylesheet_files ) );
|
|
|
|
$this->assertSame( $this->theme_root . '/sandbox', $theme['Template Dir'] );
|
|
$this->assertSame( $this->theme_root . '/sandbox', $theme['Stylesheet Dir'] );
|
|
$this->assertSame( 'publish', $theme['Status'] );
|
|
$this->assertSame( '', $theme['Parent Theme'] );
|
|
|
|
}
|
|
|
|
/**
|
|
* A CSS-only theme
|
|
*
|
|
* @expectedDeprecated get_themes
|
|
*/
|
|
function test_theme_stylesheet_only() {
|
|
$themes = get_themes();
|
|
|
|
$theme = $themes['Stylesheet Only'];
|
|
$this->assertFalse( empty( $theme ) );
|
|
|
|
// echo gen_tests_array( 'theme', $theme );
|
|
|
|
$this->assertSame( 'Stylesheet Only', $theme['Name'] );
|
|
$this->assertSame( 'Stylesheet Only', $theme['Title'] );
|
|
$this->assertSame( 'A three-column widget-ready theme in dark blue.', $theme['Description'] );
|
|
$this->assertSame( '<a href="http://www.example.com/">Henry Crun</a>', $theme['Author'] );
|
|
$this->assertSame( '1.0', $theme['Version'] );
|
|
$this->assertSame( 'sandbox', $theme['Template'] );
|
|
$this->assertSame( 'stylesheetonly', $theme['Stylesheet'] );
|
|
$this->assertContains( $this->theme_root . '/sandbox/functions.php', $theme['Template Files'] );
|
|
$this->assertContains( $this->theme_root . '/sandbox/index.php', $theme['Template Files'] );
|
|
|
|
$this->assertContains( $this->theme_root . '/stylesheetonly/style.css', $theme['Stylesheet Files'] );
|
|
|
|
$this->assertSame( $this->theme_root . '/sandbox', $theme['Template Dir'] );
|
|
$this->assertSame( $this->theme_root . '/stylesheetonly', $theme['Stylesheet Dir'] );
|
|
$this->assertSame( 'publish', $theme['Status'] );
|
|
$this->assertSame( 'Sandbox', $theme['Parent Theme'] );
|
|
|
|
}
|
|
|
|
/**
|
|
* @expectedDeprecated get_themes
|
|
*/
|
|
function test_theme_list() {
|
|
$themes = get_themes();
|
|
|
|
// Ignore themes in the default /themes directory.
|
|
foreach ( $themes as $theme_name => $theme ) {
|
|
if ( $theme->get_theme_root() !== $this->theme_root ) {
|
|
unset( $themes[ $theme_name ] );
|
|
}
|
|
}
|
|
|
|
$theme_names = array_keys( $themes );
|
|
$expected = array(
|
|
'WordPress Default',
|
|
'Sandbox',
|
|
'Stylesheet Only',
|
|
'My Theme',
|
|
'My Theme/theme1', // Duplicate theme should be given a unique name.
|
|
'My Subdir Theme', // Theme in a subdirectory should work.
|
|
'Page Template Child Theme', // Theme which inherits page templates.
|
|
'Page Template Theme', // Theme with page templates for other test code.
|
|
'Theme with Spaces in the Directory',
|
|
'Internationalized Theme',
|
|
'camelCase',
|
|
'REST Theme',
|
|
);
|
|
|
|
sort( $theme_names );
|
|
sort( $expected );
|
|
|
|
$this->assertSame( $expected, $theme_names );
|
|
}
|
|
|
|
/**
|
|
* @expectedDeprecated get_themes
|
|
* @expectedDeprecated get_broken_themes
|
|
*/
|
|
function test_broken_themes() {
|
|
$themes = get_themes();
|
|
|
|
$expected = array(
|
|
'broken-theme' => array(
|
|
'Name' => 'broken-theme',
|
|
'Title' => 'broken-theme',
|
|
'Description' => __( 'Stylesheet is missing.' ),
|
|
),
|
|
'Child and Parent Theme' => array(
|
|
'Name' => 'Child and Parent Theme',
|
|
'Title' => 'Child and Parent Theme',
|
|
'Description' => sprintf( __( 'The theme defines itself as its parent theme. Please check the %s header.' ), '<code>Template</code>' ),
|
|
),
|
|
);
|
|
|
|
$this->assertSame( $expected, get_broken_themes() );
|
|
}
|
|
|
|
function test_wp_get_theme_with_non_default_theme_root() {
|
|
$this->assertFalse( wp_get_theme( 'sandbox', $this->theme_root )->errors() );
|
|
$this->assertFalse( wp_get_theme( 'sandbox' )->errors() );
|
|
}
|
|
|
|
/**
|
|
* @expectedDeprecated get_themes
|
|
*/
|
|
function test_page_templates() {
|
|
$themes = get_themes();
|
|
|
|
$theme = $themes['Page Template Theme'];
|
|
$this->assertFalse( empty( $theme ) );
|
|
|
|
$templates = $theme['Template Files'];
|
|
$this->assertTrue( in_array( $this->theme_root . '/page-templates/template-top-level.php', $templates, true ) );
|
|
}
|
|
|
|
/**
|
|
* @expectedDeprecated get_theme_data
|
|
*/
|
|
function test_get_theme_data_top_level() {
|
|
$theme_data = get_theme_data( DIR_TESTDATA . '/themedir1/theme1/style.css' );
|
|
|
|
$this->assertSame( 'My Theme', $theme_data['Name'] );
|
|
$this->assertSame( 'http://example.org/', $theme_data['URI'] );
|
|
$this->assertSame( 'An example theme', $theme_data['Description'] );
|
|
$this->assertSame( '<a href="http://example.com/">Minnie Bannister</a>', $theme_data['Author'] );
|
|
$this->assertSame( 'http://example.com/', $theme_data['AuthorURI'] );
|
|
$this->assertSame( '1.3', $theme_data['Version'] );
|
|
$this->assertSame( '', $theme_data['Template'] );
|
|
$this->assertSame( 'publish', $theme_data['Status'] );
|
|
$this->assertSame( array(), $theme_data['Tags'] );
|
|
$this->assertSame( 'My Theme', $theme_data['Title'] );
|
|
$this->assertSame( 'Minnie Bannister', $theme_data['AuthorName'] );
|
|
}
|
|
|
|
/**
|
|
* @expectedDeprecated get_theme_data
|
|
*/
|
|
function test_get_theme_data_subdir() {
|
|
$theme_data = get_theme_data( $this->theme_root . '/subdir/theme2/style.css' );
|
|
|
|
$this->assertSame( 'My Subdir Theme', $theme_data['Name'] );
|
|
$this->assertSame( 'http://example.org/', $theme_data['URI'] );
|
|
$this->assertSame( 'An example theme in a sub directory', $theme_data['Description'] );
|
|
$this->assertSame( '<a href="http://wordpress.org/">Mr. WordPress</a>', $theme_data['Author'] );
|
|
$this->assertSame( 'http://wordpress.org/', $theme_data['AuthorURI'] );
|
|
$this->assertSame( '0.1', $theme_data['Version'] );
|
|
$this->assertSame( '', $theme_data['Template'] );
|
|
$this->assertSame( 'publish', $theme_data['Status'] );
|
|
$this->assertSame( array(), $theme_data['Tags'] );
|
|
$this->assertSame( 'My Subdir Theme', $theme_data['Title'] );
|
|
$this->assertSame( 'Mr. WordPress', $theme_data['AuthorName'] );
|
|
}
|
|
|
|
/**
|
|
* @ticket 28662
|
|
*/
|
|
function test_theme_dir_slashes() {
|
|
$size = count( $GLOBALS['wp_theme_directories'] );
|
|
|
|
@mkdir( WP_CONTENT_DIR . '/themes/foo' );
|
|
@mkdir( WP_CONTENT_DIR . '/themes/foo-themes' );
|
|
|
|
$this->assertFileExists( WP_CONTENT_DIR . '/themes/foo' );
|
|
$this->assertFileExists( WP_CONTENT_DIR . '/themes/foo-themes' );
|
|
|
|
register_theme_directory( '/' );
|
|
|
|
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
|
|
|
|
register_theme_directory( 'themes/' );
|
|
|
|
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
|
|
|
|
register_theme_directory( '/foo/' );
|
|
|
|
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
|
|
|
|
register_theme_directory( 'foo/' );
|
|
|
|
$this->assertCount( $size, $GLOBALS['wp_theme_directories'] );
|
|
|
|
register_theme_directory( 'themes/foo/' );
|
|
|
|
$this->assertCount( $size + 1, $GLOBALS['wp_theme_directories'] );
|
|
|
|
register_theme_directory( WP_CONTENT_DIR . '/foo-themes/' );
|
|
|
|
$this->assertCount( $size + 1, $GLOBALS['wp_theme_directories'] );
|
|
|
|
foreach ( $GLOBALS['wp_theme_directories'] as $dir ) {
|
|
$this->assertNotEquals( '/', substr( $dir, -1 ) );
|
|
}
|
|
|
|
rmdir( WP_CONTENT_DIR . '/themes/foo' );
|
|
rmdir( WP_CONTENT_DIR . '/themes/foo-themes' );
|
|
}
|
|
}
|